aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstevendegroote <stevendegroote@gmail.com>2019-09-17 23:15:54 +0200
committerstevendegroote <stevendegroote@gmail.com>2019-09-17 23:15:54 +0200
commitf8967fec78d826ea8d9ca34f65966ff8a7674b47 (patch)
treef9c5f408e7764ec6343e084e7fc6d62d07e3400f
parentce93b224107a65b43253c36812b636321eb55a78 (diff)
parent4db585a4cb2e5359074a82ef088574609155294b (diff)
downloadforums-f8967fec78d826ea8d9ca34f65966ff8a7674b47.tar
forums-f8967fec78d826ea8d9ca34f65966ff8a7674b47.tar.gz
forums-f8967fec78d826ea8d9ca34f65966ff8a7674b47.tar.bz2
forums-f8967fec78d826ea8d9ca34f65966ff8a7674b47.tar.xz
forums-f8967fec78d826ea8d9ca34f65966ff8a7674b47.zip
Merge branch '3.2.x' into ticket/16159
-rw-r--r--.appveyor.yml145
-rw-r--r--.github/PULL_REQUEST_TEMPLATE.md6
-rw-r--r--.travis.yml10
-rw-r--r--LICENSE281
-rw-r--r--README.md10
-rw-r--r--build/build.xml6
-rw-r--r--build/build_helper.php6
-rwxr-xr-xbuild/package.php16
-rwxr-xr-xcomposer.pharbin1585196 -> 1914314 bytes
-rwxr-xr-xgit-tools/hooks/commit-msg9
-rw-r--r--phpBB/adm/style/acp_attachments.html123
-rw-r--r--phpBB/adm/style/acp_database.html8
-rw-r--r--phpBB/adm/style/acp_ext_list.html2
-rw-r--r--phpBB/adm/style/acp_groups.html2
-rw-r--r--phpBB/adm/style/acp_language.html2
-rw-r--r--phpBB/adm/style/acp_main.html10
-rw-r--r--phpBB/adm/style/acp_profile.html2
-rw-r--r--phpBB/adm/style/acp_prune_forums.html4
-rw-r--r--phpBB/adm/style/acp_styles.html8
-rw-r--r--phpBB/adm/style/acp_users_prefs.html2
-rw-r--r--phpBB/adm/style/admin.css14
-rw-r--r--phpBB/adm/style/installer_footer.html4
-rw-r--r--phpBB/adm/style/installer_form.html7
-rw-r--r--phpBB/adm/style/permission_mask.html2
-rw-r--r--phpBB/adm/style/tooltip.js15
-rw-r--r--phpBB/assets/javascript/core.js26
-rw-r--r--phpBB/assets/javascript/jquery.min.js9
-rw-r--r--phpBB/assets/javascript/plupload.js6
-rw-r--r--phpBB/assets/plupload/plupload.full.min.js18
-rwxr-xr-xphpBB/bin/phpbbcli.php5
-rw-r--r--phpBB/composer.json8
-rw-r--r--phpBB/composer.lock565
-rw-r--r--phpBB/config/default/container/services.yml6
-rw-r--r--phpBB/config/default/container/services_avatar.yml1
-rw-r--r--phpBB/config/default/container/services_console.yml3
-rw-r--r--phpBB/config/default/container/services_content.yml1
-rw-r--r--phpBB/config/default/container/services_feed.yml9
-rw-r--r--phpBB/config/default/container/services_text_formatter.yml6
-rw-r--r--phpBB/config/installer/container/services_install_obtain_data.yml7
-rw-r--r--phpBB/develop/add_permissions.php4
-rw-r--r--phpBB/develop/check_flash_bbcodes.php2
-rw-r--r--phpBB/develop/create_variable_overview.php4
-rw-r--r--phpBB/develop/regex_idn.php2
-rw-r--r--phpBB/develop/search_fill.php2
-rw-r--r--phpBB/docs/CHANGELOG.html612
-rw-r--r--phpBB/docs/CREDITS.txt16
-rw-r--r--phpBB/docs/INSTALL.html13
-rw-r--r--phpBB/docs/README.html4
-rw-r--r--phpBB/docs/coding-guidelines.html8
-rw-r--r--phpBB/docs/events.md837
-rw-r--r--phpBB/docs/nginx.sample.conf10
-rw-r--r--phpBB/docs/sphinx.sample.conf4
-rw-r--r--phpBB/download/file.php4
-rw-r--r--phpBB/includes/acp/acp_attachments.php183
-rw-r--r--phpBB/includes/acp/acp_bbcodes.php46
-rw-r--r--phpBB/includes/acp/acp_board.php27
-rw-r--r--phpBB/includes/acp/acp_bots.php14
-rw-r--r--phpBB/includes/acp/acp_database.php224
-rw-r--r--phpBB/includes/acp/acp_email.php14
-rw-r--r--phpBB/includes/acp/acp_extensions.php8
-rw-r--r--phpBB/includes/acp/acp_forums.php73
-rw-r--r--phpBB/includes/acp/acp_groups.php30
-rw-r--r--phpBB/includes/acp/acp_help_phpbb.php2
-rw-r--r--phpBB/includes/acp/acp_icons.php16
-rw-r--r--phpBB/includes/acp/acp_inactive.php6
-rw-r--r--phpBB/includes/acp/acp_language.php19
-rw-r--r--phpBB/includes/acp/acp_logs.php6
-rw-r--r--phpBB/includes/acp/acp_main.php3
-rw-r--r--phpBB/includes/acp/acp_modules.php8
-rw-r--r--phpBB/includes/acp/acp_permission_roles.php4
-rw-r--r--phpBB/includes/acp/acp_permissions.php84
-rw-r--r--phpBB/includes/acp/acp_profile.php81
-rw-r--r--phpBB/includes/acp/acp_prune.php52
-rw-r--r--phpBB/includes/acp/acp_reasons.php6
-rw-r--r--phpBB/includes/acp/acp_search.php12
-rw-r--r--phpBB/includes/acp/acp_styles.php60
-rw-r--r--phpBB/includes/acp/acp_update.php16
-rw-r--r--phpBB/includes/acp/acp_users.php76
-rw-r--r--phpBB/includes/acp/auth.php40
-rw-r--r--phpBB/includes/bbcode.php17
-rw-r--r--phpBB/includes/compatibility_globals.php5
-rw-r--r--phpBB/includes/constants.php2
-rw-r--r--phpBB/includes/diff/diff.php102
-rw-r--r--phpBB/includes/diff/engine.php10
-rw-r--r--phpBB/includes/diff/renderer.php26
-rw-r--r--phpBB/includes/functions.php286
-rw-r--r--phpBB/includes/functions_acp.php22
-rw-r--r--phpBB/includes/functions_admin.php108
-rw-r--r--phpBB/includes/functions_compatibility.php2
-rw-r--r--phpBB/includes/functions_compress.php10
-rw-r--r--phpBB/includes/functions_content.php72
-rw-r--r--phpBB/includes/functions_convert.php52
-rw-r--r--phpBB/includes/functions_display.php19
-rw-r--r--phpBB/includes/functions_download.php12
-rw-r--r--phpBB/includes/functions_jabber.php16
-rw-r--r--phpBB/includes/functions_mcp.php34
-rw-r--r--phpBB/includes/functions_messenger.php190
-rw-r--r--phpBB/includes/functions_module.php8
-rw-r--r--phpBB/includes/functions_posting.php150
-rw-r--r--phpBB/includes/functions_privmsgs.php125
-rw-r--r--phpBB/includes/functions_transfer.php10
-rw-r--r--phpBB/includes/functions_user.php214
-rw-r--r--phpBB/includes/hooks/index.php2
-rw-r--r--phpBB/includes/mcp/mcp_ban.php9
-rw-r--r--phpBB/includes/mcp/mcp_forum.php20
-rw-r--r--phpBB/includes/mcp/mcp_front.php5
-rw-r--r--phpBB/includes/mcp/mcp_logs.php8
-rw-r--r--phpBB/includes/mcp/mcp_main.php190
-rw-r--r--phpBB/includes/mcp/mcp_notes.php4
-rw-r--r--phpBB/includes/mcp/mcp_pm_reports.php14
-rw-r--r--phpBB/includes/mcp/mcp_post.php15
-rw-r--r--phpBB/includes/mcp/mcp_queue.php119
-rw-r--r--phpBB/includes/mcp/mcp_reports.php74
-rw-r--r--phpBB/includes/mcp/mcp_topic.php62
-rw-r--r--phpBB/includes/mcp/mcp_warn.php4
-rw-r--r--phpBB/includes/message_parser.php62
-rw-r--r--phpBB/includes/questionnaire/questionnaire.php7
-rw-r--r--phpBB/includes/sphinxapi.php44
-rw-r--r--phpBB/includes/ucp/ucp_activate.php2
-rw-r--r--phpBB/includes/ucp/ucp_attachments.php38
-rw-r--r--phpBB/includes/ucp/ucp_auth_link.php4
-rw-r--r--phpBB/includes/ucp/ucp_groups.php44
-rw-r--r--phpBB/includes/ucp/ucp_login_link.php23
-rw-r--r--phpBB/includes/ucp/ucp_main.php92
-rw-r--r--phpBB/includes/ucp/ucp_notifications.php2
-rw-r--r--phpBB/includes/ucp/ucp_pm.php37
-rw-r--r--phpBB/includes/ucp/ucp_pm_compose.php137
-rw-r--r--phpBB/includes/ucp/ucp_pm_options.php2
-rw-r--r--phpBB/includes/ucp/ucp_pm_viewfolder.php14
-rw-r--r--phpBB/includes/ucp/ucp_pm_viewmessage.php41
-rw-r--r--phpBB/includes/ucp/ucp_prefs.php8
-rw-r--r--phpBB/includes/ucp/ucp_profile.php42
-rw-r--r--phpBB/includes/ucp/ucp_register.php127
-rw-r--r--phpBB/includes/ucp/ucp_remind.php116
-rw-r--r--phpBB/includes/ucp/ucp_zebra.php26
-rw-r--r--phpBB/includes/utf/utf_tools.php2
-rw-r--r--phpBB/index.php11
-rw-r--r--phpBB/install/app.php4
-rw-r--r--phpBB/install/convert/controller/convertor.php4
-rw-r--r--phpBB/install/convert/convertor.php24
-rw-r--r--phpBB/install/convertors/convert_phpbb20.php2
-rw-r--r--phpBB/install/convertors/functions_phpbb20.php9
-rwxr-xr-xphpBB/install/phpbbcli.php2
-rw-r--r--phpBB/install/schemas/schema_data.sql17
-rw-r--r--phpBB/language/en/acp/attachments.php4
-rw-r--r--phpBB/language/en/acp/board.php64
-rw-r--r--phpBB/language/en/acp/common.php2
-rw-r--r--phpBB/language/en/acp/database.php13
-rw-r--r--phpBB/language/en/acp/forums.php1
-rw-r--r--phpBB/language/en/acp/groups.php3
-rw-r--r--phpBB/language/en/acp/permissions.php2
-rw-r--r--phpBB/language/en/acp/permissions_phpbb.php5
-rw-r--r--phpBB/language/en/acp/profile.php6
-rw-r--r--phpBB/language/en/acp/search.php5
-rw-r--r--phpBB/language/en/acp/styles.php84
-rw-r--r--phpBB/language/en/captcha_qa.php2
-rw-r--r--phpBB/language/en/captcha_recaptcha.php2
-rw-r--r--phpBB/language/en/cli.php1
-rw-r--r--phpBB/language/en/common.php15
-rw-r--r--phpBB/language/en/email/admin_activate.txt2
-rw-r--r--phpBB/language/en/email/forum_notify.txt1
-rw-r--r--phpBB/language/en/email/newtopic_notify.txt5
-rw-r--r--phpBB/language/en/email/report_pm.txt2
-rw-r--r--phpBB/language/en/email/topic_notify.txt1
-rw-r--r--phpBB/language/en/help/faq.php4
-rw-r--r--phpBB/language/en/install.php40
-rw-r--r--phpBB/language/en/posting.php2
-rw-r--r--phpBB/language/en/ucp.php10
-rw-r--r--phpBB/language/en/viewforum.php3
-rw-r--r--phpBB/language/en/viewtopic.php1
-rw-r--r--phpBB/mcp.php4
-rw-r--r--phpBB/memberlist.php298
-rw-r--r--phpBB/phpbb/attachment/delete.php56
-rw-r--r--phpBB/phpbb/attachment/resync.php4
-rw-r--r--phpBB/phpbb/attachment/upload.php2
-rw-r--r--phpBB/phpbb/auth/auth.php10
-rw-r--r--phpBB/phpbb/auth/provider/ldap.php4
-rw-r--r--phpBB/phpbb/auth/provider/oauth/oauth.php83
-rw-r--r--phpBB/phpbb/auth/provider/provider_interface.php7
-rw-r--r--phpBB/phpbb/avatar/driver/local.php6
-rw-r--r--phpBB/phpbb/avatar/driver/upload.php14
-rw-r--r--phpBB/phpbb/avatar/manager.php25
-rw-r--r--phpBB/phpbb/cache/driver/apcu.php6
-rw-r--r--phpBB/phpbb/cache/driver/base.php6
-rw-r--r--phpBB/phpbb/cache/driver/file.php4
-rw-r--r--phpBB/phpbb/cache/driver/memory.php7
-rw-r--r--phpBB/phpbb/cache/service.php2
-rw-r--r--phpBB/phpbb/captcha/char_cube3d.php2
-rw-r--r--phpBB/phpbb/captcha/colour_manager.php2
-rw-r--r--phpBB/phpbb/captcha/gd.php54
-rw-r--r--phpBB/phpbb/captcha/plugins/captcha_abstract.php2
-rw-r--r--phpBB/phpbb/captcha/plugins/gd.php2
-rw-r--r--phpBB/phpbb/captcha/plugins/gd_wave.php2
-rw-r--r--phpBB/phpbb/captcha/plugins/nogd.php2
-rw-r--r--phpBB/phpbb/captcha/plugins/qa.php25
-rw-r--r--phpBB/phpbb/captcha/plugins/recaptcha.php2
-rw-r--r--phpBB/phpbb/console/command/extension/enable.php7
-rw-r--r--phpBB/phpbb/console/command/thumbnail/delete.php13
-rw-r--r--phpBB/phpbb/console/command/thumbnail/generate.php13
-rw-r--r--phpBB/phpbb/console/exception_subscriber.php13
-rw-r--r--phpBB/phpbb/content_visibility.php130
-rw-r--r--phpBB/phpbb/cron/task/core/prune_all_forums.php23
-rw-r--r--phpBB/phpbb/datetime.php6
-rw-r--r--phpBB/phpbb/db/driver/driver.php26
-rw-r--r--phpBB/phpbb/db/driver/mssql_base.php8
-rw-r--r--phpBB/phpbb/db/driver/mssqlnative.php5
-rw-r--r--phpBB/phpbb/db/driver/oracle.php6
-rw-r--r--phpBB/phpbb/db/extractor/mssql_extractor.php4
-rw-r--r--phpBB/phpbb/db/extractor/oracle_extractor.php4
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php44
-rw-r--r--phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php14
-rw-r--r--phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php11
-rw-r--r--phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php4
-rw-r--r--phpBB/phpbb/db/migration/data/v310/dev.php25
-rw-r--r--phpBB/phpbb/db/migration/data/v310/extensions.php4
-rw-r--r--phpBB/phpbb/db/migration/data/v310/notifications.php7
-rw-r--r--phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php8
-rw-r--r--phpBB/phpbb/db/migration/data/v310/style_update_p1.php12
-rw-r--r--phpBB/phpbb/db/migration/data/v310/teampage.php4
-rw-r--r--phpBB/phpbb/db/migration/data/v31x/v3112.php36
-rw-r--r--phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php9
-rw-r--r--phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php19
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/disable_remote_avatar.php34
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/email_force_sender.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/enable_accurate_pm_button.php36
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/f_list_topics_permission_add.php31
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/fix_user_styles.php54
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/jquery_update.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/merge_duplicate_bbcodes.php84
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/remove_imagick.php31
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/smtp_dynamic_data.php42
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/timezone_p3.php29
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/update_prosilver_bitfield.php39
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v321.php1
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v322.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v322rc1.php41
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v323.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v323rc1.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v323rc2.php36
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v324.php38
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v324rc1.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v325.php38
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v325rc1.php36
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v326.php39
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v326rc1.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v327.php37
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v327rc1.php36
-rw-r--r--phpBB/phpbb/db/migration/data/v32x/v328rc1.php37
-rw-r--r--phpBB/phpbb/db/migration/tool/config.php2
-rw-r--r--phpBB/phpbb/db/migration/tool/config_text.php2
-rw-r--r--phpBB/phpbb/db/migration/tool/module.php274
-rw-r--r--phpBB/phpbb/db/migration/tool/permission.php2
-rw-r--r--phpBB/phpbb/db/migrator.php6
-rw-r--r--phpBB/phpbb/db/sql_insert_buffer.php4
-rw-r--r--phpBB/phpbb/db/tools/mssql.php86
-rw-r--r--phpBB/phpbb/db/tools/tools.php17
-rw-r--r--phpBB/phpbb/debug/error_handler.php4
-rw-r--r--phpBB/phpbb/di/container_builder.php7
-rw-r--r--phpBB/phpbb/event/dispatcher.php7
-rw-r--r--phpBB/phpbb/event/md_exporter.php38
-rw-r--r--phpBB/phpbb/event/php_exporter.php73
-rw-r--r--phpBB/phpbb/feed/helper.php55
-rw-r--r--phpBB/phpbb/feed/quote_helper.php36
-rw-r--r--phpBB/phpbb/file_downloader.php2
-rw-r--r--phpBB/phpbb/files/filespec.php6
-rw-r--r--phpBB/phpbb/files/types/form.php2
-rw-r--r--phpBB/phpbb/files/types/local.php2
-rw-r--r--phpBB/phpbb/files/upload.php8
-rw-r--r--phpBB/phpbb/filesystem/filesystem.php10
-rw-r--r--phpBB/phpbb/group/helper.php260
-rw-r--r--phpBB/phpbb/install/helper/config.php2
-rw-r--r--phpBB/phpbb/install/helper/database.php6
-rw-r--r--phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php12
-rw-r--r--phpBB/phpbb/install/module/install_data/task/add_bots.php2
-rw-r--r--phpBB/phpbb/install/module/install_data/task/add_modules.php2
-rw-r--r--phpBB/phpbb/install/module/install_database/task/add_config_settings.php6
-rw-r--r--phpBB/phpbb/install/module/install_database/task/add_default_data.php2
-rw-r--r--phpBB/phpbb/install/module/install_database/task/add_tables.php2
-rw-r--r--phpBB/phpbb/install/module/install_finish/task/install_extensions.php2
-rw-r--r--phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php8
-rw-r--r--phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php6
-rw-r--r--phpBB/phpbb/install/module/obtain_data/task/obtain_imagick_path.php89
-rw-r--r--phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php4
-rw-r--r--phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php8
-rw-r--r--phpBB/phpbb/install/module/requirements/task/check_update.php7
-rw-r--r--phpBB/phpbb/install/module/update_database/task/update_extensions.php2
-rw-r--r--phpBB/phpbb/install/module/update_filesystem/task/diff_files.php45
-rw-r--r--phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php10
-rw-r--r--phpBB/phpbb/language/language.php4
-rw-r--r--phpBB/phpbb/language/language_file_loader.php2
-rw-r--r--phpBB/phpbb/log/log.php26
-rw-r--r--phpBB/phpbb/message/admin_form.php30
-rw-r--r--phpBB/phpbb/message/form.php4
-rw-r--r--phpBB/phpbb/message/message.php6
-rw-r--r--phpBB/phpbb/module/module_manager.php10
-rw-r--r--phpBB/phpbb/notification/manager.php33
-rw-r--r--phpBB/phpbb/notification/method/board.php2
-rw-r--r--phpBB/phpbb/notification/method/email.php2
-rw-r--r--phpBB/phpbb/notification/method/messenger_base.php4
-rw-r--r--phpBB/phpbb/notification/type/admin_activate_user.php2
-rw-r--r--phpBB/phpbb/notification/type/pm.php2
-rw-r--r--phpBB/phpbb/notification/type/post.php10
-rw-r--r--phpBB/phpbb/notification/type/report_pm.php13
-rw-r--r--phpBB/phpbb/notification/type/topic.php2
-rw-r--r--phpBB/phpbb/pagination.php13
-rw-r--r--phpBB/phpbb/permissions.php1
-rw-r--r--phpBB/phpbb/profilefields/manager.php10
-rw-r--r--phpBB/phpbb/profilefields/type/type_bool.php2
-rw-r--r--phpBB/phpbb/profilefields/type/type_dropdown.php6
-rw-r--r--phpBB/phpbb/profilefields/type/type_url.php15
-rw-r--r--phpBB/phpbb/report/controller/report.php6
-rw-r--r--phpBB/phpbb/report/report_handler_pm.php4
-rw-r--r--phpBB/phpbb/report/report_handler_post.php4
-rw-r--r--phpBB/phpbb/request/request.php2
-rw-r--r--phpBB/phpbb/request/type_cast_helper.php65
-rw-r--r--phpBB/phpbb/request/type_cast_helper_interface.php14
-rw-r--r--phpBB/phpbb/search/base.php10
-rw-r--r--phpBB/phpbb/search/fulltext_mysql.php136
-rw-r--r--phpBB/phpbb/search/fulltext_native.php153
-rw-r--r--phpBB/phpbb/search/fulltext_postgres.php98
-rw-r--r--phpBB/phpbb/search/fulltext_sphinx.php41
-rw-r--r--phpBB/phpbb/search/sphinx/config.php4
-rw-r--r--phpBB/phpbb/search/sphinx/config_section.php6
-rw-r--r--phpBB/phpbb/session.php35
-rw-r--r--phpBB/phpbb/template/assets_bag.php4
-rw-r--r--phpBB/phpbb/template/context.php178
-rw-r--r--phpBB/phpbb/template/twig/extension.php4
-rw-r--r--phpBB/phpbb/template/twig/node/includeasset.php7
-rw-r--r--phpBB/phpbb/textformatter/s9e/bbcode_merger.php183
-rw-r--r--phpBB/phpbb/textformatter/s9e/factory.php58
-rw-r--r--phpBB/phpbb/textformatter/s9e/link_helper.php31
-rw-r--r--phpBB/phpbb/textformatter/s9e/parser.php6
-rw-r--r--phpBB/phpbb/textreparser/base.php4
-rw-r--r--phpBB/phpbb/textreparser/plugins/poll_title.php2
-rw-r--r--phpBB/phpbb/tree/nestedset.php6
-rw-r--r--phpBB/phpbb/user.php23
-rw-r--r--phpBB/phpbb/user_loader.php8
-rw-r--r--phpBB/posting.php137
-rw-r--r--phpBB/search.php60
-rw-r--r--phpBB/styles/prosilver/style.cfg6
-rw-r--r--phpBB/styles/prosilver/template/ajax.js2
-rw-r--r--phpBB/styles/prosilver/template/attachment.html4
-rw-r--r--phpBB/styles/prosilver/template/confirm_delete_body.html2
-rw-r--r--phpBB/styles/prosilver/template/forum_fn.js10
-rw-r--r--phpBB/styles/prosilver/template/forumlist_body.html14
-rw-r--r--phpBB/styles/prosilver/template/index_body.html1
-rw-r--r--phpBB/styles/prosilver/template/login_body.html1
-rw-r--r--phpBB/styles/prosilver/template/login_body_oauth.html10
-rw-r--r--phpBB/styles/prosilver/template/login_forum.html1
-rw-r--r--phpBB/styles/prosilver/template/mcp_ban.html12
-rw-r--r--phpBB/styles/prosilver/template/mcp_forum.html2
-rw-r--r--phpBB/styles/prosilver/template/mcp_move.html2
-rw-r--r--phpBB/styles/prosilver/template/mcp_post.html10
-rw-r--r--phpBB/styles/prosilver/template/mcp_topic.html7
-rw-r--r--phpBB/styles/prosilver/template/memberlist_body.html17
-rw-r--r--phpBB/styles/prosilver/template/memberlist_email.html2
-rw-r--r--phpBB/styles/prosilver/template/memberlist_view.html2
-rw-r--r--phpBB/styles/prosilver/template/navbar_header.html23
-rw-r--r--phpBB/styles/prosilver/template/overall_footer.html74
-rw-r--r--phpBB/styles/prosilver/template/plupload.html4
-rw-r--r--phpBB/styles/prosilver/template/posting_attach_body.html12
-rw-r--r--phpBB/styles/prosilver/template/posting_buttons.html5
-rw-r--r--phpBB/styles/prosilver/template/posting_pm_header.html4
-rw-r--r--phpBB/styles/prosilver/template/posting_poll_body.html4
-rw-r--r--phpBB/styles/prosilver/template/posting_preview.html2
-rw-r--r--phpBB/styles/prosilver/template/posting_review.html2
-rw-r--r--phpBB/styles/prosilver/template/posting_smilies.html4
-rw-r--r--phpBB/styles/prosilver/template/posting_topic_review.html8
-rw-r--r--phpBB/styles/prosilver/template/search_results.html11
-rw-r--r--phpBB/styles/prosilver/template/simple_footer.html8
-rw-r--r--phpBB/styles/prosilver/template/ucp_agreement.html7
-rw-r--r--phpBB/styles/prosilver/template/ucp_attachments.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_auth_link_oauth.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_footer.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_pm_history.html7
-rw-r--r--phpBB/styles/prosilver/template/ucp_pm_viewmessage.html12
-rw-r--r--phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html10
-rw-r--r--phpBB/styles/prosilver/template/ucp_prefs_personal.html4
-rw-r--r--phpBB/styles/prosilver/template/ucp_profile_signature.html1
-rw-r--r--phpBB/styles/prosilver/template/ucp_register.html4
-rw-r--r--phpBB/styles/prosilver/template/ucp_remind.html13
-rw-r--r--phpBB/styles/prosilver/template/viewforum_body.html23
-rw-r--r--phpBB/styles/prosilver/template/viewonline_body.html2
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_body.html12
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_print.html12
-rw-r--r--phpBB/styles/prosilver/template/viewtopic_topic_tools.html2
-rw-r--r--phpBB/styles/prosilver/theme/bidi.css8
-rw-r--r--phpBB/styles/prosilver/theme/common.css13
-rw-r--r--phpBB/styles/prosilver/theme/content.css8
-rw-r--r--phpBB/styles/prosilver/theme/cp.css3
-rw-r--r--phpBB/styles/prosilver/theme/plupload.css4
-rw-r--r--phpBB/styles/prosilver/theme/print.css2
-rw-r--r--phpBB/styles/prosilver/theme/responsive.css1
-rw-r--r--phpBB/ucp.php8
-rw-r--r--phpBB/viewforum.php83
-rw-r--r--phpBB/viewtopic.php176
-rw-r--r--tests/RUNNING_TESTS.md25
-rw-r--r--tests/attachment/fixtures/resync.xml7
-rw-r--r--tests/avatar/manager_test.php4
-rw-r--r--tests/cache/apcu_driver_test.php17
-rw-r--r--tests/cache/cache_memory.php2
-rw-r--r--tests/cache/cache_memory_test.php2
-rw-r--r--tests/console/thumbnail_test.php6
-rw-r--r--tests/console/user/add_test.php48
-rw-r--r--tests/console/user/base.php5
-rw-r--r--tests/cron/manager_test.php2
-rw-r--r--tests/dbal/db_tools_test.php32
-rw-r--r--tests/dbal/ext/foo/bar/acp/acp_test_info.php37
-rw-r--r--tests/dbal/ext/foo/bar/acp/acp_test_module.php25
-rw-r--r--tests/dbal/ext/foo/bar/composer.json24
-rw-r--r--tests/dbal/ext/foo/bar/ucp/ucp_test_info.php37
-rw-r--r--tests/dbal/ext/foo/bar/ucp/ucp_test_module.php25
-rw-r--r--tests/dbal/fixtures/boolean_processor.xml6
-rw-r--r--tests/dbal/migrator_tool_module_test.php215
-rw-r--r--tests/dbal/migrator_tool_permission_test.php4
-rw-r--r--tests/dbal/write_test.php2
-rw-r--r--tests/error_collector_test.php4
-rw-r--r--tests/event/dispatcher_test.php16
-rw-r--r--tests/event/fixtures/event_migration.test30
-rw-r--r--tests/event/fixtures/extra_description.test2
-rw-r--r--tests/event/md_exporter_test.php4
-rw-r--r--tests/event/php_exporter_test.php21
-rw-r--r--tests/feed/attachments_base_test.php14
-rw-r--r--tests/functional/acp_attachments_test.php78
-rw-r--r--tests/functional/acp_profile_field_test.php15
-rw-r--r--tests/functional/extension_acp_test.php4
-rw-r--r--tests/functional/extension_controller_test.php2
-rw-r--r--tests/functional/extension_global_lang_test.php2
-rw-r--r--tests/functional/extension_module_test.php2
-rw-r--r--tests/functional/extension_permission_lang_test.php2
-rw-r--r--tests/functional/fileupload_form_test.php1
-rw-r--r--tests/functional/fileupload_remote_test.php4
-rw-r--r--tests/functional/metadata_manager_test.php2
-rw-r--r--tests/functional/posting_test.php2
-rw-r--r--tests/functional/user_password_reset_test.php57
-rw-r--r--tests/functions/fixtures/validate_username.xml2
-rw-r--r--tests/functions/get_remote_file_test.php2
-rw-r--r--tests/functions/make_clickable_test.php12
-rw-r--r--tests/functions/user_delete_test.php6
-rw-r--r--tests/functions/validate_username_test.php11
-rw-r--r--tests/functions_acp/validate_config_vars_test.php106
-rw-r--r--tests/functions_content/phpbb_format_quote_test.php57
-rw-r--r--tests/functions_user/delete_user_test.php5
-rw-r--r--tests/functions_user/fixtures/delete_user.xml9
-rw-r--r--tests/group/helper_get_name_string_test.php115
-rw-r--r--tests/group/helper_get_name_test.php31
-rw-r--r--tests/group/helper_get_rank_test.php43
-rw-r--r--tests/group/helper_test.php68
-rw-r--r--tests/group/helper_test_case.php123
-rw-r--r--tests/lint_test.php7
-rw-r--r--tests/migrator/get_callable_from_step_test.php136
-rw-r--r--tests/mock/sql_insert_buffer.php2
-rw-r--r--tests/network/checkdnsrr_test.php2
-rw-r--r--tests/notification/base.php2
-rw-r--r--tests/notification/fixtures/submit_post_notification.type.bookmark.xml2
-rw-r--r--tests/notification/fixtures/submit_post_notification.type.post.xml3
-rw-r--r--tests/notification/fixtures/submit_post_notification.type.post_in_queue.xml2
-rw-r--r--tests/notification/fixtures/submit_post_notification.type.quote.xml2
-rw-r--r--tests/notification/fixtures/submit_post_notification.type.topic.xml2
-rw-r--r--tests/notification/group_request_test.php16
-rw-r--r--tests/notification/notification_test.php2
-rw-r--r--tests/profilefields/type_string_test.php15
-rw-r--r--tests/profilefields/type_url_test.php70
-rw-r--r--tests/random/gen_rand_string_test.php10
-rw-r--r--tests/request/type_cast_helper_test.php10
-rw-r--r--tests/search/fixtures/posts.xml5
-rw-r--r--tests/search/native_test.php8
-rw-r--r--tests/security/redirect_test.php2
-rw-r--r--tests/session/check_ban_test.php3
-rw-r--r--tests/template/context_test.php96
-rw-r--r--tests/template/template_includecss_test.php8
-rw-r--r--tests/template/template_includejs_test.php32
-rw-r--r--tests/template/template_test.php42
-rw-r--r--tests/template/templates/loop_nested.html3
-rw-r--r--tests/test_framework/phpbb_database_test_case.php79
-rw-r--r--tests/test_framework/phpbb_database_test_connection_manager.php10
-rw-r--r--tests/test_framework/phpbb_functional_test_case.php32
-rw-r--r--tests/test_framework/phpbb_test_case_helpers.php7
-rw-r--r--tests/test_framework/phpbb_ui_test_case.php63
-rw-r--r--tests/text_formatter/s9e/bbcode_merger_test.php280
-rw-r--r--tests/text_formatter/s9e/default_formatting_test.php40
-rw-r--r--tests/text_formatter/s9e/factory_test.php34
-rw-r--r--tests/text_formatter/s9e/fixtures/malformed_bbcode.xml28
-rw-r--r--tests/text_formatter/s9e/fixtures/styles/unsafe/template/bbcode.html40
-rw-r--r--tests/text_formatter/s9e/fixtures/unsafe_default_bbcodes.xml24
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-10122.html2
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-10268.html4
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-13641.html2
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-13921.html2
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-14706.html2
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-14790.html8
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-14846.html2
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-15348.html2
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-16053.html1
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-16053.txt1
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-16053.xml28
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-16074.html1
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-16074.txt1
-rw-r--r--tests/text_processing/tickets_data/PHPBB3-8419.html2
-rw-r--r--tests/text_reparser/base_test.php15
-rw-r--r--tests/text_reparser/fixtures/base.xml8
-rw-r--r--tests/text_reparser/plugins/fixtures/polls.xml11
-rw-r--r--tests/tree/nestedset_forum_base.php20
-rw-r--r--tests/upload/filespec_test.php2
-rw-r--r--tests/upload/fileupload_test.php12
-rw-r--r--tests/wrapper/version_compare_test.php2
-rwxr-xr-xtravis/setup-mariadb.sh2
-rwxr-xr-xtravis/setup-php-extensions.sh15
-rwxr-xr-xtravis/setup-phpbb.sh2
-rwxr-xr-xtravis/setup-webserver.sh51
511 files changed, 11295 insertions, 4030 deletions
diff --git a/.appveyor.yml b/.appveyor.yml
new file mode 100644
index 0000000000..dfb8fea7d3
--- /dev/null
+++ b/.appveyor.yml
@@ -0,0 +1,145 @@
+build: false
+clone_folder: c:\projects\phpbb
+version: '{build}'
+
+services:
+ - iis
+
+environment:
+ matrix:
+ - db: mssql
+ db_version: sql2012sp1
+ php: 7.0
+ - db: mssql
+ db_version: sql2014
+ php: 7.0
+ - db: mssql
+ db_version: sql2016
+ php: 7.1.12
+# - db: mssql
+# db_version: sql2017
+# php: 7.1
+# - db: mariadb
+# php: 7.1
+# - db: mysqli
+# php: 7.1
+# - db: sqlite
+# php: 7.1
+# - db: postgresql
+# php: 7.1
+
+hosts:
+ phpbb.test: 127.0.0.1
+
+init:
+ - SET PATH=%systemroot%\system32\inetsrv\;C:\Program Files\OpenSSL;C:\tools\php;c:\php;%PATH%
+ - SET ANSICON=121x90 (121x90)
+ - REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v DelayedExpansion /t REG_DWORD /d 1 /f
+
+before_test:
+ - ps: |
+ Set-Service wuauserv -StartupType Manual
+ choco install chocolatey -y --version 0.10.13 --allow-downgrade
+ choco install php -y --version ((choco search php --exact --all-versions -r | select-string -pattern $env:php | sort { [version]($_ -split '\|' | select -last 1) } -Descending | Select-Object -first 1) -replace '[php|]','')
+ Get-ChildItem -Path "c:\tools\php$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1$2')" -Recurse |
+ Move-Item -destination "c:\tools\php"
+ cd c:\tools\php
+ cat php.ini-development | %{$_ -replace "memory_limit = 128M","memory_limit = 1024M"} | Out-File -Encoding "Default" php.ini
+ Add-Content php.ini "`n date.timezone=UTC"
+ Add-Content php.ini "`n display_errors=On"
+ Add-Content php.ini "`n extension_dir=ext"
+ Add-Content php.ini "`n extension=php_openssl.dll"
+ Add-Content php.ini "`n extension=php_mbstring.dll"
+ Add-Content php.ini "`n extension=php_curl.dll"
+ Add-Content php.ini "`n extension=php_gd2.dll"
+ Add-Content php.ini "`n extension=php_tidy.dll"
+ Add-Content php.ini "`n extension=php_fileinfo.dll"
+ Add-Content php.ini "`n extension=php_pdo_sqlite.dll"
+ Add-Content php.ini "`n extension=php_sqlite3.dll"
+ Add-Content php.ini "`n extension=php_pdo_mysql.dll"
+ Add-Content php.ini "`n extension=php_mysqli.dll"
+ Add-Content php.ini "`n extension=php_pdo_pgsql.dll"
+ Add-Content php.ini "`n extension=php_pgsql.dll"
+
+ # Get MSSQL driver
+ if ($env:db -eq "mssql") {
+ cd c:\tools\php\ext
+ $DLLVersion = "4.1.6.1"
+ curl -o php_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip https://windows.php.net/downloads/pecl/releases/sqlsrv/$($:DLLVersion)/php_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip
+ 7z x -y php_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip > $null
+ curl -o php_pdo_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip https://windows.php.net/downloads/pecl/releases/pdo_sqlsrv/$($DLLVersion)/php_pdo_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip
+ 7z x -y php_pdo_sqlsrv-$($DLLVersion)-$($env:php -replace '([0-9])[.]([0-9])[.]?([0-9]+)?','$1.$2')-nts-vc14-x64.zip > $null
+ Remove-Item c:\tools\php\* -include .zip
+ cd c:\tools\php
+ Add-Content php.ini "`nextension=php_sqlsrv.dll"
+ Add-Content php.ini "`nextension=php_pdo_sqlsrv.dll"
+ Add-Content php.ini "`n"
+
+ $instanceName = $env:db_version.ToUpper()
+ Start-Service "MSSQL`$$instanceName"
+ Set-Variable -Name "sqlServerPath" -Value "(local)\$($env:db_version.ToUpper())"
+
+ # Create database write test config
+ sqlcmd -S $sqlServerPath -Q "Use [master]; CREATE DATABASE [phpbb_test] COLLATE Latin1_General_CI_AS"
+ $data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\mssqlnative';`n`$dbhost = '.\\$env:db_version';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'sa';`n`$dbpasswd = 'Password12!';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
+ }
+ elseif ($env:db -eq "mysqli") {
+ Start-Service MySQL57
+ $env:MYSQL_PWD="Password12!"
+ $cmd = '"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql" -e "create database phpbb_test;" --user=root'
+ iex "& $cmd"
+ $data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\mysqli';`n`$dbhost = 'localhost';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'root';`n`$dbpasswd = 'Password12!';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
+ }
+ elseif ($env:db -eq "postgresql") {
+ Start-Service postgresql-x64-9.5
+ $env:PGUSER="postgres"
+ $env:PGPASSWORD="Password12!"
+ $Env:Path="C:\Program Files\PostgreSQL\9.6\bin\;$($Env:Path)"
+ createdb phpbb_test
+ $data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\postgres';`n`$dbhost = 'localhost';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'postgres';`n`$dbpasswd = 'Password12!';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
+ }
+ elseif ($env:db -eq "mariadb") {
+ appveyor-retry choco install mariadb -y --force
+ $env:MYSQL_PWD=""
+ $cmd = '"C:\Program Files\MariaDB 10.2\bin\mysql" -e "create database phpbb_test;" --user=root'
+ iex "& $cmd"
+ $data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\mysqli';`n`$dbhost = 'localhost';`n`$dbport = '';`n`$dbname = 'phpbb_test';`n`$dbuser = 'root';`n`$dbpasswd = '';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
+ }
+ elseif ($env:db -eq "sqlite") {
+ # install sqlite
+ appveyor-retry choco install sqlite -y
+ sqlite3 c:\projects\test.db "create table aTable(field1 int); drop table aTable;"
+ $data = "<?php`n`n`$dbms = 'phpbb\\db\\driver\\sqlite3';`n`$dbhost = 'c:\\projects\\test.db';`n`$dbport = '';`n`$dbname = '';`n`$dbuser = '';`n`$dbpasswd = '';`n`$phpbb_functional_url = 'http://phpbb.test/';"; $data | Out-File -Encoding "Default" "c:\\projects\\phpbb\\tests\\test_config.php"
+ }
+
+ # Install PhantomJS
+ choco install phantomjs -y
+ Start-Process "phantomjs" "--webdriver=8910" | Out-Null
+ - ps: |
+ cd c:\projects\phpbb\phpBB
+ (Get-Content c:\projects\phpbb\phpBB\web.config).replace("<configuration>", "<configuration>`n`t<system.web>`n`t`t<customErrors mode=`"Off`"/>`n`t</system.web>") | Set-Content c:\projects\phpbb\phpBB\web.config
+ (Get-Content c:\projects\phpbb\phpBB\web.config).replace("`t</system.webServer>", "`t`t<httpErrors errorMode=`"Detailed`" />`n`t</system.webServer>") | Set-Content c:\projects\phpbb\phpBB\web.config
+ - cd c:\projects\phpbb\phpBB
+ - php ..\composer.phar install
+ - choco install urlrewrite -y
+ - ps: New-WebSite -Name 'phpBBTest' -PhysicalPath 'c:\projects\phpbb\phpBB' -Force
+ - ps: Import-Module WebAdministration; Set-ItemProperty 'IIS:\Sites\phpBBTest' -name Bindings -value @{protocol='http';bindingInformation='*:80:phpbb.test'}
+ - echo Change default anonymous user AUTH to ApplicationPool
+ - appcmd set config -section:anonymousAuthentication /username:"" --password
+ - echo Setup FAST-CGI configuration
+ - appcmd set config /section:system.webServer/fastCGI /+[fullPath='C:\tools\php\php-cgi.exe']
+ - echo Setup FACT-CGI handler
+ - appcmd set config /section:system.webServer/handlers /+[name='PHP-FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='C:\tools\php\php-cgi.exe',resourceType='Either']
+ - iisreset
+ - NET START W3SVC
+ - mkdir "C:\projects\phpbb\phpBB\cache\test"
+ - mkdir "C:\projects\phpbb\phpBB\cache\installer"
+ - icacls "C:\projects\phpbb\phpBB\cache" /grant Users:F /T
+ - icacls "C:\projects\phpbb\phpBB\files" /grant Users:F /T
+ - icacls "C:\projects\phpbb\phpBB\store" /grant Users:F /T
+ - icacls "C:\projects\phpbb\phpBB\images\avatars\upload" /grant Users:F /T
+
+test_script:
+ - cd c:\projects\phpbb
+ - php -e phpBB\vendor\phpunit\phpunit\phpunit --verbose
+
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 39eb83e454..cacfcf1118 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,9 +1,9 @@
Checklist:
-- [ ] Correct branch: master for new features; 3.2.x, 3.1.x for fixes
+- [ ] Correct branch: master for new features; 3.2.x for fixes
- [ ] Tests pass
-- [ ] Code follows coding guidelines: [master / 3.2.x](https://area51.phpbb.com/docs/master/coding-guidelines.html), [3.1.x](https://area51.phpbb.com/docs/31x/coding-guidelines.html)
-- [ ] Commit follows commit message [format](https://wiki.phpbb.com/Git#Commit_Messages)
+- [ ] Code follows coding guidelines: [master](https://area51.phpbb.com/docs/dev/master/development/coding_guidelines.html) and [3.2.x](https://area51.phpbb.com/docs/dev/3.2.x/development/coding_guidelines.html)
+- [ ] Commit follows commit message [format](https://area51.phpbb.com/docs/dev/3.2.x/development/git.html)
Tracker ticket (set the ticket ID to **your ticket ID**):
diff --git a/.travis.yml b/.travis.yml
index fa2a86c0db..3f3cf2b018 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,5 @@
language: php
-sudo: required
-dist: precise
+dist: trusty
matrix:
include:
@@ -26,12 +25,11 @@ matrix:
env: DB=mysqli
- php: 7.1
env: DB=mysqli
- - php: nightly
+ - php: 7.2
env: DB=mysqli
- - php: hhvm
+ - php: nightly
env: DB=mysqli
allow_failures:
- - php: hhvm
- php: nightly
fast_finish: true
@@ -53,4 +51,4 @@ script:
- sh -c "if [ '$SLOWTESTS' != '1' -a '$DB' = 'mysqli' ]; then phpBB/vendor/bin/phpunit tests/lint_test.php; fi"
- sh -c "if [ '$NOTESTS' != '1' -a '$SLOWTESTS' != '1' ]; then phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml --verbose --stop-on-error; fi"
- sh -c "if [ '$SLOWTESTS' = '1' ]; then phpBB/vendor/bin/phpunit --configuration travis/phpunit-$DB-travis.xml --group slow; fi"
- - sh -c "set -x;if [ '$NOTESTS' = '1' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..FETCH_HEAD; fi"
+ - sh -c "set -x;if [ '$NOTESTS' = '1' -a '$TRAVIS_PULL_REQUEST' != 'false' ]; then git remote set-branches --add origin $TRAVIS_BRANCH && git fetch && git-tools/commit-msg-hook-range.sh origin/$TRAVIS_BRANCH..$TRAVIS_PULL_REQUEST_SHA; fi"
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000..ce992b2ce7
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,281 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, 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 or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) 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; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, 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 executable. However, as a
+special exception, the source code 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.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+ 5. 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 Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program 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 to
+this License.
+
+ 7. 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 Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/README.md b/README.md
index 63ccfedf1b..d1854dc74d 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ To be able to run an installation from the repo (and not from a pre-built packag
1. [Create an account on phpBB.com](http://www.phpbb.com/community/ucp.php?mode=register)
2. [Create a ticket (unless there already is one)](http://tracker.phpbb.com/secure/CreateIssue!default.jspa)
-3. Read our [Coding guidelines](https://wiki.phpbb.com/Coding_guidelines) and [Git Contribution Guidelines](http://wiki.phpbb.com/Git)
+3. Read our [Coding guidelines](https://area51.phpbb.com/docs/dev/development/coding_guidelines.html) and [Git Contribution Guidelines](https://area51.phpbb.com/docs/dev/development/git.html)
4. Send us a pull request
## VAGRANT
@@ -29,11 +29,11 @@ Read our [Vagrant documentation](phpBB/docs/vagrant.md) to find out how to use V
## AUTOMATED TESTING
-We have unit and functional tests in order to prevent regressions. You can view the bamboo continuous integration [here](http://bamboo.phpbb.com) or check our travis builds below:
+We have unit and functional tests in order to prevent regressions. You can view the bamboo continuous integration [here](https://bamboo.phpbb.com) or check our travis builds below:
-* [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=master)](http://travis-ci.org/phpbb/phpbb) **master** - Latest development version
-* [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=3.2.x)](http://travis-ci.org/phpbb/phpbb) **3.2.x** - Development of version 3.2.x
-* [![Build Status](https://secure.travis-ci.org/phpbb/phpbb.png?branch=3.1.x)](http://travis-ci.org/phpbb/phpbb) **3.1.x** - Development of version 3.1.x
+* [![Build Status](https://travis-ci.org/phpbb/phpbb.svg?branch=master)](http://travis-ci.org/phpbb/phpbb)[![Build status](https://ci.appveyor.com/api/projects/status/8g98ybngd2f3axy1/branch/master?svg=true)](https://ci.appveyor.com/project/phpBB/phpbb/branch/master) **master** - Latest development version
+* [![Build Status](https://travis-ci.org/phpbb/phpbb.svg?branch=3.2.x)](http://travis-ci.org/phpbb/phpbb)[![Build status](https://ci.appveyor.com/api/projects/status/8g98ybngd2f3axy1/branch/3.2.x?svg=true)](https://ci.appveyor.com/project/phpBB/phpbb/branch/3.2.x) **3.2.x** - Development of version 3.2.x
+* [![Build Status](https://travis-ci.org/phpbb/phpbb.svg?branch=3.1.x)](http://travis-ci.org/phpbb/phpbb) **3.1.x** - Development of version 3.1.x
## LICENSE
diff --git a/build/build.xml b/build/build.xml
index 42f242b59d..006f9225e9 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -2,9 +2,9 @@
<project name="phpBB" description="The phpBB forum software" default="all" basedir="../">
<!-- a few settings for the build -->
- <property name="newversion" value="3.2.2-dev" />
- <property name="prevversion" value="3.2.1" />
- <property name="olderversions" value="3.0.14, 3.1.0, 3.1.1, 3.1.2, 3.1.3, 3.1.4, 3.1.5, 3.1.6, 3.1.7, 3.1.7-pl1, 3.1.8, 3.1.9, 3.1.10, 3.1.11, 3.2.0-a1, 3.2.0-a2, 3.2.0-b1, 3.2.0-b2, 3.2.0-RC1, 3.2.0-RC2, 3.2.0" />
+ <property name="newversion" value="3.2.9-dev" />
+ <property name="prevversion" value="3.2.7" />
+ <property name="olderversions" value="3.1.0, 3.1.1, 3.1.2, 3.1.3, 3.1.4, 3.1.5, 3.1.6, 3.1.7, 3.1.7-pl1, 3.1.8, 3.1.9, 3.1.10, 3.1.11, 3.1.12, 3.2.0-a1, 3.2.0-a2, 3.2.0-b1, 3.2.0-b2, 3.2.0-RC1, 3.2.0-RC2, 3.2.0, 3.2.1, 3.2.2, 3.2.3, 3.2.4, 3.2.5, 3.2.6" />
<!-- no configuration should be needed beyond this point -->
<property name="oldversions" value="${olderversions}, ${prevversion}" />
diff --git a/build/build_helper.php b/build/build_helper.php
index 3ff1b89eab..c33e2419c6 100644
--- a/build/build_helper.php
+++ b/build/build_helper.php
@@ -33,14 +33,14 @@ class build_package
var $status_begun = false;
var $num_dots = 0;
- function build_package($versions, $verbose = false)
+ function __construct($versions, $verbose = false)
{
$this->versions = $versions;
$this->verbose = $verbose;
// Get last two entries
- $_latest = $this->versions[sizeof($this->versions) - 1];
- $_before = $this->versions[sizeof($this->versions) - 2];
+ $_latest = $this->versions[count($this->versions) - 1];
+ $_before = $this->versions[count($this->versions) - 2];
$this->locations = array(
'new_version' => dirname(dirname(__FILE__)) . '/phpBB/',
diff --git a/build/package.php b/build/package.php
index 178a27faad..18798d0602 100755
--- a/build/package.php
+++ b/build/package.php
@@ -33,7 +33,7 @@ echo "Now all three package types (patch, files, release) are built as well as t
// Go trough all versions making a diff if we even have old versions
// For phpBB 3.0.x we might choose a different update method, rendering the things below useless...
-if (sizeof($package->old_packages))
+if (count($package->old_packages))
{
chdir($package->locations['old_versions']);
@@ -76,7 +76,7 @@ if (sizeof($package->old_packages))
// Create Directories along the way?
$file = explode('/', $file);
// Remove filename portion
- $file[sizeof($file)-1] = '';
+ $file[count($file)-1] = '';
chdir($dest_filename_dir);
foreach ($file as $entry)
@@ -169,7 +169,7 @@ if (sizeof($package->old_packages))
// Create Directories along the way?
$file = explode('/', $file);
// Remove filename portion
- $file[sizeof($file)-1] = '';
+ $file[count($file)-1] = '';
chdir($dest_filename_dir . '/install/update/old');
foreach ($file as $entry)
@@ -214,7 +214,7 @@ if (sizeof($package->old_packages))
// Create Directories along the way?
$file = explode('/', $file);
// Remove filename portion
- $file[sizeof($file)-1] = '';
+ $file[count($file)-1] = '';
chdir($dest_filename_dir . '/install/update/new');
foreach ($file as $entry)
@@ -321,7 +321,7 @@ $update_info = array(
\'version\' => array(\'from\' => \'' . str_replace('_to_', '', $package->old_packages[$_package_name]) . '\', \'to\' => \'' . $package->get('new_version_number') . '\'),
';
- if (sizeof($file_contents['all']))
+ if (count($file_contents['all']))
{
$index_contents .= "\t'files' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['all']) . "',\n\t),\n";
}
@@ -330,7 +330,7 @@ $update_info = array(
$index_contents .= "\t'files' => array(),\n";
}
- if (sizeof($file_contents['binary']))
+ if (count($file_contents['binary']))
{
$index_contents .= "\t'binary' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['binary']) . "',\n\t),\n";
}
@@ -339,7 +339,7 @@ $update_info = array(
$index_contents .= "\t'binary' => array(),\n";
}
- if (sizeof($file_contents['deleted']))
+ if (count($file_contents['deleted']))
{
$index_contents .= "\t'deleted' => array(\n\t\t'" . implode("',\n\t\t'", $file_contents['deleted']) . "',\n\t),\n";
}
@@ -380,7 +380,7 @@ $compress_programs = array(
'zip' => 'zip -r'
);
-if (sizeof($package->old_packages))
+if (count($package->old_packages))
{
// Build Patch Files
chdir($package->get('patch_directory'));
diff --git a/composer.phar b/composer.phar
index fca2a8d72d..348c86d916 100755
--- a/composer.phar
+++ b/composer.phar
Binary files differ
diff --git a/git-tools/hooks/commit-msg b/git-tools/hooks/commit-msg
index 136606252c..b73005b34d 100755
--- a/git-tools/hooks/commit-msg
+++ b/git-tools/hooks/commit-msg
@@ -147,6 +147,15 @@ then
quit $ERR_LENGTH;
fi
+# Check for CR/LF line breaks
+if grep -q $'\r$' "$1"
+then
+ complain "The commit message uses CR/LF line breaks, which are not permitted." >&2
+ complain >&2
+
+ quit $ERR_EOF;
+fi
+
lines=$(wc -l "$1" | awk '{ print $1; }');
expecting=header;
in_description=0;
diff --git a/phpBB/adm/style/acp_attachments.html b/phpBB/adm/style/acp_attachments.html
index e1f7f140c9..6129d6a1a5 100644
--- a/phpBB/adm/style/acp_attachments.html
+++ b/phpBB/adm/style/acp_attachments.html
@@ -37,12 +37,6 @@
<!-- IF S_ATTACHMENT_SETTINGS -->
- <!-- IF not S_THUMBNAIL_SUPPORT -->
- <div class="errorbox">
- <p>{L_NO_THUMBNAIL_SUPPORT}</p>
- </div>
- <!-- ENDIF -->
-
<form id="attachsettings" method="post" action="{U_ACTION}">
<!-- BEGIN options -->
<!-- IF options.S_LEGEND -->
@@ -329,42 +323,71 @@
<fieldset class="tabulated">
<legend>{L_TITLE}</legend>
- <table class="table1 zebra-table fixed-width-table">
- <thead>
- <tr>
- <th>{L_FILENAME}</th>
- <th style="width: 15%;">{L_FILEDATE}</th>
- <th style="width: 15%;">{L_FILESIZE}</th>
- <th style="width: 15%;">{L_ATTACH_POST_ID}</th>
- <th style="width: 15%;">{L_ATTACH_TO_POST}</th>
- <th style="width: 15%;">{L_DELETE}</th>
- </tr>
- </thead>
- <tbody>
- <!-- BEGIN orphan -->
+ <div class="pagination top-pagination">
+ <!-- IF .pagination or TOTAL_FILES -->
+ {L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE}
+ <!-- IF .pagination -->
+ &bull; <!-- INCLUDE pagination.html -->
+ <!-- ELSE -->
+ &bull; {PAGE_NUMBER}
+ <!-- ENDIF -->
+ <!-- ENDIF -->
+ </div>
+
+ <!-- IF .orphan -->
+ <table class="table1 zebra-table fixed-width-table">
+ <thead>
<tr>
- <td><a href="{orphan.U_FILE}">{orphan.REAL_FILENAME}</a></td>
- <td>{orphan.FILETIME}</td>
- <td>{orphan.FILESIZE}</td>
- <td><strong>{L_ATTACH_ID}{L_COLON} </strong><input type="number" min="0" max="9999999999" name="post_id[{orphan.ATTACH_ID}]" value="{orphan.POST_ID}" style="width: 75%;" /></td>
- <td><input type="checkbox" class="radio" name="add[{orphan.ATTACH_ID}]" /></td>
- <td><input type="checkbox" class="radio" name="delete[{orphan.ATTACH_ID}]" /></td>
+ <th>{L_FILENAME}</th>
+ <th style="width: 15%;">{L_FILEDATE}</th>
+ <th style="width: 15%;">{L_FILESIZE}</th>
+ <th style="width: 15%;">{L_ATTACH_POST_ID}</th>
+ <th style="width: 15%;">{L_ATTACH_TO_POST}</th>
+ <th style="width: 15%;">{L_DELETE}</th>
</tr>
- <!-- END orphan -->
- <tr class="row4">
- <td colspan="4">&nbsp;</td>
- <td class="small"><a href="#" onclick="marklist('orphan', 'add', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'add', false); return false;">{L_UNMARK_ALL}</a></td>
- <td class="small"><a href="#" onclick="marklist('orphan', 'delete', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'delete', false); return false;">{L_UNMARK_ALL}</a></td>
- </tr>
- </tbody>
- </table>
+ </thead>
+ <tbody>
+ <!-- BEGIN orphan -->
+ <tr>
+ <td><a href="{orphan.U_FILE}">{orphan.REAL_FILENAME}</a></td>
+ <td>{orphan.FILETIME}</td>
+ <td>{orphan.FILESIZE}</td>
+ <td><strong>{L_ATTACH_ID}{L_COLON} </strong><input type="number" min="0" max="9999999999" name="post_id[{orphan.ATTACH_ID}]" value="{orphan.POST_ID}" style="width: 75%;" /></td>
+ <td><input type="checkbox" class="radio" name="add[{orphan.ATTACH_ID}]" /></td>
+ <td><input type="checkbox" class="radio" name="delete[{orphan.ATTACH_ID}]" /></td>
+ </tr>
+ <!-- END orphan -->
+ <tr class="row4">
+ <td colspan="4">&nbsp;</td>
+ <td class="small"><a href="#" onclick="marklist('orphan', 'add', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'add', false); return false;">{L_UNMARK_ALL}</a></td>
+ <td class="small"><a href="#" onclick="marklist('orphan', 'delete', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('orphan', 'delete', false); return false;">{L_UNMARK_ALL}</a></td>
+ </tr>
+ </tbody>
+ </table>
+ <!-- ELSE -->
+ <div class="errorbox">
+ <p>{L_NO_ATTACHMENTS}</p>
+ </div>
+ <!-- ENDIF -->
+
+ <!-- IF TOTAL_FILES -->
+ <div class="pagination">
+ {L_NUMBER_FILES}{L_COLON} {TOTAL_FILES} &bull; {L_TOTAL_SIZE}{L_COLON} {TOTAL_SIZE}
+ <!-- IF .pagination -->
+ &bull; <!-- INCLUDE pagination.html -->
+ <!-- ELSE -->
+ &bull; {PAGE_NUMBER}
+ <!-- ENDIF -->
+ </div>
+ <!-- ENDIF -->
- <br />
+ <!-- IF .orphan -->
+ <p class="submit-buttons">
+ <input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp;
+ <input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
+ </p>
+ <!-- ENDIF -->
- <p class="submit-buttons">
- <input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />&nbsp;
- <input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
- </p>
{S_FORM_TOKEN}
</fieldset>
</form>
@@ -398,17 +421,25 @@
</tr>
</thead>
<tbody>
- <!-- BEGIN attachments -->
+ {% for attachments in attachments %}
<tr>
<td>
- <!-- IF attachments.S_IN_MESSAGE -->{L_EXTENSION_GROUP}{L_COLON} <strong><!-- IF attachments.EXT_GROUP_NAME -->{attachments.EXT_GROUP_NAME}<!-- ELSE -->{L_NO_EXT_GROUP}<!-- ENDIF --></strong><br />{attachments.L_DOWNLOAD_COUNT}<br />{L_IN} {L_PRIVATE_MESSAGE}
- <!-- ELSE --><a href="{attachments.U_FILE}" style="font-weight: bold;">{attachments.REAL_FILENAME}</a><br /><!-- IF attachments.COMMENT -->{attachments.COMMENT}<br /><!-- ENDIF -->{attachments.L_DOWNLOAD_COUNT}<br />{L_TOPIC}{L_COLON} <a href="{attachments.U_VIEW_TOPIC}">{attachments.TOPIC_TITLE}</a><!-- ENDIF -->
+ {{ lang('EXTENSION_GROUP') ~ lang('COLON') }} <strong>{{ attachments.EXT_GROUP_NAME }}</strong>
+ {% if attachments.S_IN_MESSAGE %}
+ <br>{{ attachments.L_DOWNLOAD_COUNT }}
+ <br>{{ lang('IN') }} {{ lang('PRIVATE_MESSAGE') }}
+ {% else %}
+ <br><a href="{{ attachments.U_FILE }}"><strong>{{ attachments.REAL_FILENAME }}</strong></a>
+ {% if attachments.COMMENT %}<br>{{ attachments.COMMENT }}{% endif %}
+ <br>{{ attachments.L_DOWNLOAD_COUNT }}
+ <br>{{ lang('TOPIC') ~ lang('COLON') }} <a href="{{ attachments.U_VIEW_TOPIC }}">{{ attachments.TOPIC_TITLE }}</a>
+ {% endif %}
</td>
- <td>{attachments.FILETIME}<br />{L_POST_BY_AUTHOR} {attachments.ATTACHMENT_POSTER}</td>
- <td class="centered-text">{attachments.FILESIZE}</td>
- <td class="centered-text"><input type="checkbox" class="radio" name="delete[{attachments.ATTACH_ID}]" /></td>
+ <td>{{ attachments.FILETIME }}<br>{{ lang('POST_BY_AUTHOR') }} {{ attachments.ATTACHMENT_POSTER }}</td>
+ <td class="centered-text">{{ attachments.FILESIZE }}</td>
+ <td class="centered-text"><input type="checkbox" class="radio" name="delete[{{ attachments.ATTACH_ID }}]" /></td>
</tr>
- <!-- END attachments -->
+ {% endfor %}
</tbody>
</table>
<!-- ELSE -->
@@ -440,7 +471,7 @@
<input class="button2" type="submit" name="submit" value="{L_DELETE_MARKED}" /><br />
<p class="small">
<a href="#" onclick="marklist('attachments', 'delete', true); return false;">{L_MARK_ALL}</a> &bull;
- <a href="#" onclick="marklist('attachments', 'delete', false); return false;">{L_UNMARK_ALL}</a>
+ <a href="#" onclick="marklist('attachments', 'delete', false); return false;">{L_UNMARK_ALL}</a>
</p>
</fieldset>
<!-- ENDIF -->
diff --git a/phpBB/adm/style/acp_database.html b/phpBB/adm/style/acp_database.html
index 39f06319f9..cc0b57b411 100644
--- a/phpBB/adm/style/acp_database.html
+++ b/phpBB/adm/style/acp_database.html
@@ -20,7 +20,6 @@
<p class="submit-buttons">
<input class="button1" type="submit" id="submit" name="submit" value="{L_START_RESTORE}" />&nbsp;
<input class="button2" type="submit" id="delete" name="delete" value="{L_DELETE_BACKUP}" />&nbsp;
- <input class="button2" type="submit" id="download" name="download" value="{L_DOWNLOAD_BACKUP}" />
</p>
{S_FORM_TOKEN}
</fieldset>
@@ -69,13 +68,6 @@
<!-- END methods --></dd>
</dl>
<dl>
- <dt><label for="where">{L_ACTION}{L_COLON}</label></dt>
- <dd>
- <label><input id="where" type="radio" class="radio" name="where" value="store" checked="checked" /> {L_STORE_LOCAL}</label>
- <label><input type="radio" class="radio" name="where" value="download" /> {L_DOWNLOAD}</label>
- </dd>
- </dl>
- <dl>
<dt><label for="table">{L_TABLE_SELECT}{L_COLON}</label></dt>
<dd><select id="table" name="table[]" size="10" multiple="multiple">
<!-- BEGIN tables -->
diff --git a/phpBB/adm/style/acp_ext_list.html b/phpBB/adm/style/acp_ext_list.html
index 7ab2608e13..8e2c7452a3 100644
--- a/phpBB/adm/style/acp_ext_list.html
+++ b/phpBB/adm/style/acp_ext_list.html
@@ -7,7 +7,7 @@
<p>{L_EXTENSIONS_EXPLAIN}</p>
<fieldset class="quick">
- <span class="small"><a href="https://www.phpbb.com/go/customise/extensions/3.1" target="_blank">{L_BROWSE_EXTENSIONS_DATABASE}</a> &bull; <a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE_ALL}</a> &bull; <a href="javascript:phpbb.toggleDisplay('version_check_settings');">{L_SETTINGS}</a></span>
+ <span class="small"><a href="https://www.phpbb.com/go/customise/extensions/3.2" target="_blank">{L_BROWSE_EXTENSIONS_DATABASE}</a> &bull; <a href="{U_VERSIONCHECK_FORCE}">{L_VERSIONCHECK_FORCE_UPDATE_ALL}</a> &bull; <a href="javascript:phpbb.toggleDisplay('version_check_settings');">{L_SETTINGS}</a></span>
</fieldset>
<form id="version_check_settings" method="post" action="{U_ACTION}" style="display:none">
diff --git a/phpBB/adm/style/acp_groups.html b/phpBB/adm/style/acp_groups.html
index 26d7030531..d0096370d9 100644
--- a/phpBB/adm/style/acp_groups.html
+++ b/phpBB/adm/style/acp_groups.html
@@ -316,7 +316,7 @@
<tbody>
<!-- ELSE -->
<tr>
- <td><strong>{groups.GROUP_NAME}</strong></td>
+ <td><strong<!-- IF groups.GROUP_COLOR --> style="color: #{groups.GROUP_COLOR}"<!-- ENDIF -->>{groups.GROUP_NAME}</strong></td>
<td style="text-align: center;">{groups.TOTAL_MEMBERS}</td>
<td style="text-align: center;">{groups.PENDING_MEMBERS}</td>
<td style="text-align: center;"><a href="{groups.U_EDIT}">{L_SETTINGS}</a></td>
diff --git a/phpBB/adm/style/acp_language.html b/phpBB/adm/style/acp_language.html
index f708eb1508..79fef94207 100644
--- a/phpBB/adm/style/acp_language.html
+++ b/phpBB/adm/style/acp_language.html
@@ -69,7 +69,7 @@
<p>{L_ACP_LANGUAGE_PACKS_EXPLAIN}</p>
<fieldset class="quick">
- <span class="small"><a href="https://www.phpbb.com/go/customise/language-packs/3.1" target="_blank">{L_BROWSE_LANGUAGE_PACKS_DATABASE}</a></span>
+ <span class="small"><a href="https://www.phpbb.com/go/customise/language-packs/3.2" target="_blank">{L_BROWSE_LANGUAGE_PACKS_DATABASE}</a></span>
</fieldset>
<table class="table1 zebra-table">
diff --git a/phpBB/adm/style/acp_main.html b/phpBB/adm/style/acp_main.html
index 9522baa9c2..12477a4b77 100644
--- a/phpBB/adm/style/acp_main.html
+++ b/phpBB/adm/style/acp_main.html
@@ -153,8 +153,14 @@
<td><strong>{PHP_VERSION_INFO}</strong></td>
<!-- IF S_TOTAL_ORPHAN -->
<td>{L_NUMBER_ORPHAN}{L_COLON} </td>
- <td><strong>{TOTAL_ORPHAN}</strong></td>
- <!-- ELSE -->
+ <td>
+ <!-- IF TOTAL_ORPHAN > 0 -->
+ <a href="{U_ATTACH_ORPHAN}" title="{L_MORE_INFORMATION}"><strong>{TOTAL_ORPHAN}</strong></a>
+ <!-- ELSE -->
+ <strong>{TOTAL_ORPHAN}</strong>
+ <!-- ENDIF -->
+ </td>
+ <!-- ELSE -->
<td>&nbsp;</td>
<td>&nbsp;</td>
<!-- ENDIF -->
diff --git a/phpBB/adm/style/acp_profile.html b/phpBB/adm/style/acp_profile.html
index bd3935b464..25bf97efd5 100644
--- a/phpBB/adm/style/acp_profile.html
+++ b/phpBB/adm/style/acp_profile.html
@@ -238,7 +238,7 @@
<form id="profile_fields" method="post" action="{U_ACTION}">
<fieldset class="quick">
- <input class="text small" type="text" name="field_ident" /> <select name="field_type">{S_TYPE_OPTIONS}</select>
+ <select name="field_type">{S_TYPE_OPTIONS}</select>
<input class="button1" type="submit" name="submit" value="{L_CREATE_NEW_FIELD}" />
<input type="hidden" name="create" value="1" />
{S_FORM_TOKEN}
diff --git a/phpBB/adm/style/acp_prune_forums.html b/phpBB/adm/style/acp_prune_forums.html
index b8c681ea00..ef3880e851 100644
--- a/phpBB/adm/style/acp_prune_forums.html
+++ b/phpBB/adm/style/acp_prune_forums.html
@@ -94,7 +94,9 @@
<dd><label><input type="radio" class="radio" name="prune_sticky" value="1" /> {L_YES}</label>
<label><input type="radio" class="radio" id="sticky" name="prune_sticky" value="0" checked="checked" /> {L_NO}</label></dd>
</dl>
-
+
+ <!-- EVENT acp_prune_forums_settings_append -->
+
<p class="quick">
{S_HIDDEN_FIELDS}
{S_FORM_TOKEN}
diff --git a/phpBB/adm/style/acp_styles.html b/phpBB/adm/style/acp_styles.html
index 43c2f96a65..cfa804090f 100644
--- a/phpBB/adm/style/acp_styles.html
+++ b/phpBB/adm/style/acp_styles.html
@@ -33,7 +33,7 @@
<!-- IF L_EXPLAIN --><p>{L_EXPLAIN}</p><!-- ENDIF -->
<fieldset class="quick">
- <span class="small"><a href="https://www.phpbb.com/go/customise/styles/3.1" target="_blank">{L_BROWSE_STYLES_DATABASE}</a></span>
+ <span class="small"><a href="https://www.phpbb.com/go/customise/styles/3.2" target="_blank">{L_BROWSE_STYLES_DATABASE}</a></span>
</fieldset>
<form id="acp_styles" method="post" action="{U_ACTION}">
@@ -96,6 +96,7 @@
<thead>
<tr>
<th>{L_STYLE_NAME}</th>
+ <th width="10%" style="white-space: nowrap; text-align: center;">{L_STYLE_PHPBB_VERSION}</th>
<!-- IF not STYLES_LIST_HIDE_COUNT --><th width="10%" style="white-space: nowrap; text-align: center;">{L_STYLE_USED_BY}</th><!-- ENDIF -->
<th width="25%" style="white-space: nowrap; text-align: center;">{L_ACTIONS}</th>
{STYLES_LIST_EXTRA}
@@ -129,6 +130,7 @@
<span class="style-path"><br />{L_STYLE_PATH}{L_COLON} {styles_list.STYLE_PATH_FULL}</span>
<!-- ENDIF -->
</td>
+ <td class="{$ROW_CLASS} users">{styles_list.STYLE_PHPBB_VERSION}</td>
<!-- IF not STYLES_LIST_HIDE_COUNT -->
<td class="{$ROW_CLASS} users">{styles_list.USERS}</td>
<!-- ENDIF -->
@@ -144,7 +146,9 @@
{styles_list.EXTRA}
<td class="{$ROW_CLASS} mark" width="20">
<!-- IF styles_list.STYLE_ID -->
- <input class="checkbox" type="checkbox" name="ids[]" value="{styles_list.STYLE_ID}" />
+ {% if styles_list.STYLE_NAME !== 'prosilver' %}
+ <input class="checkbox" type="checkbox" name="ids[]" value="{styles_list.STYLE_ID}" />
+ {% endif %}
<!-- ELSE -->
<!-- IF styles_list.COMMENT != '' -->
&nbsp;
diff --git a/phpBB/adm/style/acp_users_prefs.html b/phpBB/adm/style/acp_users_prefs.html
index 61904adc23..484c5b3976 100644
--- a/phpBB/adm/style/acp_users_prefs.html
+++ b/phpBB/adm/style/acp_users_prefs.html
@@ -33,7 +33,7 @@
<dt><label for="notifymethod">{L_NOTIFY_METHOD}{L_COLON}</label><br /><span>{L_NOTIFY_METHOD_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" name="notifymethod" value="0"<!-- IF NOTIFY_EMAIL --> id="notifymethod" checked="checked"<!-- ENDIF --> /> {L_NOTIFY_METHOD_EMAIL}</label>
<label><input type="radio" class="radio" name="notifymethod" value="1"<!-- IF NOTIFY_IM --> id="notifymethod" checked="checked"<!-- ENDIF --><!-- IF S_JABBER_DISABLED --> disabled="disabled"<!-- ENDIF --> /> {L_NOTIFY_METHOD_IM}</label>
- <label><input type="radio" class="radio" name="notifymethod" value="2"<!-- IF NOTIFY_BOTH --> id="notifymethod" checked="checked"<!-- ENDIF --> /> {L_NOTIFY_METHOD_BOTH}</label></dd>
+ <label><input type="radio" class="radio" name="notifymethod" value="2"<!-- IF NOTIFY_BOTH --> id="notifymethod" checked="checked"<!-- ENDIF --><!-- IF S_JABBER_DISABLED --> disabled="disabled"<!-- ENDIF --> /> {L_NOTIFY_METHOD_BOTH}</label></dd>
</dl>
<dl>
<dt><label for="notifypm">{L_NOTIFY_ON_PM}{L_COLON}</label></dt>
diff --git a/phpBB/adm/style/admin.css b/phpBB/adm/style/admin.css
index 41d0ae8d42..7cf6c22236 100644
--- a/phpBB/adm/style/admin.css
+++ b/phpBB/adm/style/admin.css
@@ -525,7 +525,6 @@ li {
padding: 0;
border-right: 1px solid #CCCFD3;
position: relative;
- z-index: 1;
}
.rtl #menu {
@@ -841,6 +840,7 @@ table.zebra-table tbody tr:nth-child(odd) {
}
.row2 {
+ word-break: break-all;
background-color: #DCEBFE;
}
@@ -1891,7 +1891,6 @@ li.pagination ul {
color: #000;
text-align: center;
border: 1px solid #AAA;
- opacity: .95;
}
.tooltip span.top {
@@ -2461,6 +2460,9 @@ fieldset.permissions .padding {
text-align: left;
}
+.rtl .dropdown li {
+ text-align: right;
+}
.wrap .dropdown li, .dropdown.wrap li {
white-space: normal;
}
@@ -2475,6 +2477,10 @@ fieldset.permissions .padding {
width: 250px;
}
+.rtl .roles-options > .dropdown {
+ right: auto;
+}
+
.roles-options {
-webkit-user-select: none;
-moz-user-select: none;
@@ -2493,6 +2499,10 @@ fieldset.permissions .padding {
background: url('../images/arrow_down.gif') no-repeat 245px .7em;
}
+.rtl .roles-options > span {
+ background: url('../images/arrow_down.gif') no-repeat 7px .7em;
+}
+
.roles-options li {
list-style: none;
}
diff --git a/phpBB/adm/style/installer_footer.html b/phpBB/adm/style/installer_footer.html
index fefa8f6d3f..54e6951a12 100644
--- a/phpBB/adm/style/installer_footer.html
+++ b/phpBB/adm/style/installer_footer.html
@@ -6,7 +6,9 @@
<div id="page-footer">
<div class="copyright">
- Powered by <a href="https://www.phpbb.com/">phpBB</a>&reg; Forum Software &copy; phpBB Limited
+ {% if S_COPYRIGHT_HTML %}
+ {{ CREDIT_LINE }}
+ {% endif %}
</div>
</div>
</div>
diff --git a/phpBB/adm/style/installer_form.html b/phpBB/adm/style/installer_form.html
index a38f33c7c2..592d361d1e 100644
--- a/phpBB/adm/style/installer_form.html
+++ b/phpBB/adm/style/installer_form.html
@@ -1,3 +1,4 @@
+<!-- IF FORM_TITLE --><h1>{FORM_TITLE}</h1><!-- ENDIF -->
<form id="<!-- IF FORM_ID -->{FORM_ID}<!-- ELSE -->install_install<!-- ENDIF -->" method="POST" action="{U_ACTION}">
<!-- IF .options -->
<!-- IF S_NOT_ONLY_BUTTON_FORM -->
@@ -8,9 +9,9 @@
<!-- IF options.S_LEGEND -->
<!-- IF not options.S_FIRST_ROW -->
</fieldset>
-
- <fieldset>
<!-- ENDIF -->
+ <fieldset>
+
<legend>{options.LEGEND}</legend>
<!-- ELSE -->
<dl>
@@ -49,7 +50,7 @@
<fieldset class="submit-buttons">
<legend>{L_SUBMIT}</legend>
<!-- BEGIN submit_buttons -->
- <input class="button1<!-- IF submit_buttons.DISABLED --> disabled<!-- ENDIF -->" type="submit" name="{submit_buttons.KEY}" value="{submit_buttons.TITLE}"<!-- IF submit_buttons.DISABLED --> disabled="disabled"<!-- ENDIF --> />
+ <input class="<!-- IF not submit_buttons.IS_SECONDARY -->button1<!-- ELSE -->button2<!-- ENDIF --><!-- IF submit_buttons.DISABLED --> disabled<!-- ENDIF -->" type="submit" name="{submit_buttons.KEY}" value="{submit_buttons.TITLE}"<!-- IF submit_buttons.DISABLED --> disabled="disabled"<!-- ENDIF --> />
<!-- END submit_buttons -->
</fieldset>
<!-- ENDIF -->
diff --git a/phpBB/adm/style/permission_mask.html b/phpBB/adm/style/permission_mask.html
index 017d29d832..c556664b8c 100644
--- a/phpBB/adm/style/permission_mask.html
+++ b/phpBB/adm/style/permission_mask.html
@@ -41,7 +41,7 @@
<dt style="width: 20%"><label for="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}">{L_ROLE}{L_COLON}</label></dt>
{% if p_mask.f_mask.role_options %}
<dd style="margin-{S_CONTENT_FLOW_BEGIN}{L_COLON} 20%">
- <div class="dropdown-container dropdown-button-control roles-options" data-alt-text="{LA_ROLE_DESCRIPTION}">
+ <div class="dropdown-container dropdown-{S_CONTENT_FLOW_END} dropdown-button-control roles-options" data-alt-text="{LA_ROLE_DESCRIPTION}">
<select id="role{p_mask.S_ROW_COUNT}{p_mask.f_mask.S_ROW_COUNT}" name="role[{p_mask.f_mask.UG_ID}][{p_mask.f_mask.FORUM_ID}]">{p_mask.f_mask.S_ROLE_OPTIONS}</select>
<span title="Roles" class="button icon-button tools-icon dropdown-trigger dropdown-select">{L_NO_ROLE_ASSIGNED}</span>
<div class="dropdown hidden">
diff --git a/phpBB/adm/style/tooltip.js b/phpBB/adm/style/tooltip.js
index 8781e2b509..7b7abb11e6 100644
--- a/phpBB/adm/style/tooltip.js
+++ b/phpBB/adm/style/tooltip.js
@@ -130,10 +130,17 @@ phpbb.positionTooltip = function ($element) {
$element = $element.parent();
offset = $element.offset();
- $('#_tooltip_container').css({
- top: offset.top + 30,
- left: offset.left - 205
- });
+ if ($('body').hasClass('rtl')) {
+ $('#_tooltip_container').css({
+ top: offset.top + 30,
+ left: offset.left + 255
+ });
+ } else {
+ $('#_tooltip_container').css({
+ top: offset.top + 30,
+ left: offset.left - 205
+ });
+ }
};
/**
diff --git a/phpBB/assets/javascript/core.js b/phpBB/assets/javascript/core.js
index a88719f1df..5218a8c1be 100644
--- a/phpBB/assets/javascript/core.js
+++ b/phpBB/assets/javascript/core.js
@@ -20,6 +20,13 @@ var phpbbAlertTimer = null;
phpbb.isTouch = (window && typeof window.ontouchstart !== 'undefined');
+// Add ajax pre-filter to prevent cross-domain script execution
+$.ajaxPrefilter(function(s) {
+ if (s.crossDomain) {
+ s.contents.script = false;
+ }
+});
+
/**
* Display a loading screen
*
@@ -27,9 +34,9 @@ phpbb.isTouch = (window && typeof window.ontouchstart !== 'undefined');
*/
phpbb.loadingIndicator = function() {
if (!$loadingIndicator) {
- $loadingIndicator = $('<div />', {
- id: 'loading_indicator',
- class: 'loading_indicator',
+ $loadingIndicator = $('<div />', {
+ 'id': 'loading_indicator',
+ 'class': 'loading_indicator'
});
$loadingIndicator.appendTo('#page-footer');
}
@@ -179,7 +186,7 @@ phpbb.alert.close = function($alert, fadedark) {
phpbb.confirm = function(msg, callback, fadedark) {
var $confirmDiv = $('#phpbb_confirm');
$confirmDiv.find('.alert_text').html(msg);
- fadedark = fadedark !== 'undefined' ? fadedark : true;
+ fadedark = typeof fadedark !== 'undefined' ? fadedark : true;
$(document).on('keydown.phpbb.alert', function(e) {
if (e.keyCode === keymap.ENTER || e.keyCode === keymap.ESC) {
@@ -935,9 +942,9 @@ phpbb.addAjaxCallback('alt_text', function() {
$anchor.each(function() {
var $this = $(this);
altText = $this.attr('data-alt-text');
- $this.attr('data-alt-text', $this.text());
- $this.attr('title', $.trim(altText));
- $this.text(altText);
+ $this.attr('data-alt-text', $.trim($this.text()));
+ $this.attr('title', altText);
+ $this.children('span').text(altText);
});
});
@@ -1331,6 +1338,7 @@ phpbb.toggleDropdown = function() {
$this.css({
marginLeft: 0,
left: 0,
+ marginRight: 0,
maxWidth: (windowWidth - 4) + 'px'
});
@@ -1642,7 +1650,7 @@ phpbb.lazyLoadAvatars = function loadAvatars() {
});
};
-$(window).load(phpbb.lazyLoadAvatars);
+$(window).on('load', phpbb.lazyLoadAvatars);
/**
* Apply code editor to all textarea elements with data-bbcode attribute
@@ -1654,7 +1662,7 @@ $(function() {
phpbb.registerPageDropdowns();
- $('#color_palette_placeholder').each(function() {
+ $('[data-orientation]').each(function() {
phpbb.registerPalette($(this));
});
diff --git a/phpBB/assets/javascript/jquery.min.js b/phpBB/assets/javascript/jquery.min.js
index 73f33fb3aa..e836475870 100644
--- a/phpBB/assets/javascript/jquery.min.js
+++ b/phpBB/assets/javascript/jquery.min.js
@@ -1,4 +1,5 @@
-/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f
-}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)
-},a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});
+/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
+}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
+marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
+padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
diff --git a/phpBB/assets/javascript/plupload.js b/phpBB/assets/javascript/plupload.js
index 8b3543880f..fab1ca6d7c 100644
--- a/phpBB/assets/javascript/plupload.js
+++ b/phpBB/assets/javascript/plupload.js
@@ -21,7 +21,9 @@ phpbb.plupload.initialize = function() {
// Only execute if Plupload initialized successfully.
phpbb.plupload.uploader.bind('Init', function() {
phpbb.plupload.form = $(phpbb.plupload.config.form_hook)[0];
- phpbb.plupload.rowTpl = $('#attach-row-tpl')[0].outerHTML;
+ let $attachRowTemplate = $('#attach-row-tpl');
+ $attachRowTemplate.removeClass('attach-row-tpl');
+ phpbb.plupload.rowTpl = $attachRowTemplate[0].outerHTML;
// Hide the basic upload panel and remove the attach row template.
$('#attach-row-tpl, #attach-panel-basic').remove();
@@ -211,7 +213,7 @@ phpbb.plupload.updateHiddenData = function(row, attach, index) {
.attr('type', 'hidden')
.attr('name', 'attachment_data[' + index + '][' + key + ']')
.attr('value', attach[key]);
- $('textarea', row).after(input);
+ $(row).append(input);
}
};
diff --git a/phpBB/assets/plupload/plupload.full.min.js b/phpBB/assets/plupload/plupload.full.min.js
index 3d01e66083..a58489dc64 100644
--- a/phpBB/assets/plupload/plupload.full.min.js
+++ b/phpBB/assets/plupload/plupload.full.min.js
@@ -1,6 +1,6 @@
/**
* mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill
- * v1.5.5
+ * v1.5.7
*
* Copyright 2013, Moxiecode Systems AB
* Released under GPL License.
@@ -8,15 +8,15 @@
* License: http://www.plupload.com/license
* Contributing: http://www.plupload.com/contributing
*
- * Date: 2017-08-26
+ * Date: 2017-11-03
*/
-!function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.moxie};"function"==typeof define&&define.amd?define("moxie",[],i):"object"==typeof module&&module.exports?module.exports=i():e.moxie=i()}(this||window,function(){!function(e,t){"use strict";function i(e,t){for(var i,n=[],r=0;r<e.length;++r){if(i=s[e[r]]||o(e[r]),!i)throw"module definition dependecy not found: "+e[r];n.push(i)}t.apply(null,n)}function n(e,n,r){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(n===t)throw"invalid module definition, dependencies must be specified";if(r===t)throw"invalid module definition, definition function must be specified";i(n,function(){s[e]=r.apply(null,arguments)})}function r(e){return!!s[e]}function o(t){for(var i=e,n=t.split(/[.\/]/),r=0;r<n.length;++r){if(!i[n[r]])return;i=i[n[r]]}return i}function a(i){for(var n=0;n<i.length;n++){for(var r=e,o=i[n],a=o.split(/[.\/]/),u=0;u<a.length-1;++u)r[a[u]]===t&&(r[a[u]]={}),r=r[a[u]];r[a[a.length-1]]=s[o]}}var s={};n("moxie/core/utils/Basic",[],function(){function e(e){var t;return e===t?"undefined":null===e?"null":e.nodeType?"node":{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1].toLowerCase()}function t(){return s(!1,!1,arguments)}function i(){return s(!0,!1,arguments)}function n(){return s(!1,!0,arguments)}function r(){return s(!0,!0,arguments)}function o(t){switch(e(t)){case"array":return s(!1,!0,[[],t]);case"object":return s(!1,!0,[{},t]);default:return t}}function a(i){switch(e(i)){case"array":return Array.prototype.slice.call(i);case"object":return t({},i)}return i}function s(t,i,n){var r,o=n[0];return c(n,function(n,u){u>0&&c(n,function(n,u){var c=-1!==h(e(n),["array","object"]);return n===r||t&&o[u]===r?!0:(c&&i&&(n=a(n)),e(o[u])===e(n)&&c?s(t,i,[o[u],n]):o[u]=n,void 0)})}),o}function u(e,t){function i(){this.constructor=e}for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.super=t.prototype,e}function c(e,t){var i,n,r,o;if(e){try{i=e.length}catch(a){i=o}if(i===o||"number"!=typeof i){for(n in e)if(e.hasOwnProperty(n)&&t(e[n],n)===!1)return}else for(r=0;i>r;r++)if(t(e[r],r)===!1)return}}function l(t){var i;if(!t||"object"!==e(t))return!0;for(i in t)return!1;return!0}function d(t,i){function n(r){"function"===e(t[r])&&t[r](function(e){++r<o&&!e?n(r):i(e)})}var r=0,o=t.length;"function"!==e(i)&&(i=function(){}),t&&t.length||i(),n(r)}function m(e,t){var i=0,n=e.length,r=new Array(n);c(e,function(e,o){e(function(e){if(e)return t(e);var a=[].slice.call(arguments);a.shift(),r[o]=a,i++,i===n&&(r.unshift(null),t.apply(this,r))})})}function h(e,t){if(t){if(Array.prototype.indexOf)return Array.prototype.indexOf.call(t,e);for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i}return-1}function f(t,i){var n=[];"array"!==e(t)&&(t=[t]),"array"!==e(i)&&(i=[i]);for(var r in t)-1===h(t[r],i)&&n.push(t[r]);return n.length?n:!1}function p(e,t){var i=[];return c(e,function(e){-1!==h(e,t)&&i.push(e)}),i.length?i:null}function g(e){var t,i=[];for(t=0;t<e.length;t++)i[t]=e[t];return i}function x(e){return e?String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/,"").replace(/\s*$/,""):e}function v(e){if("string"!=typeof e)return e;var t,i={t:1099511627776,g:1073741824,m:1048576,k:1024};return e=/^([0-9\.]+)([tmgk]?)$/.exec(e.toLowerCase().replace(/[^0-9\.tmkg]/g,"")),t=e[2],e=+e[1],i.hasOwnProperty(t)&&(e*=i[t]),Math.floor(e)}function w(e){var t=[].slice.call(arguments,1);return e.replace(/%([a-z])/g,function(e,i){var n=t.shift();switch(i){case"s":return n+"";case"d":return parseInt(n,10);case"f":return parseFloat(n);case"c":return"";default:return n}})}function y(e,t){var i=this;setTimeout(function(){e.call(i)},t||1)}var E=function(){var e=0;return function(t){var i,n=(new Date).getTime().toString(32);for(i=0;5>i;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}();return{guid:E,typeOf:e,extend:t,extendIf:i,extendImmutable:n,extendImmutableIf:r,clone:o,inherit:u,each:c,isEmptyObj:l,inSeries:d,inParallel:m,inArray:h,arrayDiff:f,arrayIntersect:p,toArray:g,trim:x,sprintf:w,parseSizeStr:v,delay:y}}),n("moxie/core/utils/Encode",[],function(){var e=function(e){return unescape(encodeURIComponent(e))},t=function(e){return decodeURIComponent(escape(e))},i=function(e,i){if("function"==typeof window.atob)return i?t(window.atob(e)):window.atob(e);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!e)return e;e+="";do a=d.indexOf(e.charAt(m++)),s=d.indexOf(e.charAt(m++)),u=d.indexOf(e.charAt(m++)),c=d.indexOf(e.charAt(m++)),l=a<<18|s<<12|u<<6|c,n=255&l>>16,r=255&l>>8,o=255&l,p[h++]=64==u?String.fromCharCode(n):64==c?String.fromCharCode(n,r):String.fromCharCode(n,r,o);while(m<e.length);return f=p.join(""),i?t(f):f},n=function(t,i){if(i&&(t=e(t)),"function"==typeof window.btoa)return window.btoa(t);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!t)return t;do n=t.charCodeAt(m++),r=t.charCodeAt(m++),o=t.charCodeAt(m++),l=n<<16|r<<8|o,a=63&l>>18,s=63&l>>12,u=63&l>>6,c=63&l,p[h++]=d.charAt(a)+d.charAt(s)+d.charAt(u)+d.charAt(c);while(m<t.length);f=p.join("");var g=t.length%3;return(g?f.slice(0,g-3):f)+"===".slice(g||3)};return{utf8_encode:e,utf8_decode:t,atob:i,btoa:n}}),n("moxie/core/utils/Env",["moxie/core/utils/Basic"],function(e){function i(e,t,i){var n=0,r=0,o=0,a={dev:-6,alpha:-5,a:-5,beta:-4,b:-4,RC:-3,rc:-3,"#":-2,p:1,pl:1},s=function(e){return e=(""+e).replace(/[_\-+]/g,"."),e=e.replace(/([^.\d]+)/g,".$1.").replace(/\.{2,}/g,"."),e.length?e.split("."):[-8]},u=function(e){return e?isNaN(e)?a[e]||-7:parseInt(e,10):0};for(e=s(e),t=s(t),r=Math.max(e.length,t.length),n=0;r>n;n++)if(e[n]!=t[n]){if(e[n]=u(e[n]),t[n]=u(t[n]),e[n]<t[n]){o=-1;break}if(e[n]>t[n]){o=1;break}}if(!i)return o;switch(i){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return 0>=o;case"==":case"=":case"eq":return 0===o;case"<>":case"!=":case"ne":return 0!==o;case"":case"<":case"lt":return 0>o;default:return null}}var n=function(e){var t="",i="?",n="function",r="undefined",o="object",a="name",s="version",u={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},c={rgx:function(){for(var t,i,a,s,u,c,l,d=0,m=arguments;d<m.length;d+=2){var h=m[d],f=m[d+1];if(typeof t===r){t={};for(s in f)u=f[s],typeof u===o?t[u[0]]=e:t[u]=e}for(i=a=0;i<h.length;i++)if(c=h[i].exec(this.getUA())){for(s=0;s<f.length;s++)l=c[++a],u=f[s],typeof u===o&&u.length>0?2==u.length?t[u[0]]=typeof u[1]==n?u[1].call(this,l):u[1]:3==u.length?t[u[0]]=typeof u[1]!==n||u[1].exec&&u[1].test?l?l.replace(u[1],u[2]):e:l?u[1].call(this,l,u[2]):e:4==u.length&&(t[u[0]]=l?u[3].call(this,l.replace(u[1],u[2])):e):t[u]=l?l:e;break}if(c)break}return t},str:function(t,n){for(var r in n)if(typeof n[r]===o&&n[r].length>0){for(var a=0;a<n[r].length;a++)if(u.has(n[r][a],t))return r===i?e:r}else if(u.has(n[r],t))return r===i?e:r;return t}},l={browser:{oldsafari:{major:{1:["/8","/1","/3"],2:"/4","?":"/"},version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2000:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",RT:"ARM"}}}},d={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[a,s],[/\s(opr)\/([\w\.]+)/i],[[a,"Opera"],s],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i],[a,s],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[a,"IE"],s],[/(edge)\/((\d+)?[\w\.]+)/i],[a,s],[/(yabrowser)\/([\w\.]+)/i],[[a,"Yandex"],s],[/(comodo_dragon)\/([\w\.]+)/i],[[a,/_/g," "],s],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,/(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i],[a,s],[/(dolfin)\/([\w\.]+)/i],[[a,"Dolphin"],s],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[a,"Chrome"],s],[/XiaoMi\/MiuiBrowser\/([\w\.]+)/i],[s,[a,"MIUI Browser"]],[/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i],[s,[a,"Android Browser"]],[/FBAV\/([\w\.]+);/i],[s,[a,"Facebook"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[s,[a,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[s,a],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[a,[s,c.str,l.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[a,s],[/(navigator|netscape)\/([\w\.-]+)/i],[[a,"Netscape"],s],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[a,s]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[s,[a,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[a,s],[/rv\:([\w\.]+).*(gecko)/i],[s,a]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[a,s],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[a,[s,c.str,l.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[a,"Windows"],[s,c.str,l.os.windows.version]],[/\((bb)(10);/i],[[a,"BlackBerry"],s],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[a,s],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[a,"Symbian"],s],[/\((series40);/i],[a],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[a,"Firefox OS"],s],[/(nintendo|playstation)\s([wids3portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[a,s],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[a,"Chromium OS"],s],[/(sunos)\s?([\w\.]+\d)*/i],[[a,"Solaris"],s],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[a,s],[/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i],[[a,"iOS"],[s,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[a,"Mac OS"],[s,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(haiku)\s(\w+)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[a,s]]},m=function(e){var i=e||(window&&window.navigator&&window.navigator.userAgent?window.navigator.userAgent:t);this.getBrowser=function(){return c.rgx.apply(this,d.browser)},this.getEngine=function(){return c.rgx.apply(this,d.engine)},this.getOS=function(){return c.rgx.apply(this,d.os)},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS()}},this.getUA=function(){return i},this.setUA=function(e){return i=e,this},this.setUA(i)};return m}(),r=function(){var i={access_global_ns:function(){return!!window.moxie},define_property:function(){return!1}(),create_canvas:function(){var e=document.createElement("canvas"),t=!(!e.getContext||!e.getContext("2d"));return i.create_canvas=t,t},return_response_type:function(t){try{if(-1!==e.inArray(t,["","text","document"]))return!0;if(window.XMLHttpRequest){var i=new XMLHttpRequest;if(i.open("get","/"),"responseType"in i)return i.responseType=t,i.responseType!==t?!1:!0}}catch(n){}return!1},use_blob_uri:function(){var e=window.URL;return e&&"createObjectURL"in e&&"revokeObjectURL"in e}(),use_data_uri:function(){var e=new Image;return e.onload=function(){i.use_data_uri=1===e.width&&1===e.height},setTimeout(function(){e.src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="},1),!1}(),use_data_uri_over32kb:function(){return i.use_data_uri&&("IE"!==a.browser||a.version>=9)},use_data_uri_of:function(e){return i.use_data_uri&&33e3>e||i.use_data_uri_over32kb()},use_fileinput:function(){if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/))return!1;var e=document.createElement("input");return e.setAttribute("type","file"),i.use_fileinput=!e.disabled},use_webgl:function(){var e,n=document.createElement("canvas"),r=null;try{r=n.getContext("webgl")||n.getContext("experimental-webgl")}catch(o){}return r||(r=null),e=!!r,i.use_webgl=e,n=t,e}};return function(t){var n=[].slice.call(arguments);return n.shift(),"function"===e.typeOf(i[t])?i[t].apply(this,n):!!i[t]}}(),o=(new n).getResult(),a={can:r,uaParser:n,browser:o.browser.name,version:o.browser.version,os:o.os.name,osVersion:o.os.version,verComp:i,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return a.OS=a.os,a}),n("moxie/core/Exceptions",["moxie/core/utils/Basic"],function(e){function t(e,t){var i;for(i in e)if(e[i]===t)return i;return null}return{RuntimeError:function(){function i(e,i){this.code=e,this.name=t(n,e),this.message=this.name+(i||": RuntimeError "+this.code)}var n={NOT_INIT_ERR:1,EXCEPTION_ERR:3,NOT_SUPPORTED_ERR:9,JS_ERR:4};return e.extend(i,n),i.prototype=Error.prototype,i}(),OperationNotAllowedException:function(){function t(e){this.code=e,this.name="OperationNotAllowedException"}return e.extend(t,{NOT_ALLOWED_ERR:1}),t.prototype=Error.prototype,t}(),ImageError:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": ImageError "+this.code}var n={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2,INVALID_META_ERR:3};return e.extend(i,n),i.prototype=Error.prototype,i}(),FileException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": FileException "+this.code}var n={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};return e.extend(i,n),i.prototype=Error.prototype,i}(),DOMException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": DOMException "+this.code}var n={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};return e.extend(i,n),i.prototype=Error.prototype,i}(),EventException:function(){function t(e){this.code=e,this.name="EventException"}return e.extend(t,{UNSPECIFIED_EVENT_TYPE_ERR:0}),t.prototype=Error.prototype,t}()}}),n("moxie/core/utils/Dom",["moxie/core/utils/Env"],function(e){var t=function(e){return"string"!=typeof e?e:document.getElementById(e)},i=function(e,t){if(!e.className)return!1;var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return i.test(e.className)},n=function(e,t){i(e,t)||(e.className=e.className?e.className.replace(/\s+$/,"")+" "+t:t)},r=function(e,t){if(e.className){var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(i,function(e,t,i){return" "===t&&" "===i?" ":""})}},o=function(e,t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e,null)[t]:void 0},a=function(t,i){function n(e){var t,i,n=0,r=0;return e&&(i=e.getBoundingClientRect(),t="CSS1Compat"===c.compatMode?c.documentElement:c.body,n=i.left+t.scrollLeft,r=i.top+t.scrollTop),{x:n,y:r}}var r,o,a,s=0,u=0,c=document;if(t=t,i=i||c.body,t&&t.getBoundingClientRect&&"IE"===e.browser&&(!c.documentMode||c.documentMode<8))return o=n(t),a=n(i),{x:o.x-a.x,y:o.y-a.y};for(r=t;r&&r!=i&&r.nodeType;)s+=r.offsetLeft||0,u+=r.offsetTop||0,r=r.offsetParent;for(r=t.parentNode;r&&r!=i&&r.nodeType;)s-=r.scrollLeft||0,u-=r.scrollTop||0,r=r.parentNode;return{x:s,y:u}},s=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:t,hasClass:i,addClass:n,removeClass:r,getStyle:o,getPos:a,getSize:s}}),n("moxie/core/EventTarget",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic"],function(e,t,i){function n(){this.uid=i.guid()}var r={};return i.extend(n.prototype,{init:function(){this.uid||(this.uid=i.guid("uid_"))},addEventListener:function(e,t,n,o){var a,s=this;return this.hasOwnProperty("uid")||(this.uid=i.guid("uid_")),e=i.trim(e),/\s/.test(e)?(i.each(e.split(/\s+/),function(e){s.addEventListener(e,t,n,o)}),void 0):(e=e.toLowerCase(),n=parseInt(n,10)||0,a=r[this.uid]&&r[this.uid][e]||[],a.push({fn:t,priority:n,scope:o||this}),r[this.uid]||(r[this.uid]={}),r[this.uid][e]=a,void 0)},hasEventListener:function(e){var t;return e?(e=e.toLowerCase(),t=r[this.uid]&&r[this.uid][e]):t=r[this.uid],t?t:!1},removeEventListener:function(e,t){var n,o,a=this;if(e=e.toLowerCase(),/\s/.test(e))return i.each(e.split(/\s+/),function(e){a.removeEventListener(e,t)}),void 0;if(n=r[this.uid]&&r[this.uid][e]){if(t){for(o=n.length-1;o>=0;o--)if(n[o].fn===t){n.splice(o,1);break}}else n=[];n.length||(delete r[this.uid][e],i.isEmptyObj(r[this.uid])&&delete r[this.uid])}},removeAllEventListeners:function(){r[this.uid]&&delete r[this.uid]},dispatchEvent:function(e){var n,o,a,s,u,c={},l=!0;if("string"!==i.typeOf(e)){if(s=e,"string"!==i.typeOf(s.type))throw new t.EventException(t.EventException.UNSPECIFIED_EVENT_TYPE_ERR);e=s.type,s.total!==u&&s.loaded!==u&&(c.total=s.total,c.loaded=s.loaded),c.async=s.async||!1}if(-1!==e.indexOf("::")?function(t){n=t[0],e=t[1]}(e.split("::")):n=this.uid,e=e.toLowerCase(),o=r[n]&&r[n][e]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),c.type=e,a.unshift(c);var d=[];i.each(o,function(e){a[0].target=e.scope,c.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}):d.push(function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&i.inSeries(d,function(e){l=!e})}return l},bindOnce:function(e,t,i,n){var r=this;r.bind.call(this,e,function o(){return r.unbind(e,o),t.apply(this,arguments)},i,n)},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},handleEventProps:function(e){var t=this;this.bind(e.join(" "),function(e){var t="on"+e.type.toLowerCase();"function"===i.typeOf(this[t])&&this[t].apply(this,arguments)}),i.each(e,function(e){e="on"+e.toLowerCase(e),"undefined"===i.typeOf(t[e])&&(t[e]=null)})}}),n.instance=new n,n}),n("moxie/runtime/Runtime",["moxie/core/utils/Env","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/EventTarget"],function(e,t,i,n){function r(e,n,o,s,u){var c,l=this,d=t.guid(n+"_"),m=u||"browser";e=e||{},a[d]=this,o=t.extend({access_binary:!1,access_image_binary:!1,display_media:!1,do_cors:!1,drag_and_drop:!1,filter_by_extension:!0,resize_image:!1,report_upload_progress:!1,return_response_headers:!1,return_response_type:!1,return_status_code:!0,send_custom_headers:!1,select_file:!1,select_folder:!1,select_multiple:!0,send_binary_string:!1,send_browser_cookies:!0,send_multipart:!0,slice_blob:!1,stream_upload:!1,summon_file_dialog:!1,upload_filesize:!0,use_http_method:!0},o),e.preferred_caps&&(m=r.getMode(s,e.preferred_caps,m)),c=function(){var e={};return{exec:function(t,i,n,r){return c[i]&&(e[t]||(e[t]={context:this,instance:new c[i]}),e[t].instance[n])?e[t].instance[n].apply(this,r):void 0},removeInstance:function(t){delete e[t]},removeAllInstances:function(){var i=this;t.each(e,function(e,n){"function"===t.typeOf(e.instance.destroy)&&e.instance.destroy.call(e.context),i.removeInstance(n)})}}}(),t.extend(this,{initialized:!1,uid:d,type:n,mode:r.getMode(s,e.required_caps,m),shimid:d+"_container",clients:0,options:e,can:function(e,i){var n=arguments[2]||o;if("string"===t.typeOf(e)&&"undefined"===t.typeOf(i)&&(e=r.parseCaps(e)),"object"===t.typeOf(e)){for(var a in e)if(!this.can(a,e[a],n))return!1;return!0}return"function"===t.typeOf(n[e])?n[e].call(this,i):i===n[e]},getShimContainer:function(){var e,n=i.get(this.shimid);return n||(e=i.get(this.options.container)||document.body,n=document.createElement("div"),n.id=this.shimid,n.className="moxie-shim moxie-shim-"+this.type,t.extend(n.style,{position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),e.appendChild(n),e=null),n},getShim:function(){return c},shimExec:function(e,t){var i=[].slice.call(arguments,2);return l.getShim().exec.call(this,this.uid,e,t,i)},exec:function(e,t){var i=[].slice.call(arguments,2);return l[e]&&l[e][t]?l[e][t].apply(this,i):l.shimExec.apply(this,arguments)},destroy:function(){if(l){var e=i.get(this.shimid);e&&e.parentNode.removeChild(e),c&&c.removeAllInstances(),this.unbindAll(),delete a[this.uid],this.uid=null,d=l=c=e=null}}}),this.mode&&e.required_caps&&!this.can(e.required_caps)&&(this.mode=!1)}var o={},a={};return r.order="html5,flash,silverlight,html4",r.getRuntime=function(e){return a[e]?a[e]:!1},r.addConstructor=function(e,t){t.prototype=n.instance,o[e]=t},r.getConstructor=function(e){return o[e]||null},r.getInfo=function(e){var t=r.getRuntime(e);return t?{uid:t.uid,type:t.type,mode:t.mode,can:function(){return t.can.apply(t,arguments)}}:null},r.parseCaps=function(e){var i={};return"string"!==t.typeOf(e)?e||{}:(t.each(e.split(","),function(e){i[e]=!0}),i)},r.can=function(e,t){var i,n,o=r.getConstructor(e);return o?(i=new o({required_caps:t}),n=i.mode,i.destroy(),!!n):!1},r.thatCan=function(e,t){var i=(t||r.order).split(/\s*,\s*/);for(var n in i)if(r.can(i[n],e))return i[n];return null},r.getMode=function(e,i,n){var r=null;if("undefined"===t.typeOf(n)&&(n="browser"),i&&!t.isEmptyObj(e)){if(t.each(i,function(i,n){if(e.hasOwnProperty(n)){var o=e[n](i);if("string"==typeof o&&(o=[o]),r){if(!(r=t.arrayIntersect(r,o)))return r=!1}else r=o}}),r)return-1!==t.inArray(n,r)?n:r[0];if(r===!1)return!1}return n},r.getGlobalEventTarget=function(){if(/^moxie\./.test(e.global_event_dispatcher)&&!e.can("access_global_ns")){var i=t.guid("moxie_event_target_");window[i]=function(e,t){n.instance.dispatchEvent(e,t)},e.global_event_dispatcher=i}return e.global_event_dispatcher},r.capTrue=function(){return!0},r.capFalse=function(){return!1},r.capTest=function(e){return function(){return!!e}},r}),n("moxie/runtime/RuntimeClient",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/Runtime"],function(e,t,i,n){return function(){var e;i.extend(this,{connectRuntime:function(r){function o(i){var a,u;return i.length?(a=i.shift().toLowerCase(),(u=n.getConstructor(a))?(e=new u(r),e.bind("Init",function(){e.initialized=!0,setTimeout(function(){e.clients++,s.ruid=e.uid,s.trigger("RuntimeInit",e)},1)}),e.bind("Error",function(){e.destroy(),o(i)}),e.bind("Exception",function(e,i){var n=i.name+"(#"+i.code+")"+(i.message?", from: "+i.message:"");s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.EXCEPTION_ERR,n))}),e.mode?(e.init(),void 0):(e.trigger("Error"),void 0)):(o(i),void 0)):(s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)),e=null,void 0)}var a,s=this;if("string"===i.typeOf(r)?a=r:"string"===i.typeOf(r.ruid)&&(a=r.ruid),a){if(e=n.getRuntime(a))return s.ruid=a,e.clients++,e;throw new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)}o((r.runtime_order||n.order).split(/\s*,\s*/))},disconnectRuntime:function(){e&&--e.clients<=0&&e.destroy(),e=null},getRuntime:function(){return e&&e.uid?e:e=null},exec:function(){return e?e.exec.apply(this,arguments):null},can:function(t){return e?e.can(t):!1}})}}),n("moxie/file/Blob",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient"],function(e,t,i){function n(o,a){function s(t,i,o){var a,s=r[this.uid];return"string"===e.typeOf(s)&&s.length?(a=new n(null,{type:o,size:i-t}),a.detach(s.substr(t,a.size)),a):null}i.call(this),o&&this.connectRuntime(o),a?"string"===e.typeOf(a)&&(a={data:a}):a={},e.extend(this,{uid:a.uid||e.guid("uid_"),ruid:o,size:a.size||0,type:a.type||"",slice:function(e,t,i){return this.isDetached()?s.apply(this,arguments):this.getRuntime().exec.call(this,"Blob","slice",this.getSource(),e,t,i)},getSource:function(){return r[this.uid]?r[this.uid]:null},detach:function(e){if(this.ruid&&(this.getRuntime().exec.call(this,"Blob","destroy"),this.disconnectRuntime(),this.ruid=null),e=e||"","data:"==e.substr(0,5)){var i=e.indexOf(";base64,");this.type=e.substring(5,i),e=t.atob(e.substring(i+8))}this.size=e.length,r[this.uid]=e},isDetached:function(){return!this.ruid&&"string"===e.typeOf(r[this.uid])},destroy:function(){this.detach(),delete r[this.uid]}}),a.data?this.detach(a.data):r[this.uid]=a}var r={};return n}),n("moxie/core/I18n",["moxie/core/utils/Basic"],function(e){var t={};return{addI18n:function(i){return e.extend(t,i)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var i=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=i.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),n("moxie/core/utils/Mime",["moxie/core/utils/Basic","moxie/core/I18n"],function(e,t){var i="application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb xlt xla,application/vnd.ms-powerpoint,ppt pps pot ppa,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe",n={mimes:{},extensions:{},addMimeType:function(e){var t,i,n,r=e.split(/,/);for(t=0;t<r.length;t+=2){for(n=r[t+1].split(/ /),i=0;i<n.length;i++)this.mimes[n[i]]=r[t];this.extensions[r[t]]=n}},extList2mimes:function(t,i){var n,r,o,a,s=this,u=[];for(r=0;r<t.length;r++)for(n=t[r].extensions.toLowerCase().split(/\s*,\s*/),o=0;o<n.length;o++){if("*"===n[o])return[];if(a=s.mimes[n[o]],i&&/^\w+$/.test(n[o]))u.push("."+n[o]);else if(a&&-1===e.inArray(a,u))u.push(a);else if(!a)return[]}return u},mimes2exts:function(t){var i=this,n=[];return e.each(t,function(t){if(t=t.toLowerCase(),"*"===t)return n=[],!1;var r=t.match(/^(\w+)\/(\*|\w+)$/);r&&("*"===r[2]?e.each(i.extensions,function(e,t){new RegExp("^"+r[1]+"/").test(t)&&[].push.apply(n,i.extensions[t])}):i.extensions[t]&&[].push.apply(n,i.extensions[t]))}),n},mimes2extList:function(i){var n=[],r=[];return"string"===e.typeOf(i)&&(i=e.trim(i).split(/\s*,\s*/)),r=this.mimes2exts(i),n.push({title:t.translate("Files"),extensions:r.length?r.join(","):"*"}),n},getFileExtension:function(e){var t=e&&e.match(/\.([^.]+)$/);return t?t[1].toLowerCase():""},getFileMime:function(e){return this.mimes[this.getFileExtension(e)]||""}};return n.addMimeType(i),n}),n("moxie/file/FileInput",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Mime","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/I18n","moxie/runtime/Runtime","moxie/runtime/RuntimeClient"],function(e,t,i,n,r,o,a,s,u){function c(t){var o,c,d;if(-1!==e.inArray(e.typeOf(t),["string","node"])&&(t={browse_button:t}),c=n.get(t.browse_button),!c)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR);d={accept:[{title:a.translate("All Files"),extensions:"*"}],multiple:!1,required_caps:!1,container:c.parentNode||document.body},t=e.extend({},d,t),"string"==typeof t.required_caps&&(t.required_caps=s.parseCaps(t.required_caps)),"string"==typeof t.accept&&(t.accept=i.mimes2extList(t.accept)),o=n.get(t.container),o||(o=document.body),"static"===n.getStyle(o,"position")&&(o.style.position="relative"),o=c=null,u.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,shimid:null,files:null,init:function(){var i=this;i.bind("RuntimeInit",function(r,o){i.ruid=o.uid,i.shimid=o.shimid,i.bind("Ready",function(){i.trigger("Refresh")},999),i.bind("Refresh",function(){var i,r,a,s,u;a=n.get(t.browse_button),s=n.get(o.shimid),a&&(i=n.getPos(a,n.get(t.container)),r=n.getSize(a),u=parseInt(n.getStyle(a,"z-index"),10)||0,s&&e.extend(s.style,{top:i.y+"px",left:i.x+"px",width:r.w+"px",height:r.h+"px",zIndex:u+1})),s=a=null}),o.exec.call(i,"FileInput","init",t)}),i.connectRuntime(e.extend({},t,{required_caps:{select_file:!0}}))},getOption:function(e){return t[e]},setOption:function(e,n){if(t.hasOwnProperty(e)){var o=t[e];switch(e){case"accept":"string"==typeof n&&(n=i.mimes2extList(n));break;case"container":case"required_caps":throw new r.FileException(r.FileException.NO_MODIFICATION_ALLOWED_ERR)}t[e]=n,this.exec("FileInput","setOption",e,n),this.trigger("OptionChanged",e,n,o)}},disable:function(t){var i=this.getRuntime();i&&this.exec("FileInput","disable","undefined"===e.typeOf(t)?!0:t)},refresh:function(){this.trigger("Refresh")},destroy:function(){var t=this.getRuntime();t&&(t.exec.call(this,"FileInput","destroy"),this.disconnectRuntime()),"array"===e.typeOf(this.files)&&e.each(this.files,function(e){e.destroy()}),this.files=null,this.unbindAll()}}),this.handleEventProps(l)}var l=["ready","change","cancel","mouseenter","mouseleave","mousedown","mouseup"];return c.prototype=o.instance,c}),n("moxie/file/File",["moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/file/Blob"],function(e,t,i){function n(n,r){r||(r={}),i.apply(this,arguments),this.type||(this.type=t.getFileMime(r.name));var o;if(r.name)o=r.name.replace(/\\/g,"/"),o=o.substr(o.lastIndexOf("/")+1);else if(this.type){var a=this.type.split("/")[0];o=e.guid((""!==a?a:"file")+"_"),t.extensions[this.type]&&(o+="."+t.extensions[this.type][0])}e.extend(this,{name:o||e.guid("file_"),relativePath:"",lastModifiedDate:r.lastModifiedDate||(new Date).toLocaleString()})}return n.prototype=i.prototype,n}),n("moxie/file/FileDrop",["moxie/core/I18n","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/core/utils/Env","moxie/file/File","moxie/runtime/RuntimeClient","moxie/core/EventTarget","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u){function c(i){var r,o=this;"string"==typeof i&&(i={drop_zone:i}),r={accept:[{title:e.translate("All Files"),extensions:"*"}],required_caps:{drag_and_drop:!0}},i="object"==typeof i?n.extend({},r,i):r,i.container=t.get(i.drop_zone)||document.body,"static"===t.getStyle(i.container,"position")&&(i.container.style.position="relative"),"string"==typeof i.accept&&(i.accept=u.mimes2extList(i.accept)),a.call(o),n.extend(o,{uid:n.guid("uid_"),ruid:null,files:null,init:function(){o.bind("RuntimeInit",function(e,t){o.ruid=t.uid,t.exec.call(o,"FileDrop","init",i),o.dispatchEvent("ready")
-}),o.connectRuntime(i)},destroy:function(){var e=this.getRuntime();e&&(e.exec.call(this,"FileDrop","destroy"),this.disconnectRuntime()),this.files=null,this.unbindAll()}}),this.handleEventProps(l)}var l=["ready","dragenter","dragleave","drop","error"];return c.prototype=s.instance,c}),n("moxie/file/FileReader",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/Exceptions","moxie/core/EventTarget","moxie/file/Blob","moxie/runtime/RuntimeClient"],function(e,t,i,n,r,o){function a(){function n(e,n){if(this.trigger("loadstart"),this.readyState===a.LOADING)return this.trigger("error",new i.DOMException(i.DOMException.INVALID_STATE_ERR)),this.trigger("loadend"),void 0;if(!(n instanceof r))return this.trigger("error",new i.DOMException(i.DOMException.NOT_FOUND_ERR)),this.trigger("loadend"),void 0;if(this.result=null,this.readyState=a.LOADING,n.isDetached()){var o=n.getSource();switch(e){case"readAsText":case"readAsBinaryString":this.result=o;break;case"readAsDataURL":this.result="data:"+n.type+";base64,"+t.btoa(o)}this.readyState=a.DONE,this.trigger("load"),this.trigger("loadend")}else this.connectRuntime(n.ruid),this.exec("FileReader","read",e,n)}o.call(this),e.extend(this,{uid:e.guid("uid_"),readyState:a.EMPTY,result:null,error:null,readAsBinaryString:function(e){n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){n.call(this,"readAsDataURL",e)},readAsText:function(e){n.call(this,"readAsText",e)},abort:function(){this.result=null,-1===e.inArray(this.readyState,[a.EMPTY,a.DONE])&&(this.readyState===a.LOADING&&(this.readyState=a.DONE),this.exec("FileReader","abort"),this.trigger("abort"),this.trigger("loadend"))},destroy:function(){this.abort(),this.exec("FileReader","destroy"),this.disconnectRuntime(),this.unbindAll()}}),this.handleEventProps(s),this.bind("Error",function(e,t){this.readyState=a.DONE,this.error=t},999),this.bind("Load",function(){this.readyState=a.DONE},999)}var s=["loadstart","progress","load","abort","error","loadend"];return a.EMPTY=0,a.LOADING=1,a.DONE=2,a.prototype=n.instance,a}),n("moxie/core/utils/Url",["moxie/core/utils/Basic"],function(e){var t=function(i,n){var r,o=["source","scheme","authority","userInfo","user","pass","host","port","relative","path","directory","file","query","fragment"],a=o.length,s={http:80,https:443},u={},c=/^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?(\[[\da-fA-F:]+\]|[^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,l=c.exec(i||""),d=/^\/\/\w/.test(i);switch(e.typeOf(n)){case"undefined":n=t(document.location.href,!1);break;case"string":n=t(n,!1)}for(;a--;)l[a]&&(u[o[a]]=l[a]);if(r=!d&&!u.scheme,(d||r)&&(u.scheme=n.scheme),r){u.host=n.host,u.port=n.port;var m="";/^[^\/]/.test(u.path)&&(m=n.path,m=/\/[^\/]*\.[^\/]*$/.test(m)?m.replace(/\/[^\/]+$/,"/"):m.replace(/\/?$/,"/")),u.path=m+(u.path||"")}return u.port||(u.port=s[u.scheme]||80),u.port=parseInt(u.port,10),u.path||(u.path="/"),delete u.source,u},i=function(e){var i={http:80,https:443},n="object"==typeof e?e:t(e);return n.scheme+"://"+n.host+(n.port!==i[n.scheme]?":"+n.port:"")+n.path+(n.query?n.query:"")},n=function(e){function i(e){return[e.scheme,e.host,e.port].join("/")}return"string"==typeof e&&(e=t(e)),i(t())===i(e)};return{parseUrl:t,resolveUrl:i,hasSameOrigin:n}}),n("moxie/runtime/RuntimeTarget",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i){function n(){this.uid=e.guid("uid_"),t.call(this),this.destroy=function(){this.disconnectRuntime(),this.unbindAll()}}return n.prototype=i.instance,n}),n("moxie/file/FileReaderSync",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/utils/Encode"],function(e,t,i){return function(){function n(e,t){if(!t.isDetached()){var n=this.connectRuntime(t.ruid).exec.call(this,"FileReaderSync","read",e,t);return this.disconnectRuntime(),n}var r=t.getSource();switch(e){case"readAsBinaryString":return r;case"readAsDataURL":return"data:"+t.type+";base64,"+i.btoa(r);case"readAsText":for(var o="",a=0,s=r.length;s>a;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return n.call(this,"readAsDataURL",e)},readAsText:function(e){return n.call(this,"readAsText",e)}})}}),n("moxie/xhr/FormData",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/file/Blob"],function(e,t,i){function n(){var e,n=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof i?e={name:r,value:o}:"array"===s?(r+="[]",t.each(o,function(e){a.append(r,e)})):"object"===s?t.each(o,function(e,t){a.append(r+"["+t+"]",e)}):"null"===s||"undefined"===s||"number"===s&&isNaN(o)?a.append(r,"false"):n.push({name:r,value:o.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return e&&e.value||null},getBlobName:function(){return e&&e.name||null},each:function(i){t.each(n,function(e){i(e.value,e.name)}),e&&i(e.value,e.name)},destroy:function(){e=null,n=[]}})}return n}),n("moxie/xhr/XMLHttpRequest",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/utils/Encode","moxie/core/utils/Url","moxie/runtime/Runtime","moxie/runtime/RuntimeTarget","moxie/file/Blob","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/core/utils/Env","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u,c,l,d){function m(){this.uid=e.guid("uid_")}function h(){function i(e,t){return I.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?I[e]:A[e]:(l.can("define_property")?I[e]=t:A[e]=t,void 0):void 0}function u(t){function n(){R&&(R.destroy(),R=null),s.dispatchEvent("loadend"),s=null}function r(r){R.bind("LoadStart",function(e){i("readyState",h.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),L&&s.upload.dispatchEvent(e)}),R.bind("Progress",function(e){i("readyState")!==h.LOADING&&(i("readyState",h.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),R.bind("UploadProgress",function(e){L&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),R.bind("Load",function(t){i("readyState",h.DONE),i("status",Number(r.exec.call(R,"XMLHttpRequest","getStatus")||0)),i("statusText",f[i("status")]||""),i("response",r.exec.call(R,"XMLHttpRequest","getResponse",i("responseType"))),~e.inArray(i("responseType"),["text",""])?i("responseText",i("response")):"document"===i("responseType")&&i("responseXML",i("response")),U=r.exec.call(R,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),i("status")>0?(L&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(F=!0,s.dispatchEvent("error")),n()}),R.bind("Abort",function(e){s.dispatchEvent(e),n()}),R.bind("Error",function(e){F=!0,i("readyState",h.DONE),s.dispatchEvent("readystatechange"),M=!0,s.dispatchEvent(e),n()}),r.exec.call(R,"XMLHttpRequest","send",{url:x,method:v,async:T,user:w,password:y,headers:S,mimeType:D,encoding:O,responseType:s.responseType,withCredentials:s.withCredentials,options:k},t)}var s=this;E=(new Date).getTime(),R=new a,"string"==typeof k.required_caps&&(k.required_caps=o.parseCaps(k.required_caps)),k.required_caps=e.extend({},k.required_caps,{return_response_type:s.responseType}),t instanceof c&&(k.required_caps.send_multipart=!0),e.isEmptyObj(S)||(k.required_caps.send_custom_headers=!0),B||(k.required_caps.do_cors=!0),k.ruid?r(R.connectRuntime(k)):(R.bind("RuntimeInit",function(e,t){r(t)}),R.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),R.connectRuntime(k))}function g(){i("responseText",""),i("responseXML",null),i("response",null),i("status",0),i("statusText",""),E=b=null}var x,v,w,y,E,b,R,_,A=this,I={timeout:0,readyState:h.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},T=!0,S={},O=null,D=null,N=!1,C=!1,L=!1,M=!1,F=!1,B=!1,P=null,H=null,k={},U="";e.extend(this,I,{uid:e.guid("uid_"),upload:new m,open:function(o,a,s,u,c){var l;if(!o||!a)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(o)||n.utf8_encode(o)!==o)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(~e.inArray(o.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"])&&(v=o.toUpperCase()),~e.inArray(v,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=n.utf8_encode(a),l=r.parseUrl(a),B=r.hasSameOrigin(l),x=r.resolveUrl(a),(u||c)&&!B)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(w=u||l.user,y=c||l.pass,T=s||!0,T===!1&&(i("timeout")||i("withCredentials")||""!==i("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);N=!T,C=!1,S={},g.call(this),i("readyState",h.OPENED),this.dispatchEvent("readystatechange")},setRequestHeader:function(r,o){var a=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(i("readyState")!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||n.utf8_encode(r)!==r)throw new t.DOMException(t.DOMException.SYNTAX_ERR);return r=e.trim(r).toLowerCase(),~e.inArray(r,a)||/^(proxy\-|sec\-)/.test(r)?!1:(S[r]?S[r]+=", "+o:S[r]=o,!0)},hasRequestHeader:function(e){return e&&S[e.toLowerCase()]||!1},getAllResponseHeaders:function(){return U||""},getResponseHeader:function(t){return t=t.toLowerCase(),F||~e.inArray(t,["set-cookie","set-cookie2"])?null:U&&""!==U&&(_||(_={},e.each(U.split(/\r\n/),function(t){var i=t.split(/:\s+/);2===i.length&&(i[0]=e.trim(i[0]),_[i[0].toLowerCase()]={header:i[0],value:e.trim(i[1])})})),_.hasOwnProperty(t))?_[t].header+": "+_[t].value:null},overrideMimeType:function(n){var r,o;if(~e.inArray(i("readyState"),[h.LOADING,h.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n=e.trim(n.toLowerCase()),/;/.test(n)&&(r=n.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(n=r[1],r[2]&&(o=r[2])),!d.mimes[n])throw new t.DOMException(t.DOMException.SYNTAX_ERR);P=n,H=o},send:function(i,r){if(k="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.readyState!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i instanceof s)k.ruid=i.ruid,D=i.type||"application/octet-stream";else if(i instanceof c){if(i.hasBlob()){var o=i.getBlob();k.ruid=o.ruid,D=o.type||"application/octet-stream"}}else"string"==typeof i&&(O="UTF-8",D="text/plain;charset=UTF-8",i=n.utf8_encode(i));this.withCredentials||(this.withCredentials=k.required_caps&&k.required_caps.send_browser_cookies&&!B),L=!N&&this.upload.hasEventListener(),F=!1,M=!i,N||(C=!0),u.call(this,i)},abort:function(){if(F=!0,N=!1,~e.inArray(i("readyState"),[h.UNSENT,h.OPENED,h.DONE]))i("readyState",h.UNSENT);else{if(i("readyState",h.DONE),C=!1,!R)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);R.getRuntime().exec.call(R,"XMLHttpRequest","abort",M),M=!0}},destroy:function(){R&&("function"===e.typeOf(R.destroy)&&R.destroy(),R=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}}),this.handleEventProps(p.concat(["readystatechange"])),this.upload.handleEventProps(p)}var f={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};m.prototype=i.instance;var p=["loadstart","progress","abort","error","load","timeout","loadend"];return h.UNSENT=0,h.OPENED=1,h.HEADERS_RECEIVED=2,h.LOADING=3,h.DONE=4,h.prototype=i.instance,h}),n("moxie/runtime/Transporter",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i,n){function r(){function n(){l=d=0,c=this.result=null}function o(t,i){var n=this;u=i,n.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(n.state,[r.IDLE,r.DONE])&&a.call(n)},999),n.bind("TransportingComplete",function(){d=l,n.state=r.DONE,c=null,n.result=u.exec.call(n,"Transporter","getAsBlob",t||"")},999),n.state=r.BUSY,n.trigger("TransportingStarted"),a.call(n)}function a(){var e,i=this,n=l-d;m>n&&(m=n),e=t.btoa(c.substr(d,m)),u.exec.call(i,"Transporter","receive",e,l)}var s,u,c,l,d,m;i.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,i,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),m=r.chunk_size,n.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,i,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,i,t)};this.bind("RuntimeInit",u),this.connectRuntime(r)}},abort:function(){var e=this;e.state=r.IDLE,u&&(u.exec.call(e,"Transporter","clear"),e.trigger("TransportingAborted")),n.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),n.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=n.instance,r}),n("moxie/image/Image",["moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/file/FileReaderSync","moxie/xhr/XMLHttpRequest","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/runtime/Transporter","moxie/core/utils/Env","moxie/core/EventTarget","moxie/file/Blob","moxie/file/File","moxie/core/utils/Encode"],function(e,t,i,n,r,o,a,s,u,c,l,d,m){function h(){function n(e){try{return e||(e=this.exec("Image","getInfo")),this.size=e.size,this.width=e.width,this.height=e.height,this.type=e.type,this.meta=e.meta,""===this.name&&(this.name=e.name),!0}catch(t){return this.trigger("error",t.code),!1}}function c(t){var n=e.typeOf(t);try{if(t instanceof h){if(!t.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);p.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new i.ImageError(i.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(n,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===n)"data:"===t.substr(0,5)?c.call(this,new l(null,{data:t}),arguments[1]):x.apply(this,arguments);else{if("node"!==n||"img"!==t.nodeName.toLowerCase())throw new i.DOMException(i.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r.code)}}function p(t,i){var n=this.connectRuntime(t.ruid);this.ruid=n.uid,n.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(i)?!0:i)}function g(t,i){function n(e){r.ruid=e.uid,e.exec.call(r,"Image","loadFromBlob",t)}var r=this;r.name=t.name||"",t.isDetached()?(this.bind("RuntimeInit",function(e,t){n(t)}),i&&"string"==typeof i.required_caps&&(i.required_caps=o.parseCaps(i.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},i))):n(this.connectRuntime(t.ruid))}function x(e,t){var i,n=this;i=new r,i.open("get",e),i.responseType="blob",i.onprogress=function(e){n.trigger(e)},i.onload=function(){g.call(n,i.response,!0)},i.onerror=function(e){n.trigger(e)},i.onloadend=function(){i.destroy()},i.bind("RuntimeError",function(e,t){n.trigger("RuntimeError",t)}),i.send(null,t)}a.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){c.apply(this,arguments)},resize:function(t){var n,r,o=this,a={x:0,y:0,width:o.width,height:o.height},s=e.extendIf({width:o.width,height:o.height,type:o.type||"image/jpeg",quality:90,crop:!1,fit:!0,preserveHeaders:!0,resample:"default",multipass:!0},t);try{if(!o.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);if(o.width>h.MAX_RESIZE_WIDTH||o.height>h.MAX_RESIZE_HEIGHT)throw new i.ImageError(i.ImageError.MAX_RESOLUTION_ERR);if(n=o.meta&&o.meta.tiff&&o.meta.tiff.Orientation||1,-1!==e.inArray(n,[5,6,7,8])){var u=s.width;s.width=s.height,s.height=u}if(s.crop){switch(r=Math.max(s.width/o.width,s.height/o.height),t.fit?(a.width=Math.min(Math.ceil(s.width/r),o.width),a.height=Math.min(Math.ceil(s.height/r),o.height),r=s.width/a.width):(a.width=Math.min(s.width,o.width),a.height=Math.min(s.height,o.height),r=1),"boolean"==typeof s.crop&&(s.crop="cc"),s.crop.toLowerCase().replace(/_/,"-")){case"rb":case"right-bottom":a.x=o.width-a.width,a.y=o.height-a.height;break;case"cb":case"center-bottom":a.x=Math.floor((o.width-a.width)/2),a.y=o.height-a.height;break;case"lb":case"left-bottom":a.x=0,a.y=o.height-a.height;break;case"lt":case"left-top":a.x=0,a.y=0;break;case"ct":case"center-top":a.x=Math.floor((o.width-a.width)/2),a.y=0;break;case"rt":case"right-top":a.x=o.width-a.width,a.y=0;break;case"rc":case"right-center":case"right-middle":a.x=o.width-a.width,a.y=Math.floor((o.height-a.height)/2);break;case"lc":case"left-center":case"left-middle":a.x=0,a.y=Math.floor((o.height-a.height)/2);break;case"cc":case"center-center":case"center-middle":default:a.x=Math.floor((o.width-a.width)/2),a.y=Math.floor((o.height-a.height)/2)}a.x=Math.max(a.x,0),a.y=Math.max(a.y,0)}else r=Math.min(s.width/o.width,s.height/o.height),r>1&&!s.fit&&(r=1);this.exec("Image","resize",a,r,s)}catch(c){o.trigger("error",c.code)}},downsize:function(t){var i,n={width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,crop:!1,fit:!1,preserveHeaders:!0,resample:"default"};i="object"==typeof t?e.extend(n,t):e.extend(n,{width:arguments[0],height:arguments[1],crop:arguments[2],preserveHeaders:arguments[3]}),this.resize(i)},crop:function(e,t,i){this.downsize(e,t,!0,i)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return this.exec("Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsBlob",e||"image/jpeg",t||90)},getAsDataURL:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsDataURL",e||"image/jpeg",t||90)},getAsBinaryString:function(e,t){var i=this.getAsDataURL(e,t);return m.atob(i.substring(i.indexOf("base64,")+7))},embed:function(n,r){function o(t,r){var o=this;if(u.can("create_canvas")){var l=o.getAsCanvas();if(l)return n.appendChild(l),l=null,o.destroy(),c.trigger("embedded"),void 0}var d=o.getAsDataURL(t,r);if(!d)throw new i.ImageError(i.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",d.length))n.innerHTML='<img src="'+d+'" width="'+o.width+'" height="'+o.height+'" alt="" />',o.destroy(),c.trigger("embedded");else{var h=new s;h.bind("TransportingComplete",function(){a=c.connectRuntime(this.result.ruid),c.bind("Embedded",function(){e.extend(a.getShimContainer().style,{top:"0px",left:"0px",width:o.width+"px",height:o.height+"px"}),a=null},999),a.exec.call(c,"ImageView","display",this.result.uid,width,height),o.destroy()}),h.transport(m.atob(d.substring(d.indexOf("base64,")+7)),t,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:n})}}var a,c=this,l=e.extend({width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,fit:!0,resample:"nearest"},r);try{if(!(n=t.get(n)))throw new i.DOMException(i.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);this.width>h.MAX_RESIZE_WIDTH||this.height>h.MAX_RESIZE_HEIGHT;var d=new h;return d.bind("Resize",function(){o.call(this,l.type,l.quality)}),d.bind("Load",function(){this.downsize(l)}),this.meta.thumb&&this.meta.thumb.width>=l.width&&this.meta.thumb.height>=l.height?d.load(this.meta.thumb.data):d.clone(this,!1),d}catch(f){this.trigger("error",f.code)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.meta&&this.meta.thumb&&this.meta.thumb.data.destroy(),this.unbindAll()}}),this.handleEventProps(f),this.bind("Load Resize",function(){return n.call(this)},999)}var f=["progress","load","error","resize","embedded"];return h.MAX_RESIZE_WIDTH=8192,h.MAX_RESIZE_HEIGHT=8192,h.prototype=c.instance,h}),n("moxie/runtime/html5/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue,l=e.extend({access_binary:u(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return o.can("access_binary")&&!!s.Image},display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:u(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:u(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==n.browser||n.verComp(n.version,9,">"))}()),filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),return_response_headers:c,return_response_type:function(e){return"json"===e&&window.JSON?!0:n.can("return_response_type",e)},return_status_code:c,report_upload_progress:u(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return o.can("access_binary")&&n.can("create_canvas")},select_file:function(){return n.can("use_fileinput")&&window.File},select_folder:function(){return o.can("select_file")&&("Chrome"===n.browser&&n.verComp(n.version,21,">=")||"Firefox"===n.browser&&n.verComp(n.version,42,">="))},select_multiple:function(){return!(!o.can("select_file")||"Safari"===n.browser&&"Windows"===n.os||"iOS"===n.os&&n.verComp(n.osVersion,"7.0.0",">")&&n.verComp(n.osVersion,"8.0.0","<"))},send_binary_string:u(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:u(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||o.can("send_binary_string")},slice_blob:u(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return o.can("slice_blob")&&o.can("send_multipart")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:c},arguments[2]);i.call(this,t,arguments[1]||a,l),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html5",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html5/file/Blob",["moxie/runtime/html5/Runtime","moxie/file/Blob"],function(e,t){function i(){function e(e,t,i){var n;if(!window.File.prototype.slice)return(n=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?n.call(e,t,i):null;try{return e.slice(),e.slice(t,i)}catch(r){return e.slice(t,i-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))},this.destroy=function(){this.getRuntime().getShim().removeInstance(this.uid)}}return e.Blob=i}),n("moxie/core/utils/Events",["moxie/core/utils/Basic"],function(e){function t(){this.returnValue=!1}function i(){this.cancelBubble=!0}var n={},r="moxie_"+e.guid(),o=function(o,a,s,u){var c,l;a=a.toLowerCase(),o.addEventListener?(c=s,o.addEventListener(a,c,!1)):o.attachEvent&&(c=function(){var e=window.event;e.target||(e.target=e.srcElement),e.preventDefault=t,e.stopPropagation=i,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),n.hasOwnProperty(o[r])||(n[o[r]]={}),l=n[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,i,o){var a,s;if(i=i.toLowerCase(),t[r]&&n[t[r]]&&n[t[r]][i]){a=n[t[r]][i];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(i,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+i,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete n[t[r]][i],e.isEmptyObj(n[t[r]])){delete n[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,i){t&&t[r]&&e.each(n[t[r]],function(e,n){a(t,n,i)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),n("moxie/runtime/html5/file/FileInput",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){var e,s;i.extend(this,{init:function(u){var c,l,d,m,h,f,p=this,g=p.getRuntime();e=u,d=o.extList2mimes(e.accept,g.can("filter_by_extension")),l=g.getShimContainer(),l.innerHTML='<input id="'+g.uid+'" type="file" style="font-size:999px;opacity:0;"'+(e.multiple&&g.can("select_multiple")?"multiple":"")+(e.directory&&g.can("select_folder")?"webkitdirectory directory":"")+(d?' accept="'+d.join(",")+'"':"")+" />",c=n.get(g.uid),i.extend(c.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=n.get(e.browse_button),s=n.getStyle(m,"z-index")||"auto",g.can("summon_file_dialog")&&("static"===n.getStyle(m,"position")&&(m.style.position="relative"),r.addEvent(m,"click",function(e){var t=n.get(g.uid);t&&!t.disabled&&t.click(),e.preventDefault()},p.uid),p.bind("Refresh",function(){h=parseInt(s,10)||1,n.get(e.browse_button).style.zIndex=h,this.getRuntime().getShimContainer().style.zIndex=h-1})),f=g.can("summon_file_dialog")?m:l,r.addEvent(f,"mouseover",function(){p.trigger("mouseenter")},p.uid),r.addEvent(f,"mouseout",function(){p.trigger("mouseleave")},p.uid),r.addEvent(f,"mousedown",function(){p.trigger("mousedown")},p.uid),r.addEvent(n.get(e.container),"mouseup",function(){p.trigger("mouseup")},p.uid),(g.can("summon_file_dialog")?c:m).setAttribute("tabindex",-1),c.onchange=function x(){if(p.files=[],i.each(this.files,function(i){var n="";return e.directory&&"."==i.name?!0:(i.webkitRelativePath&&(n="/"+i.webkitRelativePath.replace(/^\//,"")),i=new t(g.uid,i),i.relativePath=n,p.files.push(i),void 0)}),"IE"!==a.browser&&"IEMobile"!==a.browser)this.value="";else{var n=this.cloneNode(!0);this.parentNode.replaceChild(n,this),n.onchange=x}p.files.length&&p.trigger("change")},p.trigger({type:"ready",async:!0}),l=null},setOption:function(e,t){var i=this.getRuntime(),r=n.get(i.uid);switch(e){case"accept":if(t){var a=t.mimes||o.extList2mimes(t,i.can("filter_by_extension"));r.setAttribute("accept",a.join(","))}else r.removeAttribute("accept");break;case"directory":t&&i.can("select_folder")?(r.setAttribute("directory",""),r.setAttribute("webkitdirectory","")):(r.removeAttribute("directory"),r.removeAttribute("webkitdirectory"));break;case"multiple":t&&i.can("select_multiple")?r.setAttribute("multiple",""):r.removeAttribute("multiple")}},disable:function(e){var t,i=this.getRuntime();(t=n.get(i.uid))&&(t.disabled=!!e)},destroy:function(){var t=this.getRuntime(),i=t.getShim(),o=t.getShimContainer(),a=e&&n.get(e.container),u=e&&n.get(e.browse_button);a&&r.removeAllEvents(a,this.uid),u&&(r.removeAllEvents(u,this.uid),u.style.zIndex=s),o&&(r.removeAllEvents(o,this.uid),o.innerHTML=""),i.removeInstance(this.uid),e=o=a=u=i=null}})}return e.FileInput=s}),n("moxie/runtime/html5/file/FileDrop",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime"],function(e,t,i,n,r,o){function a(){function e(e){if(!e.dataTransfer||!e.dataTransfer.types)return!1;var t=i.toArray(e.dataTransfer.types||[]);return-1!==i.inArray("Files",t)||-1!==i.inArray("public.file-url",t)||-1!==i.inArray("application/x-moz-file",t)}function a(e,i){if(u(e)){var n=new t(f,e);n.relativePath=i||"",p.push(n)}}function s(e){for(var t=[],n=0;n<e.length;n++)[].push.apply(t,e[n].extensions.split(/\s*,\s*/));return-1===i.inArray("*",t)?t:[]}function u(e){if(!g.length)return!0;var t=o.getFileExtension(e.name);return!t||-1!==i.inArray(t,g)}function c(e,t){var n=[];i.each(e,function(e){var t=e.webkitGetAsEntry();t&&(t.isFile?a(e.getAsFile(),t.fullPath):n.push(t))}),n.length?l(n,t):t()}function l(e,t){var n=[];i.each(e,function(e){n.push(function(t){d(e,t)})}),i.inSeries(n,function(){t()})}function d(e,t){e.isFile?e.file(function(i){a(i,e.fullPath),t()},function(){t()}):e.isDirectory?m(e,t):t()}function m(e,t){function i(e){r.readEntries(function(t){t.length?([].push.apply(n,t),i(e)):e()},e)}var n=[],r=e.createReader();i(function(){l(n,t)})}var h,f,p=[],g=[];i.extend(this,{init:function(t){var n,o=this;h=t,f=o.ruid,g=s(h.accept),n=h.container,r.addEvent(n,"dragover",function(t){e(t)&&(t.preventDefault(),t.dataTransfer.dropEffect="copy")},o.uid),r.addEvent(n,"drop",function(t){e(t)&&(t.preventDefault(),p=[],t.dataTransfer.items&&t.dataTransfer.items[0].webkitGetAsEntry?c(t.dataTransfer.items,function(){o.files=p,o.trigger("drop")}):(i.each(t.dataTransfer.files,function(e){a(e)}),o.files=p,o.trigger("drop")))},o.uid),r.addEvent(n,"dragenter",function(){o.trigger("dragenter")},o.uid),r.addEvent(n,"dragleave",function(){o.trigger("dragleave")},o.uid)},destroy:function(){r.removeAllEvents(h&&n.get(h.container),this.uid),f=p=g=h=null,this.getRuntime().getShim().removeInstance(this.uid)}})}return e.FileDrop=a}),n("moxie/runtime/html5/file/FileReader",["moxie/runtime/html5/Runtime","moxie/core/utils/Encode","moxie/core/utils/Basic"],function(e,t,i){function n(){function e(e){return t.atob(e.substring(e.indexOf("base64,")+7))}var n,r=!1;i.extend(this,{read:function(t,o){var a=this;a.result="",n=new window.FileReader,n.addEventListener("progress",function(e){a.trigger(e)}),n.addEventListener("load",function(t){a.result=r?e(n.result):n.result,a.trigger(t)}),n.addEventListener("error",function(e){a.trigger(e,n.error)}),n.addEventListener("loadend",function(e){n=null,a.trigger(e)}),"function"===i.typeOf(n[t])?(r=!1,n[t](o.getSource())):"readAsBinaryString"===t&&(r=!0,n.readAsDataURL(o.getSource()))},abort:function(){n&&n.abort()},destroy:function(){n=null,this.getRuntime().getShim().removeInstance(this.uid)}})}return e.FileReader=n}),n("moxie/runtime/html5/xhr/XMLHttpRequest",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/core/utils/Url","moxie/file/File","moxie/file/Blob","moxie/xhr/FormData","moxie/core/Exceptions","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u){function c(){function e(e,t){var i,n,r=this;i=t.getBlob().getSource(),n=new window.FileReader,n.onload=function(){t.append(t.getBlobName(),new o(null,{type:i.type,data:n.result})),f.send.call(r,e,t)},n.readAsBinaryString(i)}function c(){return!window.XMLHttpRequest||"IE"===u.browser&&u.verComp(u.version,8,"<")?function(){for(var e=["Msxml2.XMLHTTP.6.0","Microsoft.XMLHTTP"],t=0;t<e.length;t++)try{return new ActiveXObject(e[t])}catch(i){}}():new window.XMLHttpRequest}function l(e){var t=e.responseXML,i=e.responseText;return"IE"===u.browser&&i&&t&&!t.documentElement&&/[^\/]+\/[^\+]+\+xml/.test(e.getResponseHeader("Content-Type"))&&(t=new window.ActiveXObject("Microsoft.XMLDOM"),t.async=!1,t.validateOnParse=!1,t.loadXML(i)),t&&("IE"===u.browser&&0!==t.parseError||!t.documentElement||"parsererror"===t.documentElement.tagName)?null:t
-}function d(e){var t="----moxieboundary"+(new Date).getTime(),i="--",n="\r\n",r="",a=this.getRuntime();if(!a.can("send_binary_string"))throw new s.RuntimeError(s.RuntimeError.NOT_SUPPORTED_ERR);return m.setRequestHeader("Content-Type","multipart/form-data; boundary="+t),e.each(function(e,a){r+=e instanceof o?i+t+n+'Content-Disposition: form-data; name="'+a+'"; filename="'+unescape(encodeURIComponent(e.name||"blob"))+'"'+n+"Content-Type: "+(e.type||"application/octet-stream")+n+n+e.getSource()+n:i+t+n+'Content-Disposition: form-data; name="'+a+'"'+n+n+unescape(encodeURIComponent(e))+n}),r+=i+t+i+n}var m,h,f=this;t.extend(this,{send:function(i,r){var s=this,l="Mozilla"===u.browser&&u.verComp(u.version,4,">=")&&u.verComp(u.version,7,"<"),f="Android Browser"===u.browser,p=!1;if(h=i.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),m=c(),m.open(i.method,i.url,i.async,i.user,i.password),r instanceof o)r.isDetached()&&(p=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),p=!0;else if((l||f)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return e.call(s,i,r),void 0;if(r instanceof a){var g=new window.FormData;r.each(function(e,t){e instanceof o?g.append(t,e.getSource()):g.append(t,e)}),r=g}}m.upload?(i.withCredentials&&(m.withCredentials=!0),m.addEventListener("load",function(e){s.trigger(e)}),m.addEventListener("error",function(e){s.trigger(e)}),m.addEventListener("progress",function(e){s.trigger(e)}),m.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):m.onreadystatechange=function(){switch(m.readyState){case 1:break;case 2:break;case 3:var e,t;try{n.hasSameOrigin(i.url)&&(e=m.getResponseHeader("Content-Length")||0),m.responseText&&(t=m.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:m.onreadystatechange=function(){};try{if(m.status>=200&&m.status<400){s.trigger("load");break}}catch(r){}s.trigger("error")}},t.isEmptyObj(i.headers)||t.each(i.headers,function(e,t){m.setRequestHeader(t,e)}),""!==i.responseType&&"responseType"in m&&(m.responseType="json"!==i.responseType||u.can("return_response_type","json")?i.responseType:"text"),p?m.sendAsBinary?m.sendAsBinary(r):function(){for(var e=new Uint8Array(r.length),t=0;t<r.length;t++)e[t]=255&r.charCodeAt(t);m.send(e.buffer)}():m.send(r),s.trigger("loadstart")},getStatus:function(){try{if(m)return m.status}catch(e){}return 0},getResponse:function(e){var t=this.getRuntime();try{switch(e){case"blob":var n=new r(t.uid,m.response),o=m.getResponseHeader("Content-Disposition");if(o){var a=o.match(/filename=([\'\"'])([^\1]+)\1/);a&&(h=a[2])}return n.name=h,n.type||(n.type=i.getFileMime(h)),n;case"json":return u.can("return_response_type","json")?m.response:200===m.status&&window.JSON?JSON.parse(m.responseText):null;case"document":return l(m);default:return""!==m.responseText?m.responseText:null}}catch(s){return null}},getAllResponseHeaders:function(){try{return m.getAllResponseHeaders()}catch(e){}return""},abort:function(){m&&m.abort()},destroy:function(){f=h=null,this.getRuntime().getShim().removeInstance(this.uid)}})}return e.XMLHttpRequest=c}),n("moxie/runtime/html5/utils/BinaryReader",["moxie/core/utils/Basic"],function(e){function t(e){e instanceof ArrayBuffer?i.apply(this,arguments):n.apply(this,arguments)}function i(t){var i=new DataView(t);e.extend(this,{readByteAt:function(e){return i.getUint8(e)},writeByteAt:function(e,t){i.setUint8(e,t)},SEGMENT:function(e,n,r){switch(arguments.length){case 2:return t.slice(e,e+n);case 1:return t.slice(e);case 3:if(null===r&&(r=new ArrayBuffer),r instanceof ArrayBuffer){var o=new Uint8Array(this.length()-n+r.byteLength);e>0&&o.set(new Uint8Array(t.slice(0,e)),0),o.set(new Uint8Array(r),e),o.set(new Uint8Array(t.slice(e+n)),e+r.byteLength),this.clear(),t=o.buffer,i=new DataView(t);break}default:return t}},length:function(){return t?t.byteLength:0},clear:function(){i=t=null}})}function n(t){function i(e,i,n){n=3===arguments.length?n:t.length-i-1,t=t.substr(0,i)+e+t.substr(n+i)}e.extend(this,{readByteAt:function(e){return t.charCodeAt(e)},writeByteAt:function(e,t){i(String.fromCharCode(t),e,1)},SEGMENT:function(e,n,r){switch(arguments.length){case 1:return t.substr(e);case 2:return t.substr(e,n);case 3:i(null!==r?r:"",e,n);break;default:return t}},length:function(){return t?t.length:0},clear:function(){t=null}})}return e.extend(t.prototype,{littleEndian:!1,read:function(e,t){var i,n,r;if(e+t>this.length())throw new Error("You are trying to read outside the source boundaries.");for(n=this.littleEndian?0:-8*(t-1),r=0,i=0;t>r;r++)i|=this.readByteAt(e+r)<<Math.abs(n+8*r);return i},write:function(e,t,i){var n,r;if(e>this.length())throw new Error("You are trying to write outside the source boundaries.");for(n=this.littleEndian?0:-8*(i-1),r=0;i>r;r++)this.writeByteAt(e+r,255&t>>Math.abs(n+8*r))},BYTE:function(e){return this.read(e,1)},SHORT:function(e){return this.read(e,2)},LONG:function(e){return this.read(e,4)},SLONG:function(e){var t=this.read(e,4);return t>2147483647?t-4294967296:t},CHAR:function(e){return String.fromCharCode(this.read(e,1))},STRING:function(e,t){return this.asArray("CHAR",e,t).join("")},asArray:function(e,t,i){for(var n=[],r=0;i>r;r++)n[r]=this[e](t+r);return n}}),t}),n("moxie/runtime/html5/image/JPEGHeaders",["moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,t){return function i(n){var r,o,a,s=[],u=0;if(r=new e(n),65496!==r.SHORT(0))throw r.clear(),new t.ImageError(t.ImageError.WRONG_FORMAT);for(o=2;o<=r.length();)if(a=r.SHORT(o),a>=65488&&65495>=a)o+=2;else{if(65498===a||65497===a)break;u=r.SHORT(o+2)+2,a>=65505&&65519>=a&&s.push({hex:a,name:"APP"+(15&a),start:o,length:u,segment:r.SEGMENT(o,u)}),o+=u}return r.clear(),{headers:s,restore:function(t){var i,n,r;for(r=new e(t),o=65504==r.SHORT(2)?4+r.SHORT(4):2,n=0,i=s.length;i>n;n++)r.SEGMENT(o,0,s[n].segment),o+=s[n].length;return t=r.SEGMENT(),r.clear(),t},strip:function(t){var n,r,o,a;for(o=new i(t),r=o.headers,o.purge(),n=new e(t),a=r.length;a--;)n.SEGMENT(r[a].start,r[a].length,"");return t=n.SEGMENT(),n.clear(),t},get:function(e){for(var t=[],i=0,n=s.length;n>i;i++)s[i].name===e.toUpperCase()&&t.push(s[i].segment);return t},set:function(e,t){var i,n,r,o=[];for("string"==typeof t?o.push(t):o=t,i=n=0,r=s.length;r>i&&(s[i].name===e.toUpperCase()&&(s[i].segment=o[n],s[i].length=o[n].length,n++),!(n>=o.length));i++);},purge:function(){this.headers=s=[]}}}}),n("moxie/runtime/html5/image/ExifParser",["moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,i,n){function r(o){function a(i,r){var o,a,s,u,c,m,h,f,p=this,g=[],x={},v={1:"BYTE",7:"UNDEFINED",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",9:"SLONG",10:"SRATIONAL"},w={BYTE:1,UNDEFINED:1,ASCII:1,SHORT:2,LONG:4,RATIONAL:8,SLONG:4,SRATIONAL:8};for(o=p.SHORT(i),a=0;o>a;a++)if(g=[],h=i+2+12*a,s=r[p.SHORT(h)],s!==t){if(u=v[p.SHORT(h+=2)],c=p.LONG(h+=2),m=w[u],!m)throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(h+=4,m*c>4&&(h=p.LONG(h)+d.tiffHeader),h+m*c>=this.length())throw new n.ImageError(n.ImageError.INVALID_META_ERR);"ASCII"!==u?(g=p.asArray(u,h,c),f=1==c?g[0]:g,x[s]=l.hasOwnProperty(s)&&"object"!=typeof f?l[s][f]:f):x[s]=e.trim(p.STRING(h,c).replace(/\0$/,""))}return x}function s(e,t,i){var n,r,o,a=0;if("string"==typeof t){var s=c[e.toLowerCase()];for(var u in s)if(s[u]===t){t=u;break}}n=d[e.toLowerCase()+"IFD"],r=this.SHORT(n);for(var l=0;r>l;l++)if(o=n+12*l+2,this.SHORT(o)==t){a=o+8;break}if(!a)return!1;try{this.write(a,i,4)}catch(m){return!1}return!0}var u,c,l,d,m,h;if(i.call(this,o),c={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"},thumb:{513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength"}},l={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}},d={tiffHeader:10},m=d.tiffHeader,u={clear:this.clear},e.extend(this,{read:function(){try{return r.prototype.read.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},write:function(){try{return r.prototype.write.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},UNDEFINED:function(){return this.BYTE.apply(this,arguments)},RATIONAL:function(e){return this.LONG(e)/this.LONG(e+4)},SRATIONAL:function(e){return this.SLONG(e)/this.SLONG(e+4)},ASCII:function(e){return this.CHAR(e)},TIFF:function(){return h||null},EXIF:function(){var t=null;if(d.exifIFD){try{t=a.call(this,d.exifIFD,c.exif)}catch(i){return null}if(t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var n=0,r="";n<t.ExifVersion.length;n++)r+=String.fromCharCode(t.ExifVersion[n]);t.ExifVersion=r}}return t},GPS:function(){var t=null;if(d.gpsIFD){try{t=a.call(this,d.gpsIFD,c.gps)}catch(i){return null}t.GPSVersionID&&"array"===e.typeOf(t.GPSVersionID)&&(t.GPSVersionID=t.GPSVersionID.join("."))}return t},thumb:function(){if(d.IFD1)try{var e=a.call(this,d.IFD1,c.thumb);if("JPEGInterchangeFormat"in e)return this.SEGMENT(d.tiffHeader+e.JPEGInterchangeFormat,e.JPEGInterchangeFormatLength)}catch(t){}return null},setExif:function(e,t){return"PixelXDimension"!==e&&"PixelYDimension"!==e?!1:s.call(this,"exif",e,t)},clear:function(){u.clear(),o=c=l=h=d=u=null}}),65505!==this.SHORT(0)||"EXIF\0"!==this.STRING(4,5).toUpperCase())throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(this.littleEndian=18761==this.SHORT(m),42!==this.SHORT(m+=2))throw new n.ImageError(n.ImageError.INVALID_META_ERR);d.IFD0=d.tiffHeader+this.LONG(m+=2),h=a.call(this,d.IFD0,c.tiff),"ExifIFDPointer"in h&&(d.exifIFD=d.tiffHeader+h.ExifIFDPointer,delete h.ExifIFDPointer),"GPSInfoIFDPointer"in h&&(d.gpsIFD=d.tiffHeader+h.GPSInfoIFDPointer,delete h.GPSInfoIFDPointer),e.isEmptyObj(h)&&(h=null);var f=this.LONG(d.IFD0+12*this.SHORT(d.IFD0)+2);f&&(d.IFD1=d.tiffHeader+f)}return r.prototype=i.prototype,r}),n("moxie/runtime/html5/image/JPEG",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEGHeaders","moxie/runtime/html5/utils/BinaryReader","moxie/runtime/html5/image/ExifParser"],function(e,t,i,n,r){function o(o){function a(e){var t,i,n=0;for(e||(e=c);n<=e.length();){if(t=e.SHORT(n+=2),t>=65472&&65475>=t)return n+=5,{height:e.SHORT(n),width:e.SHORT(n+=2)};i=e.SHORT(n+=2),n+=i-2}return null}function s(){var e,t,i=d.thumb();return i&&(e=new n(i),t=a(e),e.clear(),t)?(t.data=i,t):null}function u(){d&&l&&c&&(d.clear(),l.purge(),c.clear(),m=l=d=c=null)}var c,l,d,m;if(c=new n(o),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new i(o);try{d=new r(l.get("app1")[0])}catch(h){}m=a.call(this),e.extend(this,{type:"image/jpeg",size:c.length(),width:m&&m.width||0,height:m&&m.height||0,setExif:function(t,i){return d?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,i),l.set("app1",d.SEGMENT()),void 0):!1},writeHeaders:function(){return arguments.length?l.restore(arguments[0]):l.restore(o)},stripHeaders:function(e){return l.strip(e)},purge:function(){u.call(this)}}),d&&(this.meta={tiff:d.TIFF(),exif:d.EXIF(),gps:d.GPS(),thumb:s()})}return o}),n("moxie/runtime/html5/image/PNG",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader"],function(e,t,i){function n(n){function r(){var e,t;return e=a.call(this,8),"IHDR"==e.type?(t=e.start,{width:s.LONG(t),height:s.LONG(t+=4)}):null}function o(){s&&(s.clear(),n=l=u=c=s=null)}function a(e){var t,i,n,r;return t=s.LONG(e),i=s.STRING(e+=4,4),n=e+=4,r=s.LONG(e+t),{length:t,type:i,start:n,CRC:r}}var s,u,c,l;s=new i(n),function(){var t=0,i=0,n=[35152,20039,3338,6666];for(i=0;i<n.length;i++,t+=2)if(n[i]!=s.SHORT(t))throw new e.ImageError(e.ImageError.WRONG_FORMAT)}(),l=r.call(this),t.extend(this,{type:"image/png",size:s.length(),width:l.width,height:l.height,purge:function(){o.call(this)}}),o.call(this)}return n}),n("moxie/runtime/html5/image/ImageInfo",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEG","moxie/runtime/html5/image/PNG"],function(e,t,i,n){return function(r){var o,a=[i,n];o=function(){for(var e=0;e<a.length;e++)try{return new a[e](r)}catch(i){}throw new t.ImageError(t.ImageError.WRONG_FORMAT)}(),e.extend(this,{type:"",size:0,width:0,height:0,setExif:function(){},writeHeaders:function(e){return e},stripHeaders:function(e){return e},purge:function(){r=null}}),e.extend(this,o),this.purge=function(){o.purge(),o=null}}}),n("moxie/runtime/html5/image/ResizerCanvas",[],function(){function e(i,n,r){var o=i.width>i.height?"width":"height",a=Math.round(i[o]*n),s=!1;"nearest"!==r&&(.5>n||n>2)&&(n=.5>n?.5:2,s=!0);var u=t(i,n);return s?e(u,a/u[o],r):u}function t(e,t){var i=e.width,n=e.height,r=Math.round(i*t),o=Math.round(n*t),a=document.createElement("canvas");return a.width=r,a.height=o,a.getContext("2d").drawImage(e,0,0,i,n,0,0,r,o),e=null,a}return{scale:e}}),n("moxie/runtime/html5/image/Image",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/runtime/html5/image/ImageInfo","moxie/runtime/html5/image/ResizerCanvas","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u,c){function l(){function e(){if(!w&&!x)throw new i.ImageError(i.DOMException.INVALID_STATE_ERR);return w||x}function l(){var t=e();return"canvas"==t.nodeName.toLowerCase()?t:(w=document.createElement("canvas"),w.width=t.width,w.height=t.height,w.getContext("2d").drawImage(t,0,0),w)}function d(e){return n.atob(e.substring(e.indexOf("base64,")+7))}function m(e,t){return"data:"+(t||"")+";base64,"+n.btoa(e)}function h(e){var t=this,n=e.substr(0,5);x=new Image,x.onerror=function(){g.call(this),t.trigger("error",i.ImageError.WRONG_FORMAT)},x.onload=function(){t.trigger("load")},x.src="data:"===n||"blob:"===n?e:m(e,E.type)}function f(e,t){var n,r=this;return window.FileReader?(n=new FileReader,n.onload=function(){t.call(r,this.result)},n.onerror=function(){r.trigger("error",i.ImageError.WRONG_FORMAT)},n.readAsDataURL(e),void 0):t.call(this,e.getAsDataURL())}function p(e,i){var n=Math.PI/180,r=document.createElement("canvas"),o=r.getContext("2d"),a=e.width,s=e.height;switch(t.inArray(i,[5,6,7,8])>-1?(r.width=s,r.height=a):(r.width=a,r.height=s),i){case 2:o.translate(a,0),o.scale(-1,1);break;case 3:o.translate(a,s),o.rotate(180*n);break;case 4:o.translate(0,s),o.scale(1,-1);break;case 5:o.rotate(90*n),o.scale(1,-1);break;case 6:o.rotate(90*n),o.translate(0,-s);break;case 7:o.rotate(90*n),o.translate(a,-s),o.scale(-1,1);break;case 8:o.rotate(-90*n),o.translate(-a,0)}return o.drawImage(e,0,0,a,s),r}function g(){v&&(v.purge(),v=null),x&&c.can("use_blob_uri")&&URL.revokeObjectURL(x.src),y=x=w=E=null,R=!1}var x,v,w,y,E,b=this,R=!1,_=!0;t.extend(this,{loadFromBlob:function(e){var t=this.getRuntime(),n=arguments.length>1?arguments[1]:!0;if(!t.can("access_binary"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);E=e,e.isDetached()?(y=e.getSource(),h.call(this,y)):c.can("use_blob_uri")?h.call(this,URL.createObjectURL(e.getSource())):f.call(this,e.getSource(),function(e){n&&(y=d(e)),h.call(this,e)})},loadFromImage:function(e,t){var i=this;i.meta=e.meta,E=new o(null,{name:e.name,size:e.size,type:e.type}),c.can("create_canvas")&&!t?(w=e.getAsCanvas(),setTimeout(function(){i.trigger("load")})):h.call(this,t?y=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t,i=this.getRuntime();return!v&&y&&i.can("access_image_binary")&&(v=new a(y)),t={width:e().width||0,height:e().height||0,type:E.type||u.getFileMime(E.name),size:y&&y.length||E.size||0,name:E.name||"",meta:null},_&&(t.meta=v&&v.meta||this.meta||{},!t.meta||!t.meta.thumb||t.meta.thumb.data instanceof r||(t.meta.thumb.data=new r(null,{type:"image/jpeg",data:t.meta.thumb.data}))),t},resize:function(t,i,n){var r=document.createElement("canvas");if(r.width=t.width,r.height=t.height,r.getContext("2d").drawImage(e(),t.x,t.y,t.width,t.height,0,0,r.width,r.height),w=s.scale(r,i),_=n.preserveHeaders,!_){var o=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1;w=p(w,o)}this.width=w.width,this.height=w.height,R=!0,this.trigger("Resize")},getAsCanvas:function(){return w||(w=l()),w.id=this.uid+"_canvas",w},getAsBlob:function(e,t){return e!==this.type?(R=!0,new o(null,{name:E.name||"",type:e,data:b.getAsDataURL(e,t)})):new o(null,{name:E.name||"",type:e,data:b.getAsBinaryString(e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!R&&"data:"===x.src.substr(0,5))return x.src;if(l(),"image/jpeg"!==e)return w.toDataURL("image/png");try{return w.toDataURL("image/jpeg",t/100)}catch(i){return w.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!R)return y||(y=d(b.getAsDataURL(e,t))),y;if("image/jpeg"!==e)y=d(b.getAsDataURL(e,t));else{var i;t||(t=90),l();try{i=w.toDataURL("image/jpeg",t/100)}catch(n){i=w.toDataURL("image/jpeg")}y=d(i),v&&(y=v.stripHeaders(y),_&&(v.meta&&v.meta.exif&&v.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),y=v.writeHeaders(y)),v.purge(),v=null)}return R=!1,y},destroy:function(){b=null,g.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=l}),n("moxie/runtime/flash/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(i){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function s(e){var n=i.get(e);n&&"OBJECT"==n.nodeName&&("IE"===t.browser?(n.style.display="none",function r(){4==n.readyState?u(e):setTimeout(r,10)}()):n.parentNode.removeChild(n))}function u(e){var t=i.get(e);if(t){for(var n in t)"function"==typeof t[n]&&(t[n]=null);t.parentNode.removeChild(t)}}function c(u){var c,m=this;u=e.extend({swf_url:t.swf_url},u),o.call(this,u,l,{access_binary:function(e){return e&&"browser"===m.mode},access_image_binary:function(e){return e&&"browser"===m.mode},display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===m.mode},resize_image:o.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===m.mode},return_status_code:function(t){return"browser"===m.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:function(e){return e&&"browser"===m.mode},send_browser_cookies:function(e){return e&&"browser"===m.mode},send_custom_headers:function(e){return e&&"browser"===m.mode},send_multipart:o.capTrue,slice_blob:function(e){return e&&"browser"===m.mode},stream_upload:function(e){return e&&"browser"===m.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===m.mode},use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(t){return e.arrayDiff(t,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},slice_blob:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),a()<11.3&&(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid)},shimExec:function(e,t){var i=[].slice.call(arguments,2);return m.getShim().exec(this.uid,e,t,i)},init:function(){var i,r,a;a=this.getShimContainer(),e.extend(a.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),i='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+u.swf_url+'" ',"IE"===t.browser&&(i+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),i+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+u.swf_url+'" />'+'<param name="flashvars" value="uid='+escape(this.uid)+"&target="+o.getGlobalEventTarget()+'" />'+'<param name="wmode" value="transparent" />'+'<param name="allowscriptaccess" value="always" />'+"</object>","IE"===t.browser?(r=document.createElement("div"),a.appendChild(r),r.outerHTML=i,r=a=null):a.innerHTML=i,c=setTimeout(function(){m&&!m.initialized&&m.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){s(m.uid),e.call(m),clearTimeout(c),u=c=e=m=null}}(this.destroy)},d)}var l="flash",d={};return o.addConstructor(l,c),d}),n("moxie/runtime/flash/file/Blob",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={slice:function(e,i,n,r){var o=this.getRuntime();return 0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),e=o.shimExec.call(this,"Blob","slice",i,n,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=i}),n("moxie/runtime/flash/file/FileInput",["moxie/runtime/flash/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){var r={init:function(e){var r=this,o=this.getRuntime(),a=i.get(e.browse_button);a&&(a.setAttribute("tabindex",-1),a=null),this.bind("Change",function(){var e=o.shimExec.call(r,"FileInput","getFiles");r.files=[],n.each(e,function(e){r.files.push(new t(o.uid,e))})},999),this.getRuntime().shimExec.call(this,"FileInput","init",{accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=r}),n("moxie/runtime/flash/file/FileReader",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n=this;return n.result="","readAsDataURL"===e&&(n.result="data:"+(t.type||"")+";base64,"),n.bind("Progress",function(t,r){r&&(n.result+=i(r,e))},999),n.getRuntime().shimExec.call(this,"FileReader","readAsBase64",t.uid)}};return e.FileReader=n}),n("moxie/runtime/flash/file/FileReaderSync",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n,r=this.getRuntime();return(n=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(n="data:"+(t.type||"")+";base64,"+n),i(n,e,t.type)):null}};return e.FileReaderSync=n}),n("moxie/runtime/flash/runtime/Transporter",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={getAsBlob:function(e){var i=this.getRuntime(),n=i.shimExec.call(this,"Transporter","getAsBlob",e);return n?new t(i.uid,n):null}};return e.Transporter=i}),n("moxie/runtime/flash/xhr/XMLHttpRequest",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/file/File","moxie/file/FileReaderSync","moxie/runtime/flash/file/FileReaderSync","moxie/xhr/FormData","moxie/runtime/Transporter","moxie/runtime/flash/runtime/Transporter"],function(e,t,i,n,r,o,a,s){var u={send:function(e,n){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,n)}function o(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),n=null,r()}function u(e,t){var i=new s;i.bind("TransportingComplete",function(){t(this.result)}),i.transport(e.getSource(),e.type,{ruid:l.uid})}var c=this,l=c.getRuntime();if(t.isEmptyObj(e.headers)||t.each(e.headers,function(e,t){l.shimExec.call(c,"XMLHttpRequest","setRequestHeader",t,e.toString())}),n instanceof a){var d;if(n.each(function(e,t){e instanceof i?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),n.hasBlob()){var m=n.getBlob();m.isDetached()?u(m,function(e){m.destroy(),o(d,e)}):o(d,m)}else n=null,r()}else n instanceof i?n.isDetached()?u(n,function(e){n.destroy(),n=e.uid,r()}):(n=n.uid,r()):r()},getResponse:function(e){var i,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new n(a.uid,o),"blob"===e)return o;try{if(i=new r,~t.inArray(e,["","text"]))return i.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(i.readAsText(o))}finally{o.destroy()}}return null},abort:function(){var e=this.getRuntime();e.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=u}),n("moxie/runtime/flash/image/Image",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/runtime/Transporter","moxie/file/Blob","moxie/file/FileReaderSync"],function(e,t,i,n,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(n,"Image","loadFromBlob",e.uid),n=r=null}var n=this,r=n.getRuntime();if(e.isDetached()){var o=new i;o.bind("TransportingComplete",function(){t(o.result.getSource())}),o.transport(e.getSource(),e.type,{ruid:r.uid})}else t(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getInfo:function(){var e=this.getRuntime(),t=e.shimExec.call(this,"Image","getInfo");return t.meta&&t.meta.thumb&&t.meta.thumb.data&&!(e.meta.thumb.data instanceof n)&&(t.meta.thumb.data=new n(e.uid,t.meta.thumb.data)),t},getAsBlob:function(e,t){var i=this.getRuntime(),r=i.shimExec.call(this,"Image","getAsBlob",e,t);return r?new n(i.uid,r):null},getAsDataURL:function(){var e,t=this.getRuntime(),i=t.Image.getAsBlob.apply(this,arguments);return i?(e=new r,e.readAsDataURL(i)):null}};return e.Image=o}),n("moxie/runtime/silverlight/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(e){var t,i,n,r,o,a=!1,s=null,u=0;try{try{s=new ActiveXObject("AgControl.AgControl"),s.IsVersionSupported(e)&&(a=!0),s=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(t=l.description,"1.0.30226.2"===t&&(t="2.0.30226.2"),i=t.split(".");i.length>3;)i.pop();for(;i.length<4;)i.push(0);for(n=e.split(".");n.length>4;)n.pop();do r=parseInt(n[u],10),o=parseInt(i[u],10),u++;while(u<n.length&&r===o);o>=r&&!isNaN(r)&&(a=!0)}}}catch(d){a=!1}return a}function s(s){var l,d=this;s=e.extend({xap_url:t.xap_url},s),o.call(this,s,u,{access_binary:o.capTrue,access_image_binary:o.capTrue,display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:o.capTrue,resize_image:o.capTrue,return_response_headers:function(e){return e&&"client"===d.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===d.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:o.capTrue,send_browser_cookies:function(e){return e&&"browser"===d.mode},send_custom_headers:function(e){return e&&"client"===d.mode},send_multipart:o.capTrue,slice_blob:o.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:o.capTrue,use_http_method:function(t){return"client"===d.mode||!e.arrayDiff(t,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(t){return e.arrayDiff(t,["GET","POST"])?"client":["client","browser"]}}),a("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid).content.Moxie},shimExec:function(e,t){var i=[].slice.call(arguments,2);return d.getShim().exec(this.uid,e,t,i)},init:function(){var e;e=this.getShimContainer(),e.innerHTML='<object id="'+this.uid+'" data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%" style="outline:none;">'+'<param name="source" value="'+s.xap_url+'"/>'+'<param name="background" value="Transparent"/>'+'<param name="windowless" value="true"/>'+'<param name="enablehtmlaccess" value="true"/>'+'<param name="initParams" value="uid='+this.uid+",target="+o.getGlobalEventTarget()+'"/>'+"</object>",l=setTimeout(function(){d&&!d.initialized&&d.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(d),clearTimeout(l),s=l=e=d=null}}(this.destroy)},c)}var u="silverlight",c={};return o.addConstructor(u,s),c}),n("moxie/runtime/silverlight/file/Blob",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/Blob"],function(e,t,i){return e.Blob=t.extend({},i)}),n("moxie/runtime/silverlight/file/FileInput",["moxie/runtime/silverlight/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){function r(e){for(var t="",i=0;i<e.length;i++)t+=(""!==t?"|":"")+e[i].title+" | *."+e[i].extensions.replace(/,/g,";*.");
-return t}var o={init:function(e){var o=this,a=this.getRuntime(),s=i.get(e.browse_button);s&&(s.setAttribute("tabindex",-1),s=null),this.bind("Change",function(){var e=a.shimExec.call(o,"FileInput","getFiles");o.files=[],n.each(e,function(e){o.files.push(new t(a.uid,e))})},999),a.shimExec.call(this,"FileInput","init",r(e.accept),e.multiple),this.trigger("ready")},setOption:function(e,t){"accept"==e&&(t=r(t)),this.getRuntime().shimExec.call(this,"FileInput","setOption",e,t)}};return e.FileInput=o}),n("moxie/runtime/silverlight/file/FileDrop",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Dom","moxie/core/utils/Events"],function(e,t,i){var n={init:function(){var e,n=this,r=n.getRuntime();return e=r.getShimContainer(),i.addEvent(e,"dragover",function(e){e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect="copy"},n.uid),i.addEvent(e,"dragenter",function(e){e.preventDefault();var i=t.get(r.uid).dragEnter(e);i&&e.stopPropagation()},n.uid),i.addEvent(e,"drop",function(e){e.preventDefault();var i=t.get(r.uid).dragDrop(e);i&&e.stopPropagation()},n.uid),r.shimExec.call(this,"FileDrop","init")}};return e.FileDrop=n}),n("moxie/runtime/silverlight/file/FileReader",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReader"],function(e,t,i){return e.FileReader=t.extend({},i)}),n("moxie/runtime/silverlight/file/FileReaderSync",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReaderSync"],function(e,t,i){return e.FileReaderSync=t.extend({},i)}),n("moxie/runtime/silverlight/runtime/Transporter",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/runtime/Transporter"],function(e,t,i){return e.Transporter=t.extend({},i)}),n("moxie/runtime/silverlight/xhr/XMLHttpRequest",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/xhr/XMLHttpRequest","moxie/runtime/silverlight/file/FileReaderSync","moxie/runtime/silverlight/runtime/Transporter"],function(e,t,i){return e.XMLHttpRequest=t.extend({},i)}),n("moxie/runtime/silverlight/image/Image",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/runtime/flash/image/Image"],function(e,t,i,n){return e.Image=t.extend({},n,{getInfo:function(){var e=this.getRuntime(),n=["tiff","exif","gps","thumb"],r={meta:{}},o=e.shimExec.call(this,"Image","getInfo");return o.meta&&(t.each(n,function(e){var t,i,n,a,s=o.meta[e];if(s&&s.keys)for(r.meta[e]={},i=0,n=s.keys.length;n>i;i++)t=s.keys[i],a=s[t],a&&(/^(\d|[1-9]\d+)$/.test(a)?a=parseInt(a,10):/^\d*\.\d+$/.test(a)&&(a=parseFloat(a)),r.meta[e][t]=a)}),r.meta&&r.meta.thumb&&r.meta.thumb.data&&!(e.meta.thumb.data instanceof i)&&(r.meta.thumb.data=new i(e.uid,r.meta.thumb.data))),r.width=parseInt(o.width,10),r.height=parseInt(o.height,10),r.size=parseInt(o.size,10),r.type=o.type,r.name=o.name,r},resize:function(e,t,i){this.getRuntime().shimExec.call(this,"Image","resize",e.x,e.y,e.width,e.height,t,i.preserveHeaders,i.resample)}})}),n("moxie/runtime/html4/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue;i.call(this,t,a,{access_binary:u(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:!1,drag_and_drop:!1,filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),resize_image:function(){return s.Image&&o.can("access_binary")&&n.can("create_canvas")},report_upload_progress:!1,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!!~e.inArray(t,["text","document",""])},return_status_code:function(t){return!e.arrayDiff(t,[200,404])},select_file:function(){return n.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return o.can("select_file")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}}),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html4",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html4/file/FileInput",["moxie/runtime/html4/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){function e(){var o,c,d,m,h,f,p=this,g=p.getRuntime();f=i.guid("uid_"),o=g.getShimContainer(),s&&(d=n.get(s+"_form"),d&&(i.extend(d.style,{top:"100%"}),d.firstChild.setAttribute("tabindex",-1))),m=document.createElement("form"),m.setAttribute("id",f+"_form"),m.setAttribute("method","post"),m.setAttribute("enctype","multipart/form-data"),m.setAttribute("encoding","multipart/form-data"),i.extend(m.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),h=document.createElement("input"),h.setAttribute("id",f),h.setAttribute("type","file"),h.setAttribute("accept",l.join(",")),g.can("summon_file_dialog")&&h.setAttribute("tabindex",-1),i.extend(h.style,{fontSize:"999px",opacity:0}),m.appendChild(h),o.appendChild(m),i.extend(h.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===a.browser&&a.verComp(a.version,10,"<")&&i.extend(h.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),h.onchange=function(){var i;this.value&&(i=this.files?this.files[0]:{name:this.value},i=new t(g.uid,i),this.onchange=function(){},e.call(p),p.files=[i],h.setAttribute("id",i.uid),m.setAttribute("id",i.uid+"_form"),p.trigger("change"),h=m=null)},g.can("summon_file_dialog")&&(c=n.get(u.browse_button),r.removeEvent(c,"click",p.uid),r.addEvent(c,"click",function(e){h&&!h.disabled&&h.click(),e.preventDefault()},p.uid)),s=f,o=d=c=null}var s,u,c,l=[];i.extend(this,{init:function(t){var i,a=this,s=a.getRuntime();u=t,l=o.extList2mimes(t.accept,s.can("filter_by_extension")),i=s.getShimContainer(),function(){var e,o,l;e=n.get(t.browse_button),c=n.getStyle(e,"z-index")||"auto",s.can("summon_file_dialog")?("static"===n.getStyle(e,"position")&&(e.style.position="relative"),a.bind("Refresh",function(){o=parseInt(c,10)||1,n.get(u.browse_button).style.zIndex=o,this.getRuntime().getShimContainer().style.zIndex=o-1})):e.setAttribute("tabindex",-1),l=s.can("summon_file_dialog")?e:i,r.addEvent(l,"mouseover",function(){a.trigger("mouseenter")},a.uid),r.addEvent(l,"mouseout",function(){a.trigger("mouseleave")},a.uid),r.addEvent(l,"mousedown",function(){a.trigger("mousedown")},a.uid),r.addEvent(n.get(t.container),"mouseup",function(){a.trigger("mouseup")},a.uid),e=null}(),e.call(this),i=null,a.trigger({type:"ready",async:!0})},setOption:function(e,t){var i,r=this.getRuntime();"accept"==e&&(l=t.mimes||o.extList2mimes(t,r.can("filter_by_extension"))),i=n.get(s),i&&i.setAttribute("accept",l.join(","))},disable:function(e){var t;(t=n.get(s))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),i=e.getShimContainer(),o=u&&n.get(u.container),a=u&&n.get(u.browse_button);o&&r.removeAllEvents(o,this.uid),a&&(r.removeAllEvents(a,this.uid),a.style.zIndex=c),i&&(r.removeAllEvents(i,this.uid),i.innerHTML=""),t.removeInstance(this.uid),s=l=u=i=o=a=t=null}})}return e.FileInput=s}),n("moxie/runtime/html4/file/FileReader",["moxie/runtime/html4/Runtime","moxie/runtime/html5/file/FileReader"],function(e,t){return e.FileReader=t}),n("moxie/runtime/html4/xhr/XMLHttpRequest",["moxie/runtime/html4/Runtime","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Url","moxie/core/Exceptions","moxie/core/utils/Events","moxie/file/Blob","moxie/xhr/FormData"],function(e,t,i,n,r,o,a,s){function u(){function e(e){var t,n,r,a,s=this,u=!1;if(l){if(t=l.id.replace(/_iframe$/,""),n=i.get(t+"_form")){for(r=n.getElementsByTagName("input"),a=r.length;a--;)switch(r[a].getAttribute("type")){case"hidden":r[a].parentNode.removeChild(r[a]);break;case"file":u=!0}r=[],u||n.parentNode.removeChild(n),n=null}setTimeout(function(){o.removeEvent(l,"load",s.uid),l.parentNode&&l.parentNode.removeChild(l);var t=s.getRuntime().getShimContainer();t.children.length||t.parentNode.removeChild(t),t=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,m){function h(){var i=w.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='<iframe id="'+f+'_iframe" name="'+f+'_iframe" src="javascript:&quot;&quot;" style="display:none"></iframe>',l=r.firstChild,i.appendChild(l),o.addEvent(l,"load",function(){var i;try{i=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(i.title)?u=i.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(i.body.innerHTML),v.trigger({type:"progress",loaded:c.length,total:c.length}),x&&v.trigger({type:"uploadprogress",loaded:x.size||1025,total:x.size||1025}))}catch(r){if(!n.hasSameOrigin(d.url))return e.call(v,function(){v.trigger("error")}),void 0;u=404}e.call(v,function(){v.trigger("load")})},v.uid)}var f,p,g,x,v=this,w=v.getRuntime();if(u=c=null,m instanceof s&&m.hasBlob()){if(x=m.getBlob(),f=x.uid,g=i.get(f),p=i.get(f+"_form"),!p)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else f=t.guid("uid_"),p=document.createElement("form"),p.setAttribute("id",f+"_form"),p.setAttribute("method",d.method),p.setAttribute("enctype","multipart/form-data"),p.setAttribute("encoding","multipart/form-data"),w.getShimContainer().appendChild(p);p.setAttribute("target",f+"_iframe"),m instanceof s&&m.each(function(e,i){if(e instanceof a)g&&g.setAttribute("name",i);else{var n=document.createElement("input");t.extend(n,{type:"hidden",name:i,value:e}),g?p.insertBefore(n,g):p.appendChild(n)}}),p.setAttribute("action",d.url),h(),p.submit(),v.trigger("loadstart")},getStatus:function(){return u},getResponse:function(e){if("json"===e&&"string"===t.typeOf(c)&&window.JSON)try{return JSON.parse(c.replace(/^\s*<pre[^>]*>/,"").replace(/<\/pre>\s*$/,""))}catch(i){return null}return c},abort:function(){var t=this;l&&l.contentWindow&&(l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src="about:blank"),e.call(this,function(){t.dispatchEvent("abort")})},destroy:function(){this.getRuntime().getShim().removeInstance(this.uid)}})}return e.XMLHttpRequest=u}),n("moxie/runtime/html4/image/Image",["moxie/runtime/html4/Runtime","moxie/runtime/html5/image/Image"],function(e,t){return e.Image=t}),a(["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Dom","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/Blob","moxie/core/I18n","moxie/core/utils/Mime","moxie/file/FileInput","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/image/Image","moxie/core/utils/Events","moxie/runtime/html5/image/ResizerCanvas"])}(this)});
+!function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.moxie};"function"==typeof define&&define.amd?define("moxie",[],i):"object"==typeof module&&module.exports?module.exports=i():e.moxie=i()}(this||window,function(){!function(e,t){"use strict";function i(e,t){for(var i,n=[],r=0;r<e.length;++r){if(i=s[e[r]]||o(e[r]),!i)throw"module definition dependecy not found: "+e[r];n.push(i)}t.apply(null,n)}function n(e,n,r){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(n===t)throw"invalid module definition, dependencies must be specified";if(r===t)throw"invalid module definition, definition function must be specified";i(n,function(){s[e]=r.apply(null,arguments)})}function r(e){return!!s[e]}function o(t){for(var i=e,n=t.split(/[.\/]/),r=0;r<n.length;++r){if(!i[n[r]])return;i=i[n[r]]}return i}function a(i){for(var n=0;n<i.length;n++){for(var r=e,o=i[n],a=o.split(/[.\/]/),u=0;u<a.length-1;++u)r[a[u]]===t&&(r[a[u]]={}),r=r[a[u]];r[a[a.length-1]]=s[o]}}var s={};n("moxie/core/utils/Basic",[],function(){function e(e){var t;return e===t?"undefined":null===e?"null":e.nodeType?"node":{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1].toLowerCase()}function t(){return s(!1,!1,arguments)}function i(){return s(!0,!1,arguments)}function n(){return s(!1,!0,arguments)}function r(){return s(!0,!0,arguments)}function o(t){switch(e(t)){case"array":return s(!1,!0,[[],t]);case"object":return s(!1,!0,[{},t]);default:return t}}function a(i){switch(e(i)){case"array":return Array.prototype.slice.call(i);case"object":return t({},i)}return i}function s(t,i,n){var r,o=n[0];return c(n,function(n,u){u>0&&c(n,function(n,u){var c=-1!==h(e(n),["array","object"]);return n===r||t&&o[u]===r?!0:(c&&i&&(n=a(n)),e(o[u])===e(n)&&c?s(t,i,[o[u],n]):o[u]=n,void 0)})}),o}function u(e,t){function i(){this.constructor=e}for(var n in t)({}).hasOwnProperty.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.parent=t.prototype,e}function c(e,t){var i,n,r,o;if(e){try{i=e.length}catch(a){i=o}if(i===o||"number"!=typeof i){for(n in e)if(e.hasOwnProperty(n)&&t(e[n],n)===!1)return}else for(r=0;i>r;r++)if(t(e[r],r)===!1)return}}function l(t){var i;if(!t||"object"!==e(t))return!0;for(i in t)return!1;return!0}function d(t,i){function n(r){"function"===e(t[r])&&t[r](function(e){++r<o&&!e?n(r):i(e)})}var r=0,o=t.length;"function"!==e(i)&&(i=function(){}),t&&t.length||i(),n(r)}function m(e,t){var i=0,n=e.length,r=new Array(n);c(e,function(e,o){e(function(e){if(e)return t(e);var a=[].slice.call(arguments);a.shift(),r[o]=a,i++,i===n&&(r.unshift(null),t.apply(this,r))})})}function h(e,t){if(t){if(Array.prototype.indexOf)return Array.prototype.indexOf.call(t,e);for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i}return-1}function f(t,i){var n=[];"array"!==e(t)&&(t=[t]),"array"!==e(i)&&(i=[i]);for(var r in t)-1===h(t[r],i)&&n.push(t[r]);return n.length?n:!1}function p(e,t){var i=[];return c(e,function(e){-1!==h(e,t)&&i.push(e)}),i.length?i:null}function g(e){var t,i=[];for(t=0;t<e.length;t++)i[t]=e[t];return i}function x(e){return e?String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/,"").replace(/\s*$/,""):e}function v(e){if("string"!=typeof e)return e;var t,i={t:1099511627776,g:1073741824,m:1048576,k:1024};return e=/^([0-9\.]+)([tmgk]?)$/.exec(e.toLowerCase().replace(/[^0-9\.tmkg]/g,"")),t=e[2],e=+e[1],i.hasOwnProperty(t)&&(e*=i[t]),Math.floor(e)}function w(e){var t=[].slice.call(arguments,1);return e.replace(/%([a-z])/g,function(e,i){var n=t.shift();switch(i){case"s":return n+"";case"d":return parseInt(n,10);case"f":return parseFloat(n);case"c":return"";default:return n}})}function y(e,t){var i=this;setTimeout(function(){e.call(i)},t||1)}var E=function(){var e=0;return function(t){var i,n=(new Date).getTime().toString(32);for(i=0;5>i;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}();return{guid:E,typeOf:e,extend:t,extendIf:i,extendImmutable:n,extendImmutableIf:r,clone:o,inherit:u,each:c,isEmptyObj:l,inSeries:d,inParallel:m,inArray:h,arrayDiff:f,arrayIntersect:p,toArray:g,trim:x,sprintf:w,parseSizeStr:v,delay:y}}),n("moxie/core/utils/Encode",[],function(){var e=function(e){return unescape(encodeURIComponent(e))},t=function(e){return decodeURIComponent(escape(e))},i=function(e,i){if("function"==typeof window.atob)return i?t(window.atob(e)):window.atob(e);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!e)return e;e+="";do a=d.indexOf(e.charAt(m++)),s=d.indexOf(e.charAt(m++)),u=d.indexOf(e.charAt(m++)),c=d.indexOf(e.charAt(m++)),l=a<<18|s<<12|u<<6|c,n=255&l>>16,r=255&l>>8,o=255&l,p[h++]=64==u?String.fromCharCode(n):64==c?String.fromCharCode(n,r):String.fromCharCode(n,r,o);while(m<e.length);return f=p.join(""),i?t(f):f},n=function(t,i){if(i&&(t=e(t)),"function"==typeof window.btoa)return window.btoa(t);var n,r,o,a,s,u,c,l,d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",m=0,h=0,f="",p=[];if(!t)return t;do n=t.charCodeAt(m++),r=t.charCodeAt(m++),o=t.charCodeAt(m++),l=n<<16|r<<8|o,a=63&l>>18,s=63&l>>12,u=63&l>>6,c=63&l,p[h++]=d.charAt(a)+d.charAt(s)+d.charAt(u)+d.charAt(c);while(m<t.length);f=p.join("");var g=t.length%3;return(g?f.slice(0,g-3):f)+"===".slice(g||3)};return{utf8_encode:e,utf8_decode:t,atob:i,btoa:n}}),n("moxie/core/utils/Env",["moxie/core/utils/Basic"],function(e){function i(e,t,i){var n=0,r=0,o=0,a={dev:-6,alpha:-5,a:-5,beta:-4,b:-4,RC:-3,rc:-3,"#":-2,p:1,pl:1},s=function(e){return e=(""+e).replace(/[_\-+]/g,"."),e=e.replace(/([^.\d]+)/g,".$1.").replace(/\.{2,}/g,"."),e.length?e.split("."):[-8]},u=function(e){return e?isNaN(e)?a[e]||-7:parseInt(e,10):0};for(e=s(e),t=s(t),r=Math.max(e.length,t.length),n=0;r>n;n++)if(e[n]!=t[n]){if(e[n]=u(e[n]),t[n]=u(t[n]),e[n]<t[n]){o=-1;break}if(e[n]>t[n]){o=1;break}}if(!i)return o;switch(i){case">":case"gt":return o>0;case">=":case"ge":return o>=0;case"<=":case"le":return 0>=o;case"==":case"=":case"eq":return 0===o;case"<>":case"!=":case"ne":return 0!==o;case"":case"<":case"lt":return 0>o;default:return null}}var n=function(e){var t="",i="?",n="function",r="undefined",o="object",a="name",s="version",u={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},c={rgx:function(){for(var t,i,a,s,u,c,l,d=0,m=arguments;d<m.length;d+=2){var h=m[d],f=m[d+1];if(typeof t===r){t={};for(s in f)u=f[s],typeof u===o?t[u[0]]=e:t[u]=e}for(i=a=0;i<h.length;i++)if(c=h[i].exec(this.getUA())){for(s=0;s<f.length;s++)l=c[++a],u=f[s],typeof u===o&&u.length>0?2==u.length?t[u[0]]=typeof u[1]==n?u[1].call(this,l):u[1]:3==u.length?t[u[0]]=typeof u[1]!==n||u[1].exec&&u[1].test?l?l.replace(u[1],u[2]):e:l?u[1].call(this,l,u[2]):e:4==u.length&&(t[u[0]]=l?u[3].call(this,l.replace(u[1],u[2])):e):t[u]=l?l:e;break}if(c)break}return t},str:function(t,n){for(var r in n)if(typeof n[r]===o&&n[r].length>0){for(var a=0;a<n[r].length;a++)if(u.has(n[r][a],t))return r===i?e:r}else if(u.has(n[r],t))return r===i?e:r;return t}},l={browser:{oldsafari:{major:{1:["/8","/1","/3"],2:"/4","?":"/"},version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2000:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",RT:"ARM"}}}},d={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[a,s],[/\s(opr)\/([\w\.]+)/i],[[a,"Opera"],s],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]+)*/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi)\/([\w\.-]+)/i],[a,s],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[a,"IE"],s],[/(edge)\/((\d+)?[\w\.]+)/i],[a,s],[/(yabrowser)\/([\w\.]+)/i],[[a,"Yandex"],s],[/(comodo_dragon)\/([\w\.]+)/i],[[a,/_/g," "],s],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,/(uc\s?browser|qqbrowser)[\/\s]?([\w\.]+)/i],[a,s],[/(dolfin)\/([\w\.]+)/i],[[a,"Dolphin"],s],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[a,"Chrome"],s],[/XiaoMi\/MiuiBrowser\/([\w\.]+)/i],[s,[a,"MIUI Browser"]],[/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i],[s,[a,"Android Browser"]],[/FBAV\/([\w\.]+);/i],[s,[a,"Facebook"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[s,[a,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[s,a],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[a,[s,c.str,l.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[a,s],[/(navigator|netscape)\/([\w\.-]+)/i],[[a,"Netscape"],s],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]+)*/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[a,s]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[s,[a,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[a,s],[/rv\:([\w\.]+).*(gecko)/i],[s,a]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[a,s],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[a,[s,c.str,l.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[a,"Windows"],[s,c.str,l.os.windows.version]],[/\((bb)(10);/i],[[a,"BlackBerry"],s],[/(blackberry)\w*\/?([\w\.]+)*/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\os|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,/linux;.+(sailfish);/i],[a,s],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i],[[a,"Symbian"],s],[/\((series40);/i],[a],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[a,"Firefox OS"],s],[/(nintendo|playstation)\s([wids3portablevu]+)/i,/(mint)[\/\s\(]?(\w+)*/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,/(hurd|linux)\s?([\w\.]+)*/i,/(gnu)\s?([\w\.]+)*/i],[a,s],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[a,"Chromium OS"],s],[/(sunos)\s?([\w\.]+\d)*/i],[[a,"Solaris"],s],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i],[a,s],[/(ip[honead]+)(?:.*os\s*([\w]+)*\slike\smac|;\sopera)/i],[[a,"iOS"],[s,/_/g,"."]],[/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,/(macintosh|mac(?=_powerpc)\s)/i],[[a,"Mac OS"],[s,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]+)*/i,/(haiku)\s(\w+)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]+)*/i],[a,s]]},m=function(e){var i=e||(window&&window.navigator&&window.navigator.userAgent?window.navigator.userAgent:t);this.getBrowser=function(){return c.rgx.apply(this,d.browser)},this.getEngine=function(){return c.rgx.apply(this,d.engine)},this.getOS=function(){return c.rgx.apply(this,d.os)},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS()}},this.getUA=function(){return i},this.setUA=function(e){return i=e,this},this.setUA(i)};return m}(),r=function(){var i={access_global_ns:function(){return!!window.moxie},define_property:function(){return!1}(),create_canvas:function(){var e=document.createElement("canvas"),t=!(!e.getContext||!e.getContext("2d"));return i.create_canvas=t,t},return_response_type:function(t){try{if(-1!==e.inArray(t,["","text","document"]))return!0;if(window.XMLHttpRequest){var i=new XMLHttpRequest;if(i.open("get","/"),"responseType"in i)return i.responseType=t,i.responseType!==t?!1:!0}}catch(n){}return!1},use_blob_uri:function(){var e=window.URL;return i.use_blob_uri=e&&"createObjectURL"in e&&"revokeObjectURL"in e&&("IE"!==a.browser||a.verComp(a.version,"11.0.46",">=")),i.use_blob_uri},use_data_uri:function(){var e=new Image;return e.onload=function(){i.use_data_uri=1===e.width&&1===e.height},setTimeout(function(){e.src="data:image/gif;base64,R0lGODlhAQABAIAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="},1),!1}(),use_data_uri_over32kb:function(){return i.use_data_uri&&("IE"!==a.browser||a.version>=9)},use_data_uri_of:function(e){return i.use_data_uri&&33e3>e||i.use_data_uri_over32kb()},use_fileinput:function(){if(navigator.userAgent.match(/(Android (1.0|1.1|1.5|1.6|2.0|2.1))|(Windows Phone (OS 7|8.0))|(XBLWP)|(ZuneWP)|(w(eb)?OSBrowser)|(webOS)|(Kindle\/(1.0|2.0|2.5|3.0))/))return!1;var e=document.createElement("input");return e.setAttribute("type","file"),i.use_fileinput=!e.disabled},use_webgl:function(){var e,n=document.createElement("canvas"),r=null;try{r=n.getContext("webgl")||n.getContext("experimental-webgl")}catch(o){}return r||(r=null),e=!!r,i.use_webgl=e,n=t,e}};return function(t){var n=[].slice.call(arguments);return n.shift(),"function"===e.typeOf(i[t])?i[t].apply(this,n):!!i[t]}}(),o=(new n).getResult(),a={can:r,uaParser:n,browser:o.browser.name,version:o.browser.version,os:o.os.name,osVersion:o.os.version,verComp:i,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return a.OS=a.os,a}),n("moxie/core/Exceptions",["moxie/core/utils/Basic"],function(e){function t(e,t){var i;for(i in e)if(e[i]===t)return i;return null}return{RuntimeError:function(){function i(e,i){this.code=e,this.name=t(n,e),this.message=this.name+(i||": RuntimeError "+this.code)}var n={NOT_INIT_ERR:1,EXCEPTION_ERR:3,NOT_SUPPORTED_ERR:9,JS_ERR:4};return e.extend(i,n),i.prototype=Error.prototype,i}(),OperationNotAllowedException:function(){function t(e){this.code=e,this.name="OperationNotAllowedException"}return e.extend(t,{NOT_ALLOWED_ERR:1}),t.prototype=Error.prototype,t}(),ImageError:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": ImageError "+this.code}var n={WRONG_FORMAT:1,MAX_RESOLUTION_ERR:2,INVALID_META_ERR:3};return e.extend(i,n),i.prototype=Error.prototype,i}(),FileException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": FileException "+this.code}var n={NOT_FOUND_ERR:1,SECURITY_ERR:2,ABORT_ERR:3,NOT_READABLE_ERR:4,ENCODING_ERR:5,NO_MODIFICATION_ALLOWED_ERR:6,INVALID_STATE_ERR:7,SYNTAX_ERR:8};return e.extend(i,n),i.prototype=Error.prototype,i}(),DOMException:function(){function i(e){this.code=e,this.name=t(n,e),this.message=this.name+": DOMException "+this.code}var n={INDEX_SIZE_ERR:1,DOMSTRING_SIZE_ERR:2,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,INVALID_CHARACTER_ERR:5,NO_DATA_ALLOWED_ERR:6,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INUSE_ATTRIBUTE_ERR:10,INVALID_STATE_ERR:11,SYNTAX_ERR:12,INVALID_MODIFICATION_ERR:13,NAMESPACE_ERR:14,INVALID_ACCESS_ERR:15,VALIDATION_ERR:16,TYPE_MISMATCH_ERR:17,SECURITY_ERR:18,NETWORK_ERR:19,ABORT_ERR:20,URL_MISMATCH_ERR:21,QUOTA_EXCEEDED_ERR:22,TIMEOUT_ERR:23,INVALID_NODE_TYPE_ERR:24,DATA_CLONE_ERR:25};return e.extend(i,n),i.prototype=Error.prototype,i}(),EventException:function(){function t(e){this.code=e,this.name="EventException"}return e.extend(t,{UNSPECIFIED_EVENT_TYPE_ERR:0}),t.prototype=Error.prototype,t}()}}),n("moxie/core/utils/Dom",["moxie/core/utils/Env"],function(e){var t=function(e){return"string"!=typeof e?e:document.getElementById(e)},i=function(e,t){if(!e.className)return!1;var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");return i.test(e.className)},n=function(e,t){i(e,t)||(e.className=e.className?e.className.replace(/\s+$/,"")+" "+t:t)},r=function(e,t){if(e.className){var i=new RegExp("(^|\\s+)"+t+"(\\s+|$)");e.className=e.className.replace(i,function(e,t,i){return" "===t&&" "===i?" ":""})}},o=function(e,t){return e.currentStyle?e.currentStyle[t]:window.getComputedStyle?window.getComputedStyle(e,null)[t]:void 0},a=function(t,i){function n(e){var t,i,n=0,r=0;return e&&(i=e.getBoundingClientRect(),t="CSS1Compat"===c.compatMode?c.documentElement:c.body,n=i.left+t.scrollLeft,r=i.top+t.scrollTop),{x:n,y:r}}var r,o,a,s=0,u=0,c=document;if(t=t,i=i||c.body,t&&t.getBoundingClientRect&&"IE"===e.browser&&(!c.documentMode||c.documentMode<8))return o=n(t),a=n(i),{x:o.x-a.x,y:o.y-a.y};for(r=t;r&&r!=i&&r.nodeType;)s+=r.offsetLeft||0,u+=r.offsetTop||0,r=r.offsetParent;for(r=t.parentNode;r&&r!=i&&r.nodeType;)s-=r.scrollLeft||0,u-=r.scrollTop||0,r=r.parentNode;return{x:s,y:u}},s=function(e){return{w:e.offsetWidth||e.clientWidth,h:e.offsetHeight||e.clientHeight}};return{get:t,hasClass:i,addClass:n,removeClass:r,getStyle:o,getPos:a,getSize:s}}),n("moxie/core/EventTarget",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic"],function(e,t,i){function n(){this.uid=i.guid()}var r={};return i.extend(n.prototype,{init:function(){this.uid||(this.uid=i.guid("uid_"))},addEventListener:function(e,t,n,o){var a,s=this;return this.hasOwnProperty("uid")||(this.uid=i.guid("uid_")),e=i.trim(e),/\s/.test(e)?(i.each(e.split(/\s+/),function(e){s.addEventListener(e,t,n,o)}),void 0):(e=e.toLowerCase(),n=parseInt(n,10)||0,a=r[this.uid]&&r[this.uid][e]||[],a.push({fn:t,priority:n,scope:o||this}),r[this.uid]||(r[this.uid]={}),r[this.uid][e]=a,void 0)},hasEventListener:function(e){var t;return e?(e=e.toLowerCase(),t=r[this.uid]&&r[this.uid][e]):t=r[this.uid],t?t:!1},removeEventListener:function(e,t){var n,o,a=this;if(e=e.toLowerCase(),/\s/.test(e))return i.each(e.split(/\s+/),function(e){a.removeEventListener(e,t)}),void 0;if(n=r[this.uid]&&r[this.uid][e]){if(t){for(o=n.length-1;o>=0;o--)if(n[o].fn===t){n.splice(o,1);break}}else n=[];n.length||(delete r[this.uid][e],i.isEmptyObj(r[this.uid])&&delete r[this.uid])}},removeAllEventListeners:function(){r[this.uid]&&delete r[this.uid]},dispatchEvent:function(e){var n,o,a,s,u,c={},l=!0;if("string"!==i.typeOf(e)){if(s=e,"string"!==i.typeOf(s.type))throw new t.EventException(t.EventException.UNSPECIFIED_EVENT_TYPE_ERR);e=s.type,s.total!==u&&s.loaded!==u&&(c.total=s.total,c.loaded=s.loaded),c.async=s.async||!1}if(-1!==e.indexOf("::")?function(t){n=t[0],e=t[1]}(e.split("::")):n=this.uid,e=e.toLowerCase(),o=r[n]&&r[n][e]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),c.type=e,a.unshift(c);var d=[];i.each(o,function(e){a[0].target=e.scope,c.async?d.push(function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}):d.push(function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&i.inSeries(d,function(e){l=!e})}return l},bindOnce:function(e,t,i,n){var r=this;r.bind.call(this,e,function o(){return r.unbind(e,o),t.apply(this,arguments)},i,n)},bind:function(){this.addEventListener.apply(this,arguments)},unbind:function(){this.removeEventListener.apply(this,arguments)},unbindAll:function(){this.removeAllEventListeners.apply(this,arguments)},trigger:function(){return this.dispatchEvent.apply(this,arguments)},handleEventProps:function(e){var t=this;this.bind(e.join(" "),function(e){var t="on"+e.type.toLowerCase();"function"===i.typeOf(this[t])&&this[t].apply(this,arguments)}),i.each(e,function(e){e="on"+e.toLowerCase(e),"undefined"===i.typeOf(t[e])&&(t[e]=null)})}}),n.instance=new n,n}),n("moxie/runtime/Runtime",["moxie/core/utils/Env","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/EventTarget"],function(e,t,i,n){function r(e,n,o,s,u){var c,l=this,d=t.guid(n+"_"),m=u||"browser";e=e||{},a[d]=this,o=t.extend({access_binary:!1,access_image_binary:!1,display_media:!1,do_cors:!1,drag_and_drop:!1,filter_by_extension:!0,resize_image:!1,report_upload_progress:!1,return_response_headers:!1,return_response_type:!1,return_status_code:!0,send_custom_headers:!1,select_file:!1,select_folder:!1,select_multiple:!0,send_binary_string:!1,send_browser_cookies:!0,send_multipart:!0,slice_blob:!1,stream_upload:!1,summon_file_dialog:!1,upload_filesize:!0,use_http_method:!0},o),e.preferred_caps&&(m=r.getMode(s,e.preferred_caps,m)),c=function(){var e={};return{exec:function(t,i,n,r){return c[i]&&(e[t]||(e[t]={context:this,instance:new c[i]}),e[t].instance[n])?e[t].instance[n].apply(this,r):void 0},removeInstance:function(t){delete e[t]},removeAllInstances:function(){var i=this;t.each(e,function(e,n){"function"===t.typeOf(e.instance.destroy)&&e.instance.destroy.call(e.context),i.removeInstance(n)})}}}(),t.extend(this,{initialized:!1,uid:d,type:n,mode:r.getMode(s,e.required_caps,m),shimid:d+"_container",clients:0,options:e,can:function(e,i){var n=arguments[2]||o;if("string"===t.typeOf(e)&&"undefined"===t.typeOf(i)&&(e=r.parseCaps(e)),"object"===t.typeOf(e)){for(var a in e)if(!this.can(a,e[a],n))return!1;return!0}return"function"===t.typeOf(n[e])?n[e].call(this,i):i===n[e]},getShimContainer:function(){var e,n=i.get(this.shimid);return n||(e=i.get(this.options.container)||document.body,n=document.createElement("div"),n.id=this.shimid,n.className="moxie-shim moxie-shim-"+this.type,t.extend(n.style,{position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),e.appendChild(n),e=null),n},getShim:function(){return c},shimExec:function(e,t){var i=[].slice.call(arguments,2);return l.getShim().exec.call(this,this.uid,e,t,i)},exec:function(e,t){var i=[].slice.call(arguments,2);return l[e]&&l[e][t]?l[e][t].apply(this,i):l.shimExec.apply(this,arguments)},destroy:function(){if(l){var e=i.get(this.shimid);e&&e.parentNode.removeChild(e),c&&c.removeAllInstances(),this.unbindAll(),delete a[this.uid],this.uid=null,d=l=c=e=null}}}),this.mode&&e.required_caps&&!this.can(e.required_caps)&&(this.mode=!1)}var o={},a={};return r.order="html5,flash,silverlight,html4",r.getRuntime=function(e){return a[e]?a[e]:!1},r.addConstructor=function(e,t){t.prototype=n.instance,o[e]=t},r.getConstructor=function(e){return o[e]||null},r.getInfo=function(e){var t=r.getRuntime(e);return t?{uid:t.uid,type:t.type,mode:t.mode,can:function(){return t.can.apply(t,arguments)}}:null},r.parseCaps=function(e){var i={};return"string"!==t.typeOf(e)?e||{}:(t.each(e.split(","),function(e){i[e]=!0}),i)},r.can=function(e,t){var i,n,o=r.getConstructor(e);return o?(i=new o({required_caps:t}),n=i.mode,i.destroy(),!!n):!1},r.thatCan=function(e,t){var i=(t||r.order).split(/\s*,\s*/);for(var n in i)if(r.can(i[n],e))return i[n];return null},r.getMode=function(e,i,n){var r=null;if("undefined"===t.typeOf(n)&&(n="browser"),i&&!t.isEmptyObj(e)){if(t.each(i,function(i,n){if(e.hasOwnProperty(n)){var o=e[n](i);if("string"==typeof o&&(o=[o]),r){if(!(r=t.arrayIntersect(r,o)))return r=!1}else r=o}}),r)return-1!==t.inArray(n,r)?n:r[0];if(r===!1)return!1}return n},r.getGlobalEventTarget=function(){if(/^moxie\./.test(e.global_event_dispatcher)&&!e.can("access_global_ns")){var i=t.guid("moxie_event_target_");window[i]=function(e,t){n.instance.dispatchEvent(e,t)},e.global_event_dispatcher=i}return e.global_event_dispatcher},r.capTrue=function(){return!0},r.capFalse=function(){return!1},r.capTest=function(e){return function(){return!!e}},r}),n("moxie/runtime/RuntimeClient",["moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/Runtime"],function(e,t,i,n){return function(){var e;i.extend(this,{connectRuntime:function(r){function o(i){var a,u;return i.length?(a=i.shift().toLowerCase(),(u=n.getConstructor(a))?(e=new u(r),e.bind("Init",function(){e.initialized=!0,setTimeout(function(){e.clients++,s.ruid=e.uid,s.trigger("RuntimeInit",e)},1)}),e.bind("Error",function(){e.destroy(),o(i)}),e.bind("Exception",function(e,i){var n=i.name+"(#"+i.code+")"+(i.message?", from: "+i.message:"");s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.EXCEPTION_ERR,n))}),e.mode?(e.init(),void 0):(e.trigger("Error"),void 0)):(o(i),void 0)):(s.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)),e=null,void 0)}var a,s=this;if("string"===i.typeOf(r)?a=r:"string"===i.typeOf(r.ruid)&&(a=r.ruid),a){if(e=n.getRuntime(a))return s.ruid=a,e.clients++,e;throw new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)}o((r.runtime_order||n.order).split(/\s*,\s*/))},disconnectRuntime:function(){e&&--e.clients<=0&&e.destroy(),e=null},getRuntime:function(){return e&&e.uid?e:e=null},exec:function(){return e?e.exec.apply(this,arguments):null},can:function(t){return e?e.can(t):!1}})}}),n("moxie/file/Blob",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient"],function(e,t,i){function n(o,a){function s(t,i,o){var a,s=r[this.uid];return"string"===e.typeOf(s)&&s.length?(a=new n(null,{type:o,size:i-t}),a.detach(s.substr(t,a.size)),a):null}i.call(this),o&&this.connectRuntime(o),a?"string"===e.typeOf(a)&&(a={data:a}):a={},e.extend(this,{uid:a.uid||e.guid("uid_"),ruid:o,size:a.size||0,type:a.type||"",slice:function(e,t,i){return this.isDetached()?s.apply(this,arguments):this.getRuntime().exec.call(this,"Blob","slice",this.getSource(),e,t,i)},getSource:function(){return r[this.uid]?r[this.uid]:null},detach:function(e){if(this.ruid&&(this.getRuntime().exec.call(this,"Blob","destroy"),this.disconnectRuntime(),this.ruid=null),e=e||"","data:"==e.substr(0,5)){var i=e.indexOf(";base64,");this.type=e.substring(5,i),e=t.atob(e.substring(i+8))}this.size=e.length,r[this.uid]=e},isDetached:function(){return!this.ruid&&"string"===e.typeOf(r[this.uid])},destroy:function(){this.detach(),delete r[this.uid]}}),a.data?this.detach(a.data):r[this.uid]=a}var r={};return n}),n("moxie/core/I18n",["moxie/core/utils/Basic"],function(e){var t={};return{addI18n:function(i){return e.extend(t,i)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var i=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=i.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),n("moxie/core/utils/Mime",["moxie/core/utils/Basic","moxie/core/I18n"],function(e,t){var i="application/msword,doc dot,application/pdf,pdf,application/pgp-signature,pgp,application/postscript,ps ai eps,application/rtf,rtf,application/vnd.ms-excel,xls xlb xlt xla,application/vnd.ms-powerpoint,ppt pps pot ppa,application/zip,zip,application/x-shockwave-flash,swf swfl,application/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,application/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,application/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,application/vnd.openxmlformats-officedocument.presentationml.template,potx,application/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,application/x-javascript,js,application/json,json,audio/mpeg,mp3 mpga mpega mp2,audio/x-wav,wav,audio/x-m4a,m4a,audio/ogg,oga ogg,audio/aiff,aiff aif,audio/flac,flac,audio/aac,aac,audio/ac3,ac3,audio/x-ms-wma,wma,image/bmp,bmp,image/gif,gif,image/jpeg,jpg jpeg jpe,image/photoshop,psd,image/png,png,image/svg+xml,svg svgz,image/tiff,tiff tif,text/plain,asc txt text diff log,text/html,htm html xhtml,text/css,css,text/csv,csv,text/rtf,rtf,video/mpeg,mpeg mpg mpe m2v,video/quicktime,qt mov,video/mp4,mp4,video/x-m4v,m4v,video/x-flv,flv,video/x-ms-wmv,wmv,video/avi,avi,video/webm,webm,video/3gpp,3gpp 3gp,video/3gpp2,3g2,video/vnd.rn-realvideo,rv,video/ogg,ogv,video/x-matroska,mkv,application/vnd.oasis.opendocument.formula-template,otf,application/octet-stream,exe",n={},r={},o=function(e){var t,i,o,a=e.split(/,/);for(t=0;t<a.length;t+=2){for(o=a[t+1].split(/ /),i=0;i<o.length;i++)n[o[i]]=a[t];r[a[t]]=o}},a=function(t,i){var n,r,o,a,s=[];for(r=0;r<t.length;r++)for(n=t[r].extensions.toLowerCase().split(/\s*,\s*/),o=0;o<n.length;o++){if("*"===n[o])return[];if(a=s[n[o]],i&&/^\w+$/.test(n[o]))s.push("."+n[o]);else if(a&&-1===e.inArray(a,s))s.push(a);else if(!a)return[]}return s},s=function(t){var i=[];return e.each(t,function(t){if(t=t.toLowerCase(),"*"===t)return i=[],!1;var n=t.match(/^(\w+)\/(\*|\w+)$/);n&&("*"===n[2]?e.each(r,function(e,t){new RegExp("^"+n[1]+"/").test(t)&&[].push.apply(i,r[t])}):r[t]&&[].push.apply(i,r[t]))}),i},u=function(i){var n=[],r=[];return"string"===e.typeOf(i)&&(i=e.trim(i).split(/\s*,\s*/)),r=s(i),n.push({title:t.translate("Files"),extensions:r.length?r.join(","):"*"}),n},c=function(e){var t=e&&e.match(/\.([^.]+)$/);return t?t[1].toLowerCase():""},l=function(e){return n[c(e)]||""};return o(i),{mimes:n,extensions:r,addMimeType:o,extList2mimes:a,mimes2exts:s,mimes2extList:u,getFileExtension:c,getFileMime:l}}),n("moxie/file/FileInput",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Mime","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/I18n","moxie/runtime/Runtime","moxie/runtime/RuntimeClient"],function(e,t,i,n,r,o,a,s,u){function c(t){var o,c,d;if(-1!==e.inArray(e.typeOf(t),["string","node"])&&(t={browse_button:t}),c=n.get(t.browse_button),!c)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR);d={accept:[{title:a.translate("All Files"),extensions:"*"}],multiple:!1,required_caps:!1,container:c.parentNode||document.body},t=e.extend({},d,t),"string"==typeof t.required_caps&&(t.required_caps=s.parseCaps(t.required_caps)),"string"==typeof t.accept&&(t.accept=i.mimes2extList(t.accept)),o=n.get(t.container),o||(o=document.body),"static"===n.getStyle(o,"position")&&(o.style.position="relative"),o=c=null,u.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,shimid:null,files:null,init:function(){var i=this;i.bind("RuntimeInit",function(r,o){i.ruid=o.uid,i.shimid=o.shimid,i.bind("Ready",function(){i.trigger("Refresh")},999),i.bind("Refresh",function(){var i,r,a,s,u;a=n.get(t.browse_button),s=n.get(o.shimid),a&&(i=n.getPos(a,n.get(t.container)),r=n.getSize(a),u=parseInt(n.getStyle(a,"z-index"),10)||0,s&&e.extend(s.style,{top:i.y+"px",left:i.x+"px",width:r.w+"px",height:r.h+"px",zIndex:u+1})),s=a=null}),o.exec.call(i,"FileInput","init",t)}),i.connectRuntime(e.extend({},t,{required_caps:{select_file:!0}}))},getOption:function(e){return t[e]},setOption:function(e,n){if(t.hasOwnProperty(e)){var o=t[e];switch(e){case"accept":"string"==typeof n&&(n=i.mimes2extList(n));break;case"container":case"required_caps":throw new r.FileException(r.FileException.NO_MODIFICATION_ALLOWED_ERR)}t[e]=n,this.exec("FileInput","setOption",e,n),this.trigger("OptionChanged",e,n,o)}},disable:function(t){var i=this.getRuntime();i&&this.exec("FileInput","disable","undefined"===e.typeOf(t)?!0:t)},refresh:function(){this.trigger("Refresh")},destroy:function(){var t=this.getRuntime();t&&(t.exec.call(this,"FileInput","destroy"),this.disconnectRuntime()),"array"===e.typeOf(this.files)&&e.each(this.files,function(e){e.destroy()}),this.files=null,this.unbindAll()}}),this.handleEventProps(l)}var l=["ready","change","cancel","mouseenter","mouseleave","mousedown","mouseup"];return c.prototype=o.instance,c}),n("moxie/file/File",["moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/file/Blob"],function(e,t,i){function n(n,r){r||(r={}),i.apply(this,arguments),this.type||(this.type=t.getFileMime(r.name));var o;if(r.name)o=r.name.replace(/\\/g,"/"),o=o.substr(o.lastIndexOf("/")+1);else if(this.type){var a=this.type.split("/")[0];o=e.guid((""!==a?a:"file")+"_"),t.extensions[this.type]&&(o+="."+t.extensions[this.type][0])}e.extend(this,{name:o||e.guid("file_"),relativePath:"",lastModifiedDate:r.lastModifiedDate||(new Date).toLocaleString()})}return n.prototype=i.prototype,n}),n("moxie/file/FileDrop",["moxie/core/I18n","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/core/utils/Basic","moxie/core/utils/Env","moxie/file/File","moxie/runtime/RuntimeClient","moxie/core/EventTarget","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u){function c(i){var r,o=this;"string"==typeof i&&(i={drop_zone:i}),r={accept:[{title:e.translate("All Files"),extensions:"*"}],required_caps:{drag_and_drop:!0}},i="object"==typeof i?n.extend({},r,i):r,i.container=t.get(i.drop_zone)||document.body,"static"===t.getStyle(i.container,"position")&&(i.container.style.position="relative"),"string"==typeof i.accept&&(i.accept=u.mimes2extList(i.accept)),a.call(o),n.extend(o,{uid:n.guid("uid_"),ruid:null,files:null,init:function(){o.bind("RuntimeInit",function(e,t){o.ruid=t.uid,t.exec.call(o,"FileDrop","init",i),o.dispatchEvent("ready")
+}),o.connectRuntime(i)},destroy:function(){var e=this.getRuntime();e&&(e.exec.call(this,"FileDrop","destroy"),this.disconnectRuntime()),this.files=null,this.unbindAll()}}),this.handleEventProps(l)}var l=["ready","dragenter","dragleave","drop","error"];return c.prototype=s.instance,c}),n("moxie/file/FileReader",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/Exceptions","moxie/core/EventTarget","moxie/file/Blob","moxie/runtime/RuntimeClient"],function(e,t,i,n,r,o){function a(){function n(e,n){if(this.trigger("loadstart"),this.readyState===a.LOADING)return this.trigger("error",new i.DOMException(i.DOMException.INVALID_STATE_ERR)),this.trigger("loadend"),void 0;if(!(n instanceof r))return this.trigger("error",new i.DOMException(i.DOMException.NOT_FOUND_ERR)),this.trigger("loadend"),void 0;if(this.result=null,this.readyState=a.LOADING,n.isDetached()){var o=n.getSource();switch(e){case"readAsText":case"readAsBinaryString":this.result=o;break;case"readAsDataURL":this.result="data:"+n.type+";base64,"+t.btoa(o)}this.readyState=a.DONE,this.trigger("load"),this.trigger("loadend")}else this.connectRuntime(n.ruid),this.exec("FileReader","read",e,n)}o.call(this),e.extend(this,{uid:e.guid("uid_"),readyState:a.EMPTY,result:null,error:null,readAsBinaryString:function(e){n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){n.call(this,"readAsDataURL",e)},readAsText:function(e){n.call(this,"readAsText",e)},abort:function(){this.result=null,-1===e.inArray(this.readyState,[a.EMPTY,a.DONE])&&(this.readyState===a.LOADING&&(this.readyState=a.DONE),this.exec("FileReader","abort"),this.trigger("abort"),this.trigger("loadend"))},destroy:function(){this.abort(),this.exec("FileReader","destroy"),this.disconnectRuntime(),this.unbindAll()}}),this.handleEventProps(s),this.bind("Error",function(e,t){this.readyState=a.DONE,this.error=t},999),this.bind("Load",function(){this.readyState=a.DONE},999)}var s=["loadstart","progress","load","abort","error","loadend"];return a.EMPTY=0,a.LOADING=1,a.DONE=2,a.prototype=n.instance,a}),n("moxie/core/utils/Url",["moxie/core/utils/Basic"],function(e){var t=function(i,n){var r,o=["source","scheme","authority","userInfo","user","pass","host","port","relative","path","directory","file","query","fragment"],a=o.length,s={http:80,https:443},u={},c=/^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@\/]*):?([^:@\/]*))?@)?(\[[\da-fA-F:]+\]|[^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,l=c.exec(i||""),d=/^\/\/\w/.test(i);switch(e.typeOf(n)){case"undefined":n=t(document.location.href,!1);break;case"string":n=t(n,!1)}for(;a--;)l[a]&&(u[o[a]]=l[a]);if(r=!d&&!u.scheme,(d||r)&&(u.scheme=n.scheme),r){u.host=n.host,u.port=n.port;var m="";/^[^\/]/.test(u.path)&&(m=n.path,m=/\/[^\/]*\.[^\/]*$/.test(m)?m.replace(/\/[^\/]+$/,"/"):m.replace(/\/?$/,"/")),u.path=m+(u.path||"")}return u.port||(u.port=s[u.scheme]||80),u.port=parseInt(u.port,10),u.path||(u.path="/"),delete u.source,u},i=function(e){var i={http:80,https:443},n="object"==typeof e?e:t(e);return n.scheme+"://"+n.host+(n.port!==i[n.scheme]?":"+n.port:"")+n.path+(n.query?n.query:"")},n=function(e){function i(e){return[e.scheme,e.host,e.port].join("/")}return"string"==typeof e&&(e=t(e)),i(t())===i(e)};return{parseUrl:t,resolveUrl:i,hasSameOrigin:n}}),n("moxie/runtime/RuntimeTarget",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i){function n(){this.uid=e.guid("uid_"),t.call(this),this.destroy=function(){this.disconnectRuntime(),this.unbindAll()}}return n.prototype=i.instance,n}),n("moxie/file/FileReaderSync",["moxie/core/utils/Basic","moxie/runtime/RuntimeClient","moxie/core/utils/Encode"],function(e,t,i){return function(){function n(e,t){if(!t.isDetached()){var n=this.connectRuntime(t.ruid).exec.call(this,"FileReaderSync","read",e,t);return this.disconnectRuntime(),n}var r=t.getSource();switch(e){case"readAsBinaryString":return r;case"readAsDataURL":return"data:"+t.type+";base64,"+i.btoa(r);case"readAsText":for(var o="",a=0,s=r.length;s>a;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return n.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return n.call(this,"readAsDataURL",e)},readAsText:function(e){return n.call(this,"readAsText",e)}})}}),n("moxie/xhr/FormData",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/file/Blob"],function(e,t,i){function n(){var e,n=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof i?e={name:r,value:o}:"array"===s?(r+="[]",t.each(o,function(e){a.append(r,e)})):"object"===s?t.each(o,function(e,t){a.append(r+"["+t+"]",e)}):"null"===s||"undefined"===s||"number"===s&&isNaN(o)?a.append(r,"false"):n.push({name:r,value:o.toString()})},hasBlob:function(){return!!this.getBlob()},getBlob:function(){return e&&e.value||null},getBlobName:function(){return e&&e.name||null},each:function(i){t.each(n,function(e){i(e.value,e.name)}),e&&i(e.value,e.name)},destroy:function(){e=null,n=[]}})}return n}),n("moxie/xhr/XMLHttpRequest",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/EventTarget","moxie/core/utils/Encode","moxie/core/utils/Url","moxie/runtime/Runtime","moxie/runtime/RuntimeTarget","moxie/file/Blob","moxie/file/FileReaderSync","moxie/xhr/FormData","moxie/core/utils/Env","moxie/core/utils/Mime"],function(e,t,i,n,r,o,a,s,u,c,l,d){function m(){this.uid=e.guid("uid_")}function h(){function i(e,t){return I.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?I[e]:A[e]:(l.can("define_property")?I[e]=t:A[e]=t,void 0):void 0}function u(t){function n(){_&&(_.destroy(),_=null),s.dispatchEvent("loadend"),s=null}function r(r){_.bind("LoadStart",function(e){i("readyState",h.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),L&&s.upload.dispatchEvent(e)}),_.bind("Progress",function(e){i("readyState")!==h.LOADING&&(i("readyState",h.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),_.bind("UploadProgress",function(e){L&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),_.bind("Load",function(t){i("readyState",h.DONE),i("status",Number(r.exec.call(_,"XMLHttpRequest","getStatus")||0)),i("statusText",f[i("status")]||""),i("response",r.exec.call(_,"XMLHttpRequest","getResponse",i("responseType"))),~e.inArray(i("responseType"),["text",""])?i("responseText",i("response")):"document"===i("responseType")&&i("responseXML",i("response")),U=r.exec.call(_,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),i("status")>0?(L&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(F=!0,s.dispatchEvent("error")),n()}),_.bind("Abort",function(e){s.dispatchEvent(e),n()}),_.bind("Error",function(e){F=!0,i("readyState",h.DONE),s.dispatchEvent("readystatechange"),M=!0,s.dispatchEvent(e),n()}),r.exec.call(_,"XMLHttpRequest","send",{url:x,method:v,async:T,user:w,password:y,headers:S,mimeType:D,encoding:O,responseType:s.responseType,withCredentials:s.withCredentials,options:k},t)}var s=this;E=(new Date).getTime(),_=new a,"string"==typeof k.required_caps&&(k.required_caps=o.parseCaps(k.required_caps)),k.required_caps=e.extend({},k.required_caps,{return_response_type:s.responseType}),t instanceof c&&(k.required_caps.send_multipart=!0),e.isEmptyObj(S)||(k.required_caps.send_custom_headers=!0),B||(k.required_caps.do_cors=!0),k.ruid?r(_.connectRuntime(k)):(_.bind("RuntimeInit",function(e,t){r(t)}),_.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),_.connectRuntime(k))}function g(){i("responseText",""),i("responseXML",null),i("response",null),i("status",0),i("statusText",""),E=b=null}var x,v,w,y,E,b,_,R,A=this,I={timeout:0,readyState:h.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},T=!0,S={},O=null,D=null,N=!1,C=!1,L=!1,M=!1,F=!1,B=!1,P=null,H=null,k={},U="";e.extend(this,I,{uid:e.guid("uid_"),upload:new m,open:function(o,a,s,u,c){var l;if(!o||!a)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(/[\u0100-\uffff]/.test(o)||n.utf8_encode(o)!==o)throw new t.DOMException(t.DOMException.SYNTAX_ERR);if(~e.inArray(o.toUpperCase(),["CONNECT","DELETE","GET","HEAD","OPTIONS","POST","PUT","TRACE","TRACK"])&&(v=o.toUpperCase()),~e.inArray(v,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=n.utf8_encode(a),l=r.parseUrl(a),B=r.hasSameOrigin(l),x=r.resolveUrl(a),(u||c)&&!B)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(w=u||l.user,y=c||l.pass,T=s||!0,T===!1&&(i("timeout")||i("withCredentials")||""!==i("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);N=!T,C=!1,S={},g.call(this),i("readyState",h.OPENED),this.dispatchEvent("readystatechange")},setRequestHeader:function(r,o){var a=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","content-transfer-encoding","date","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"];if(i("readyState")!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||n.utf8_encode(r)!==r)throw new t.DOMException(t.DOMException.SYNTAX_ERR);return r=e.trim(r).toLowerCase(),~e.inArray(r,a)||/^(proxy\-|sec\-)/.test(r)?!1:(S[r]?S[r]+=", "+o:S[r]=o,!0)},hasRequestHeader:function(e){return e&&S[e.toLowerCase()]||!1},getAllResponseHeaders:function(){return U||""},getResponseHeader:function(t){return t=t.toLowerCase(),F||~e.inArray(t,["set-cookie","set-cookie2"])?null:U&&""!==U&&(R||(R={},e.each(U.split(/\r\n/),function(t){var i=t.split(/:\s+/);2===i.length&&(i[0]=e.trim(i[0]),R[i[0].toLowerCase()]={header:i[0],value:e.trim(i[1])})})),R.hasOwnProperty(t))?R[t].header+": "+R[t].value:null},overrideMimeType:function(n){var r,o;if(~e.inArray(i("readyState"),[h.LOADING,h.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n=e.trim(n.toLowerCase()),/;/.test(n)&&(r=n.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(n=r[1],r[2]&&(o=r[2])),!d.mimes[n])throw new t.DOMException(t.DOMException.SYNTAX_ERR);P=n,H=o},send:function(i,r){if(k="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.readyState!==h.OPENED||C)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i instanceof s)k.ruid=i.ruid,D=i.type||"application/octet-stream";else if(i instanceof c){if(i.hasBlob()){var o=i.getBlob();k.ruid=o.ruid,D=o.type||"application/octet-stream"}}else"string"==typeof i&&(O="UTF-8",D="text/plain;charset=UTF-8",i=n.utf8_encode(i));this.withCredentials||(this.withCredentials=k.required_caps&&k.required_caps.send_browser_cookies&&!B),L=!N&&this.upload.hasEventListener(),F=!1,M=!i,N||(C=!0),u.call(this,i)},abort:function(){if(F=!0,N=!1,~e.inArray(i("readyState"),[h.UNSENT,h.OPENED,h.DONE]))i("readyState",h.UNSENT);else{if(i("readyState",h.DONE),C=!1,!_)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);_.getRuntime().exec.call(_,"XMLHttpRequest","abort",M),M=!0}},destroy:function(){_&&("function"===e.typeOf(_.destroy)&&_.destroy(),_=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}}),this.handleEventProps(p.concat(["readystatechange"])),this.upload.handleEventProps(p)}var f={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",306:"Reserved",307:"Temporary Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Long",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",426:"Upgrade Required",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",510:"Not Extended"};m.prototype=i.instance;var p=["loadstart","progress","abort","error","load","timeout","loadend"];return h.UNSENT=0,h.OPENED=1,h.HEADERS_RECEIVED=2,h.LOADING=3,h.DONE=4,h.prototype=i.instance,h}),n("moxie/runtime/Transporter",["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/runtime/RuntimeClient","moxie/core/EventTarget"],function(e,t,i,n){function r(){function n(){l=d=0,c=this.result=null}function o(t,i){var n=this;u=i,n.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(n.state,[r.IDLE,r.DONE])&&a.call(n)},999),n.bind("TransportingComplete",function(){d=l,n.state=r.DONE,c=null,n.result=u.exec.call(n,"Transporter","getAsBlob",t||"")},999),n.state=r.BUSY,n.trigger("TransportingStarted"),a.call(n)}function a(){var e,i=this,n=l-d;m>n&&(m=n),e=t.btoa(c.substr(d,m)),u.exec.call(i,"Transporter","receive",e,l)}var s,u,c,l,d,m;i.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,i,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),m=r.chunk_size,n.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,i,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,i,t)};this.bind("RuntimeInit",u),this.connectRuntime(r)}},abort:function(){var e=this;e.state=r.IDLE,u&&(u.exec.call(e,"Transporter","clear"),e.trigger("TransportingAborted")),n.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),n.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=n.instance,r}),n("moxie/image/Image",["moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/file/FileReaderSync","moxie/xhr/XMLHttpRequest","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/runtime/Transporter","moxie/core/utils/Env","moxie/core/EventTarget","moxie/file/Blob","moxie/file/File","moxie/core/utils/Encode"],function(e,t,i,n,r,o,a,s,u,c,l,d,m){function h(){function n(e){try{return e||(e=this.exec("Image","getInfo")),this.size=e.size,this.width=e.width,this.height=e.height,this.type=e.type,this.meta=e.meta,""===this.name&&(this.name=e.name),!0}catch(t){return this.trigger("error",t.code),!1}}function c(t){var n=e.typeOf(t);try{if(t instanceof h){if(!t.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);p.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new i.ImageError(i.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(n,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===n)"data:"===t.substr(0,5)?c.call(this,new l(null,{data:t}),arguments[1]):x.apply(this,arguments);else{if("node"!==n||"img"!==t.nodeName.toLowerCase())throw new i.DOMException(i.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r.code)}}function p(t,i){var n=this.connectRuntime(t.ruid);this.ruid=n.uid,n.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(i)?!0:i)}function g(t,i){function n(e){r.ruid=e.uid,e.exec.call(r,"Image","loadFromBlob",t)}var r=this;r.name=t.name||"",t.isDetached()?(this.bind("RuntimeInit",function(e,t){n(t)}),i&&"string"==typeof i.required_caps&&(i.required_caps=o.parseCaps(i.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},i))):n(this.connectRuntime(t.ruid))}function x(e,t){var i,n=this;i=new r,i.open("get",e),i.responseType="blob",i.onprogress=function(e){n.trigger(e)},i.onload=function(){g.call(n,i.response,!0)},i.onerror=function(e){n.trigger(e)},i.onloadend=function(){i.destroy()},i.bind("RuntimeError",function(e,t){n.trigger("RuntimeError",t)}),i.send(null,t)}a.call(this),e.extend(this,{uid:e.guid("uid_"),ruid:null,name:"",size:0,width:0,height:0,type:"",meta:{},clone:function(){this.load.apply(this,arguments)},load:function(){c.apply(this,arguments)},resize:function(t){var n,r,o=this,a={x:0,y:0,width:o.width,height:o.height},s=e.extendIf({width:o.width,height:o.height,type:o.type||"image/jpeg",quality:90,crop:!1,fit:!0,preserveHeaders:!0,resample:"default",multipass:!0},t);try{if(!o.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);if(o.width>h.MAX_RESIZE_WIDTH||o.height>h.MAX_RESIZE_HEIGHT)throw new i.ImageError(i.ImageError.MAX_RESOLUTION_ERR);if(n=o.meta&&o.meta.tiff&&o.meta.tiff.Orientation||1,-1!==e.inArray(n,[5,6,7,8])){var u=s.width;s.width=s.height,s.height=u}if(s.crop){switch(r=Math.max(s.width/o.width,s.height/o.height),t.fit?(a.width=Math.min(Math.ceil(s.width/r),o.width),a.height=Math.min(Math.ceil(s.height/r),o.height),r=s.width/a.width):(a.width=Math.min(s.width,o.width),a.height=Math.min(s.height,o.height),r=1),"boolean"==typeof s.crop&&(s.crop="cc"),s.crop.toLowerCase().replace(/_/,"-")){case"rb":case"right-bottom":a.x=o.width-a.width,a.y=o.height-a.height;break;case"cb":case"center-bottom":a.x=Math.floor((o.width-a.width)/2),a.y=o.height-a.height;break;case"lb":case"left-bottom":a.x=0,a.y=o.height-a.height;break;case"lt":case"left-top":a.x=0,a.y=0;break;case"ct":case"center-top":a.x=Math.floor((o.width-a.width)/2),a.y=0;break;case"rt":case"right-top":a.x=o.width-a.width,a.y=0;break;case"rc":case"right-center":case"right-middle":a.x=o.width-a.width,a.y=Math.floor((o.height-a.height)/2);break;case"lc":case"left-center":case"left-middle":a.x=0,a.y=Math.floor((o.height-a.height)/2);break;case"cc":case"center-center":case"center-middle":default:a.x=Math.floor((o.width-a.width)/2),a.y=Math.floor((o.height-a.height)/2)}a.x=Math.max(a.x,0),a.y=Math.max(a.y,0)}else r=Math.min(s.width/o.width,s.height/o.height),r>1&&!s.fit&&(r=1);this.exec("Image","resize",a,r,s)}catch(c){o.trigger("error",c.code)}},downsize:function(t){var i,n={width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,crop:!1,fit:!1,preserveHeaders:!0,resample:"default"};i="object"==typeof t?e.extend(n,t):e.extend(n,{width:arguments[0],height:arguments[1],crop:arguments[2],preserveHeaders:arguments[3]}),this.resize(i)},crop:function(e,t,i){this.downsize(e,t,!0,i)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return this.exec("Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsBlob",e||"image/jpeg",t||90)},getAsDataURL:function(e,t){if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsDataURL",e||"image/jpeg",t||90)},getAsBinaryString:function(e,t){var i=this.getAsDataURL(e,t);return m.atob(i.substring(i.indexOf("base64,")+7))},embed:function(n,r){function o(t,r){var o=this;if(u.can("create_canvas")){var l=o.getAsCanvas();if(l)return n.appendChild(l),l=null,o.destroy(),c.trigger("embedded"),void 0}var d=o.getAsDataURL(t,r);if(!d)throw new i.ImageError(i.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",d.length))n.innerHTML='<img src="'+d+'" width="'+o.width+'" height="'+o.height+'" alt="" />',o.destroy(),c.trigger("embedded");else{var h=new s;h.bind("TransportingComplete",function(){a=c.connectRuntime(this.result.ruid),c.bind("Embedded",function(){e.extend(a.getShimContainer().style,{top:"0px",left:"0px",width:o.width+"px",height:o.height+"px"}),a=null},999),a.exec.call(c,"ImageView","display",this.result.uid,width,height),o.destroy()}),h.transport(m.atob(d.substring(d.indexOf("base64,")+7)),t,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:n})}}var a,c=this,l=e.extend({width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,fit:!0,resample:"nearest"},r);try{if(!(n=t.get(n)))throw new i.DOMException(i.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new i.DOMException(i.DOMException.INVALID_STATE_ERR);this.width>h.MAX_RESIZE_WIDTH||this.height>h.MAX_RESIZE_HEIGHT;var d=new h;return d.bind("Resize",function(){o.call(this,l.type,l.quality)}),d.bind("Load",function(){this.downsize(l)}),this.meta.thumb&&this.meta.thumb.width>=l.width&&this.meta.thumb.height>=l.height?d.load(this.meta.thumb.data):d.clone(this,!1),d}catch(f){this.trigger("error",f.code)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.meta&&this.meta.thumb&&this.meta.thumb.data.destroy(),this.unbindAll()}}),this.handleEventProps(f),this.bind("Load Resize",function(){return n.call(this)},999)}var f=["progress","load","error","resize","embedded"];return h.MAX_RESIZE_WIDTH=8192,h.MAX_RESIZE_HEIGHT=8192,h.prototype=c.instance,h}),n("moxie/runtime/html5/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue,l=e.extend({access_binary:u(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return o.can("access_binary")&&!!s.Image},display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:u(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:u(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==n.browser||n.verComp(n.version,9,">"))}()),filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),return_response_headers:c,return_response_type:function(e){return"json"===e&&window.JSON?!0:n.can("return_response_type",e)},return_status_code:c,report_upload_progress:u(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return o.can("access_binary")&&n.can("create_canvas")},select_file:function(){return n.can("use_fileinput")&&window.File},select_folder:function(){return o.can("select_file")&&("Chrome"===n.browser&&n.verComp(n.version,21,">=")||"Firefox"===n.browser&&n.verComp(n.version,42,">="))},select_multiple:function(){return!(!o.can("select_file")||"Safari"===n.browser&&"Windows"===n.os||"iOS"===n.os&&n.verComp(n.osVersion,"7.0.0",">")&&n.verComp(n.osVersion,"8.0.0","<"))},send_binary_string:u(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:u(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||o.can("send_binary_string")},slice_blob:u(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return o.can("slice_blob")&&o.can("send_multipart")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:c},arguments[2]);i.call(this,t,arguments[1]||a,l),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html5",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html5/file/Blob",["moxie/runtime/html5/Runtime","moxie/file/Blob"],function(e,t){function i(){function e(e,t,i){var n;if(!window.File.prototype.slice)return(n=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?n.call(e,t,i):null;try{return e.slice(),e.slice(t,i)}catch(r){return e.slice(t,i-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))},this.destroy=function(){this.getRuntime().getShim().removeInstance(this.uid)}}return e.Blob=i}),n("moxie/core/utils/Events",["moxie/core/utils/Basic"],function(e){function t(){this.returnValue=!1}function i(){this.cancelBubble=!0}var n={},r="moxie_"+e.guid(),o=function(o,a,s,u){var c,l;a=a.toLowerCase(),o.addEventListener?(c=s,o.addEventListener(a,c,!1)):o.attachEvent&&(c=function(){var e=window.event;e.target||(e.target=e.srcElement),e.preventDefault=t,e.stopPropagation=i,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),n.hasOwnProperty(o[r])||(n[o[r]]={}),l=n[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,i,o){var a,s;if(i=i.toLowerCase(),t[r]&&n[t[r]]&&n[t[r]][i]){a=n[t[r]][i];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(i,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+i,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete n[t[r]][i],e.isEmptyObj(n[t[r]])){delete n[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,i){t&&t[r]&&e.each(n[t[r]],function(e,n){a(t,n,i)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),n("moxie/runtime/html5/file/FileInput",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){var e,s;i.extend(this,{init:function(u){var c,l,d,m,h,f,p=this,g=p.getRuntime();e=u,d=o.extList2mimes(e.accept,g.can("filter_by_extension")),l=g.getShimContainer(),l.innerHTML='<input id="'+g.uid+'" type="file" style="font-size:999px;opacity:0;"'+(e.multiple&&g.can("select_multiple")?"multiple":"")+(e.directory&&g.can("select_folder")?"webkitdirectory directory":"")+(d?' accept="'+d.join(",")+'"':"")+" />",c=n.get(g.uid),i.extend(c.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=n.get(e.browse_button),s=n.getStyle(m,"z-index")||"auto",g.can("summon_file_dialog")&&("static"===n.getStyle(m,"position")&&(m.style.position="relative"),r.addEvent(m,"click",function(e){var t=n.get(g.uid);t&&!t.disabled&&t.click(),e.preventDefault()},p.uid),p.bind("Refresh",function(){h=parseInt(s,10)||1,n.get(e.browse_button).style.zIndex=h,this.getRuntime().getShimContainer().style.zIndex=h-1})),f=g.can("summon_file_dialog")?m:l,r.addEvent(f,"mouseover",function(){p.trigger("mouseenter")},p.uid),r.addEvent(f,"mouseout",function(){p.trigger("mouseleave")},p.uid),r.addEvent(f,"mousedown",function(){p.trigger("mousedown")},p.uid),r.addEvent(n.get(e.container),"mouseup",function(){p.trigger("mouseup")},p.uid),(g.can("summon_file_dialog")?c:m).setAttribute("tabindex",-1),c.onchange=function x(){if(p.files=[],i.each(this.files,function(i){var n="";return e.directory&&"."==i.name?!0:(i.webkitRelativePath&&(n="/"+i.webkitRelativePath.replace(/^\//,"")),i=new t(g.uid,i),i.relativePath=n,p.files.push(i),void 0)}),"IE"!==a.browser&&"IEMobile"!==a.browser)this.value="";else{var n=this.cloneNode(!0);this.parentNode.replaceChild(n,this),n.onchange=x}p.files.length&&p.trigger("change")},p.trigger({type:"ready",async:!0}),l=null},setOption:function(e,t){var i=this.getRuntime(),r=n.get(i.uid);switch(e){case"accept":if(t){var a=t.mimes||o.extList2mimes(t,i.can("filter_by_extension"));r.setAttribute("accept",a.join(","))}else r.removeAttribute("accept");break;case"directory":t&&i.can("select_folder")?(r.setAttribute("directory",""),r.setAttribute("webkitdirectory","")):(r.removeAttribute("directory"),r.removeAttribute("webkitdirectory"));break;case"multiple":t&&i.can("select_multiple")?r.setAttribute("multiple",""):r.removeAttribute("multiple")}},disable:function(e){var t,i=this.getRuntime();(t=n.get(i.uid))&&(t.disabled=!!e)},destroy:function(){var t=this.getRuntime(),i=t.getShim(),o=t.getShimContainer(),a=e&&n.get(e.container),u=e&&n.get(e.browse_button);a&&r.removeAllEvents(a,this.uid),u&&(r.removeAllEvents(u,this.uid),u.style.zIndex=s),o&&(r.removeAllEvents(o,this.uid),o.innerHTML=""),i.removeInstance(this.uid),e=o=a=u=i=null}})}return e.FileInput=s}),n("moxie/runtime/html5/file/FileDrop",["moxie/runtime/html5/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime"],function(e,t,i,n,r,o){function a(){function e(e){if(!e.dataTransfer||!e.dataTransfer.types)return!1;var t=i.toArray(e.dataTransfer.types||[]);return-1!==i.inArray("Files",t)||-1!==i.inArray("public.file-url",t)||-1!==i.inArray("application/x-moz-file",t)}function a(e,i){if(u(e)){var n=new t(f,e);n.relativePath=i||"",p.push(n)}}function s(e){for(var t=[],n=0;n<e.length;n++)[].push.apply(t,e[n].extensions.split(/\s*,\s*/));return-1===i.inArray("*",t)?t:[]}function u(e){if(!g.length)return!0;var t=o.getFileExtension(e.name);return!t||-1!==i.inArray(t,g)}function c(e,t){var n=[];i.each(e,function(e){var t=e.webkitGetAsEntry();t&&(t.isFile?a(e.getAsFile(),t.fullPath):n.push(t))}),n.length?l(n,t):t()}function l(e,t){var n=[];i.each(e,function(e){n.push(function(t){d(e,t)})}),i.inSeries(n,function(){t()})}function d(e,t){e.isFile?e.file(function(i){a(i,e.fullPath),t()},function(){t()}):e.isDirectory?m(e,t):t()}function m(e,t){function i(e){r.readEntries(function(t){t.length?([].push.apply(n,t),i(e)):e()},e)}var n=[],r=e.createReader();i(function(){l(n,t)})}var h,f,p=[],g=[];i.extend(this,{init:function(t){var n,o=this;h=t,f=o.ruid,g=s(h.accept),n=h.container,r.addEvent(n,"dragover",function(t){e(t)&&(t.preventDefault(),t.dataTransfer.dropEffect="copy")},o.uid),r.addEvent(n,"drop",function(t){e(t)&&(t.preventDefault(),p=[],t.dataTransfer.items&&t.dataTransfer.items[0].webkitGetAsEntry?c(t.dataTransfer.items,function(){o.files=p,o.trigger("drop")}):(i.each(t.dataTransfer.files,function(e){a(e)}),o.files=p,o.trigger("drop")))},o.uid),r.addEvent(n,"dragenter",function(){o.trigger("dragenter")},o.uid),r.addEvent(n,"dragleave",function(){o.trigger("dragleave")},o.uid)},destroy:function(){r.removeAllEvents(h&&n.get(h.container),this.uid),f=p=g=h=null,this.getRuntime().getShim().removeInstance(this.uid)}})}return e.FileDrop=a}),n("moxie/runtime/html5/file/FileReader",["moxie/runtime/html5/Runtime","moxie/core/utils/Encode","moxie/core/utils/Basic"],function(e,t,i){function n(){function e(e){return t.atob(e.substring(e.indexOf("base64,")+7))}var n,r=!1;i.extend(this,{read:function(t,o){var a=this;a.result="",n=new window.FileReader,n.addEventListener("progress",function(e){a.trigger(e)}),n.addEventListener("load",function(t){a.result=r?e(n.result):n.result,a.trigger(t)}),n.addEventListener("error",function(e){a.trigger(e,n.error)}),n.addEventListener("loadend",function(e){n=null,a.trigger(e)}),"function"===i.typeOf(n[t])?(r=!1,n[t](o.getSource())):"readAsBinaryString"===t&&(r=!0,n.readAsDataURL(o.getSource()))},abort:function(){n&&n.abort()},destroy:function(){n=null,this.getRuntime().getShim().removeInstance(this.uid)}})}return e.FileReader=n}),n("moxie/runtime/html5/xhr/XMLHttpRequest",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/utils/Mime","moxie/core/utils/Url","moxie/file/File","moxie/file/Blob","moxie/xhr/FormData","moxie/core/Exceptions","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u){function c(){function e(e,t){var i,n,r=this;i=t.getBlob().getSource(),n=new window.FileReader,n.onload=function(){t.append(t.getBlobName(),new o(null,{type:i.type,data:n.result})),f.send.call(r,e,t)},n.readAsBinaryString(i)}function c(){return!window.XMLHttpRequest||"IE"===u.browser&&u.verComp(u.version,8,"<")?function(){for(var e=["Msxml2.XMLHTTP.6.0","Microsoft.XMLHTTP"],t=0;t<e.length;t++)try{return new ActiveXObject(e[t])}catch(i){}}():new window.XMLHttpRequest}function l(e){var t=e.responseXML,i=e.responseText;return"IE"===u.browser&&i&&t&&!t.documentElement&&/[^\/]+\/[^\+]+\+xml/.test(e.getResponseHeader("Content-Type"))&&(t=new window.ActiveXObject("Microsoft.XMLDOM"),t.async=!1,t.validateOnParse=!1,t.loadXML(i)),t&&("IE"===u.browser&&0!==t.parseError||!t.documentElement||"parsererror"===t.documentElement.tagName)?null:t
+}function d(e){var t="----moxieboundary"+(new Date).getTime(),i="--",n="\r\n",r="",a=this.getRuntime();if(!a.can("send_binary_string"))throw new s.RuntimeError(s.RuntimeError.NOT_SUPPORTED_ERR);return m.setRequestHeader("Content-Type","multipart/form-data; boundary="+t),e.each(function(e,a){r+=e instanceof o?i+t+n+'Content-Disposition: form-data; name="'+a+'"; filename="'+unescape(encodeURIComponent(e.name||"blob"))+'"'+n+"Content-Type: "+(e.type||"application/octet-stream")+n+n+e.getSource()+n:i+t+n+'Content-Disposition: form-data; name="'+a+'"'+n+n+unescape(encodeURIComponent(e))+n}),r+=i+t+i+n}var m,h,f=this;t.extend(this,{send:function(i,r){var s=this,l="Mozilla"===u.browser&&u.verComp(u.version,4,">=")&&u.verComp(u.version,7,"<"),f="Android Browser"===u.browser,p=!1;if(h=i.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),m=c(),m.open(i.method,i.url,i.async,i.user,i.password),r instanceof o)r.isDetached()&&(p=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),p=!0;else if((l||f)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return e.call(s,i,r),void 0;if(r instanceof a){var g=new window.FormData;r.each(function(e,t){e instanceof o?g.append(t,e.getSource()):g.append(t,e)}),r=g}}m.upload?(i.withCredentials&&(m.withCredentials=!0),m.addEventListener("load",function(e){s.trigger(e)}),m.addEventListener("error",function(e){s.trigger(e)}),m.addEventListener("progress",function(e){s.trigger(e)}),m.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):m.onreadystatechange=function(){switch(m.readyState){case 1:break;case 2:break;case 3:var e,t;try{n.hasSameOrigin(i.url)&&(e=m.getResponseHeader("Content-Length")||0),m.responseText&&(t=m.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:m.onreadystatechange=function(){};try{if(m.status>=200&&m.status<400){s.trigger("load");break}}catch(r){}s.trigger("error")}},t.isEmptyObj(i.headers)||t.each(i.headers,function(e,t){m.setRequestHeader(t,e)}),""!==i.responseType&&"responseType"in m&&(m.responseType="json"!==i.responseType||u.can("return_response_type","json")?i.responseType:"text"),p?m.sendAsBinary?m.sendAsBinary(r):function(){for(var e=new Uint8Array(r.length),t=0;t<r.length;t++)e[t]=255&r.charCodeAt(t);m.send(e.buffer)}():m.send(r),s.trigger("loadstart")},getStatus:function(){try{if(m)return m.status}catch(e){}return 0},getResponse:function(e){var t=this.getRuntime();try{switch(e){case"blob":var n=new r(t.uid,m.response),o=m.getResponseHeader("Content-Disposition");if(o){var a=o.match(/filename=([\'\"'])([^\1]+)\1/);a&&(h=a[2])}return n.name=h,n.type||(n.type=i.getFileMime(h)),n;case"json":return u.can("return_response_type","json")?m.response:200===m.status&&window.JSON?JSON.parse(m.responseText):null;case"document":return l(m);default:return""!==m.responseText?m.responseText:null}}catch(s){return null}},getAllResponseHeaders:function(){try{return m.getAllResponseHeaders()}catch(e){}return""},abort:function(){m&&m.abort()},destroy:function(){f=h=null,this.getRuntime().getShim().removeInstance(this.uid)}})}return e.XMLHttpRequest=c}),n("moxie/runtime/html5/utils/BinaryReader",["moxie/core/utils/Basic"],function(e){function t(e){e instanceof ArrayBuffer?i.apply(this,arguments):n.apply(this,arguments)}function i(t){var i=new DataView(t);e.extend(this,{readByteAt:function(e){return i.getUint8(e)},writeByteAt:function(e,t){i.setUint8(e,t)},SEGMENT:function(e,n,r){switch(arguments.length){case 2:return t.slice(e,e+n);case 1:return t.slice(e);case 3:if(null===r&&(r=new ArrayBuffer),r instanceof ArrayBuffer){var o=new Uint8Array(this.length()-n+r.byteLength);e>0&&o.set(new Uint8Array(t.slice(0,e)),0),o.set(new Uint8Array(r),e),o.set(new Uint8Array(t.slice(e+n)),e+r.byteLength),this.clear(),t=o.buffer,i=new DataView(t);break}default:return t}},length:function(){return t?t.byteLength:0},clear:function(){i=t=null}})}function n(t){function i(e,i,n){n=3===arguments.length?n:t.length-i-1,t=t.substr(0,i)+e+t.substr(n+i)}e.extend(this,{readByteAt:function(e){return t.charCodeAt(e)},writeByteAt:function(e,t){i(String.fromCharCode(t),e,1)},SEGMENT:function(e,n,r){switch(arguments.length){case 1:return t.substr(e);case 2:return t.substr(e,n);case 3:i(null!==r?r:"",e,n);break;default:return t}},length:function(){return t?t.length:0},clear:function(){t=null}})}return e.extend(t.prototype,{littleEndian:!1,read:function(e,t){var i,n,r;if(e+t>this.length())throw new Error("You are trying to read outside the source boundaries.");for(n=this.littleEndian?0:-8*(t-1),r=0,i=0;t>r;r++)i|=this.readByteAt(e+r)<<Math.abs(n+8*r);return i},write:function(e,t,i){var n,r;if(e>this.length())throw new Error("You are trying to write outside the source boundaries.");for(n=this.littleEndian?0:-8*(i-1),r=0;i>r;r++)this.writeByteAt(e+r,255&t>>Math.abs(n+8*r))},BYTE:function(e){return this.read(e,1)},SHORT:function(e){return this.read(e,2)},LONG:function(e){return this.read(e,4)},SLONG:function(e){var t=this.read(e,4);return t>2147483647?t-4294967296:t},CHAR:function(e){return String.fromCharCode(this.read(e,1))},STRING:function(e,t){return this.asArray("CHAR",e,t).join("")},asArray:function(e,t,i){for(var n=[],r=0;i>r;r++)n[r]=this[e](t+r);return n}}),t}),n("moxie/runtime/html5/image/JPEGHeaders",["moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,t){return function i(n){var r,o,a,s=[],u=0;if(r=new e(n),65496!==r.SHORT(0))throw r.clear(),new t.ImageError(t.ImageError.WRONG_FORMAT);for(o=2;o<=r.length();)if(a=r.SHORT(o),a>=65488&&65495>=a)o+=2;else{if(65498===a||65497===a)break;u=r.SHORT(o+2)+2,a>=65505&&65519>=a&&s.push({hex:a,name:"APP"+(15&a),start:o,length:u,segment:r.SEGMENT(o,u)}),o+=u}return r.clear(),{headers:s,restore:function(t){var i,n,r;for(r=new e(t),o=65504==r.SHORT(2)?4+r.SHORT(4):2,n=0,i=s.length;i>n;n++)r.SEGMENT(o,0,s[n].segment),o+=s[n].length;return t=r.SEGMENT(),r.clear(),t},strip:function(t){var n,r,o,a;for(o=new i(t),r=o.headers,o.purge(),n=new e(t),a=r.length;a--;)n.SEGMENT(r[a].start,r[a].length,"");return t=n.SEGMENT(),n.clear(),t},get:function(e){for(var t=[],i=0,n=s.length;n>i;i++)s[i].name===e.toUpperCase()&&t.push(s[i].segment);return t},set:function(e,t){var i,n,r,o=[];for("string"==typeof t?o.push(t):o=t,i=n=0,r=s.length;r>i&&(s[i].name===e.toUpperCase()&&(s[i].segment=o[n],s[i].length=o[n].length,n++),!(n>=o.length));i++);},purge:function(){this.headers=s=[]}}}}),n("moxie/runtime/html5/image/ExifParser",["moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader","moxie/core/Exceptions"],function(e,i,n){function r(o){function a(i,r){var o,a,s,u,c,m,h,f,p=this,g=[],x={},v={1:"BYTE",7:"UNDEFINED",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",9:"SLONG",10:"SRATIONAL"},w={BYTE:1,UNDEFINED:1,ASCII:1,SHORT:2,LONG:4,RATIONAL:8,SLONG:4,SRATIONAL:8};for(o=p.SHORT(i),a=0;o>a;a++)if(g=[],h=i+2+12*a,s=r[p.SHORT(h)],s!==t){if(u=v[p.SHORT(h+=2)],c=p.LONG(h+=2),m=w[u],!m)throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(h+=4,m*c>4&&(h=p.LONG(h)+d.tiffHeader),h+m*c>=this.length())throw new n.ImageError(n.ImageError.INVALID_META_ERR);"ASCII"!==u?(g=p.asArray(u,h,c),f=1==c?g[0]:g,x[s]=l.hasOwnProperty(s)&&"object"!=typeof f?l[s][f]:f):x[s]=e.trim(p.STRING(h,c).replace(/\0$/,""))}return x}function s(e,t,i){var n,r,o,a=0;if("string"==typeof t){var s=c[e.toLowerCase()];for(var u in s)if(s[u]===t){t=u;break}}n=d[e.toLowerCase()+"IFD"],r=this.SHORT(n);for(var l=0;r>l;l++)if(o=n+12*l+2,this.SHORT(o)==t){a=o+8;break}if(!a)return!1;try{this.write(a,i,4)}catch(m){return!1}return!0}var u,c,l,d,m,h;if(i.call(this,o),c={tiff:{274:"Orientation",270:"ImageDescription",271:"Make",272:"Model",305:"Software",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer"},exif:{36864:"ExifVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",36867:"DateTimeOriginal",33434:"ExposureTime",33437:"FNumber",34855:"ISOSpeedRatings",37377:"ShutterSpeedValue",37378:"ApertureValue",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37386:"FocalLength",41986:"ExposureMode",41987:"WhiteBalance",41990:"SceneCaptureType",41988:"DigitalZoomRatio",41992:"Contrast",41993:"Saturation",41994:"Sharpness"},gps:{0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude"},thumb:{513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength"}},l={ColorSpace:{1:"sRGB",0:"Uncalibrated"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{1:"Daylight",2:"Fliorescent",3:"Tungsten",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 -5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},ExposureMode:{0:"Auto exposure",1:"Manual exposure",2:"Auto bracket"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},GPSLatitudeRef:{N:"North latitude",S:"South latitude"},GPSLongitudeRef:{E:"East longitude",W:"West longitude"}},d={tiffHeader:10},m=d.tiffHeader,u={clear:this.clear},e.extend(this,{read:function(){try{return r.prototype.read.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},write:function(){try{return r.prototype.write.apply(this,arguments)}catch(e){throw new n.ImageError(n.ImageError.INVALID_META_ERR)}},UNDEFINED:function(){return this.BYTE.apply(this,arguments)},RATIONAL:function(e){return this.LONG(e)/this.LONG(e+4)},SRATIONAL:function(e){return this.SLONG(e)/this.SLONG(e+4)},ASCII:function(e){return this.CHAR(e)},TIFF:function(){return h||null},EXIF:function(){var t=null;if(d.exifIFD){try{t=a.call(this,d.exifIFD,c.exif)}catch(i){return null}if(t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var n=0,r="";n<t.ExifVersion.length;n++)r+=String.fromCharCode(t.ExifVersion[n]);t.ExifVersion=r}}return t},GPS:function(){var t=null;if(d.gpsIFD){try{t=a.call(this,d.gpsIFD,c.gps)}catch(i){return null}t.GPSVersionID&&"array"===e.typeOf(t.GPSVersionID)&&(t.GPSVersionID=t.GPSVersionID.join("."))}return t},thumb:function(){if(d.IFD1)try{var e=a.call(this,d.IFD1,c.thumb);if("JPEGInterchangeFormat"in e)return this.SEGMENT(d.tiffHeader+e.JPEGInterchangeFormat,e.JPEGInterchangeFormatLength)}catch(t){}return null},setExif:function(e,t){return"PixelXDimension"!==e&&"PixelYDimension"!==e?!1:s.call(this,"exif",e,t)},clear:function(){u.clear(),o=c=l=h=d=u=null}}),65505!==this.SHORT(0)||"EXIF\0"!==this.STRING(4,5).toUpperCase())throw new n.ImageError(n.ImageError.INVALID_META_ERR);if(this.littleEndian=18761==this.SHORT(m),42!==this.SHORT(m+=2))throw new n.ImageError(n.ImageError.INVALID_META_ERR);d.IFD0=d.tiffHeader+this.LONG(m+=2),h=a.call(this,d.IFD0,c.tiff),"ExifIFDPointer"in h&&(d.exifIFD=d.tiffHeader+h.ExifIFDPointer,delete h.ExifIFDPointer),"GPSInfoIFDPointer"in h&&(d.gpsIFD=d.tiffHeader+h.GPSInfoIFDPointer,delete h.GPSInfoIFDPointer),e.isEmptyObj(h)&&(h=null);var f=this.LONG(d.IFD0+12*this.SHORT(d.IFD0)+2);f&&(d.IFD1=d.tiffHeader+f)}return r.prototype=i.prototype,r}),n("moxie/runtime/html5/image/JPEG",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEGHeaders","moxie/runtime/html5/utils/BinaryReader","moxie/runtime/html5/image/ExifParser"],function(e,t,i,n,r){function o(o){function a(e){var t,i,n=0;for(e||(e=c);n<=e.length();){if(t=e.SHORT(n+=2),t>=65472&&65475>=t)return n+=5,{height:e.SHORT(n),width:e.SHORT(n+=2)};i=e.SHORT(n+=2),n+=i-2}return null}function s(){var e,t,i=d.thumb();return i&&(e=new n(i),t=a(e),e.clear(),t)?(t.data=i,t):null}function u(){d&&l&&c&&(d.clear(),l.purge(),c.clear(),m=l=d=c=null)}var c,l,d,m;if(c=new n(o),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new i(o);try{d=new r(l.get("app1")[0])}catch(h){}m=a.call(this),e.extend(this,{type:"image/jpeg",size:c.length(),width:m&&m.width||0,height:m&&m.height||0,setExif:function(t,i){return d?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,i),l.set("app1",d.SEGMENT()),void 0):!1},writeHeaders:function(){return arguments.length?l.restore(arguments[0]):l.restore(o)},stripHeaders:function(e){return l.strip(e)},purge:function(){u.call(this)}}),d&&(this.meta={tiff:d.TIFF(),exif:d.EXIF(),gps:d.GPS(),thumb:s()})}return o}),n("moxie/runtime/html5/image/PNG",["moxie/core/Exceptions","moxie/core/utils/Basic","moxie/runtime/html5/utils/BinaryReader"],function(e,t,i){function n(n){function r(){var e,t;return e=a.call(this,8),"IHDR"==e.type?(t=e.start,{width:s.LONG(t),height:s.LONG(t+=4)}):null}function o(){s&&(s.clear(),n=l=u=c=s=null)}function a(e){var t,i,n,r;return t=s.LONG(e),i=s.STRING(e+=4,4),n=e+=4,r=s.LONG(e+t),{length:t,type:i,start:n,CRC:r}}var s,u,c,l;s=new i(n),function(){var t=0,i=0,n=[35152,20039,3338,6666];for(i=0;i<n.length;i++,t+=2)if(n[i]!=s.SHORT(t))throw new e.ImageError(e.ImageError.WRONG_FORMAT)}(),l=r.call(this),t.extend(this,{type:"image/png",size:s.length(),width:l.width,height:l.height,purge:function(){o.call(this)}}),o.call(this)}return n}),n("moxie/runtime/html5/image/ImageInfo",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/html5/image/JPEG","moxie/runtime/html5/image/PNG"],function(e,t,i,n){return function(r){var o,a=[i,n];o=function(){for(var e=0;e<a.length;e++)try{return new a[e](r)}catch(i){}throw new t.ImageError(t.ImageError.WRONG_FORMAT)}(),e.extend(this,{type:"",size:0,width:0,height:0,setExif:function(){},writeHeaders:function(e){return e},stripHeaders:function(e){return e},purge:function(){r=null}}),e.extend(this,o),this.purge=function(){o.purge(),o=null}}}),n("moxie/runtime/html5/image/ResizerCanvas",[],function(){function e(i,n,r){var o=i.width>i.height?"width":"height",a=Math.round(i[o]*n),s=!1;"nearest"!==r&&(.5>n||n>2)&&(n=.5>n?.5:2,s=!0);var u=t(i,n);return s?e(u,a/u[o],r):u}function t(e,t){var i=e.width,n=e.height,r=Math.round(i*t),o=Math.round(n*t),a=document.createElement("canvas");return a.width=r,a.height=o,a.getContext("2d").drawImage(e,0,0,i,n,0,0,r,o),e=null,a}return{scale:e}}),n("moxie/runtime/html5/image/Image",["moxie/runtime/html5/Runtime","moxie/core/utils/Basic","moxie/core/Exceptions","moxie/core/utils/Encode","moxie/file/Blob","moxie/file/File","moxie/runtime/html5/image/ImageInfo","moxie/runtime/html5/image/ResizerCanvas","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a,s,u){function c(){function e(){if(!v&&!g)throw new i.ImageError(i.DOMException.INVALID_STATE_ERR);return v||g}function c(){var t=e();return"canvas"==t.nodeName.toLowerCase()?t:(v=document.createElement("canvas"),v.width=t.width,v.height=t.height,v.getContext("2d").drawImage(t,0,0),v)}function l(e){return n.atob(e.substring(e.indexOf("base64,")+7))}function d(e,t){return"data:"+(t||"")+";base64,"+n.btoa(e)}function m(e){var t=this;g=new Image,g.onerror=function(){p.call(this),t.trigger("error",i.ImageError.WRONG_FORMAT)},g.onload=function(){t.trigger("load")},g.src="data:"==e.substr(0,5)?e:d(e,y.type)}function h(e,t){var n,r=this;return window.FileReader?(n=new FileReader,n.onload=function(){t.call(r,this.result)},n.onerror=function(){r.trigger("error",i.ImageError.WRONG_FORMAT)},n.readAsDataURL(e),void 0):t.call(this,e.getAsDataURL())}function f(e,i){var n=Math.PI/180,r=document.createElement("canvas"),o=r.getContext("2d"),a=e.width,s=e.height;switch(t.inArray(i,[5,6,7,8])>-1?(r.width=s,r.height=a):(r.width=a,r.height=s),i){case 2:o.translate(a,0),o.scale(-1,1);break;case 3:o.translate(a,s),o.rotate(180*n);break;case 4:o.translate(0,s),o.scale(1,-1);break;case 5:o.rotate(90*n),o.scale(1,-1);break;case 6:o.rotate(90*n),o.translate(0,-s);break;case 7:o.rotate(90*n),o.translate(a,-s),o.scale(-1,1);break;case 8:o.rotate(-90*n),o.translate(-a,0)}return o.drawImage(e,0,0,a,s),r}function p(){x&&(x.purge(),x=null),w=g=v=y=null,b=!1}var g,x,v,w,y,E=this,b=!1,_=!0;t.extend(this,{loadFromBlob:function(e){var t=this.getRuntime(),n=arguments.length>1?arguments[1]:!0;if(!t.can("access_binary"))throw new i.RuntimeError(i.RuntimeError.NOT_SUPPORTED_ERR);return y=e,e.isDetached()?(w=e.getSource(),m.call(this,w),void 0):(h.call(this,e.getSource(),function(e){n&&(w=l(e)),m.call(this,e)}),void 0)},loadFromImage:function(e,t){this.meta=e.meta,y=new o(null,{name:e.name,size:e.size,type:e.type}),m.call(this,t?w=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t,i=this.getRuntime();return!x&&w&&i.can("access_image_binary")&&(x=new a(w)),t={width:e().width||0,height:e().height||0,type:y.type||u.getFileMime(y.name),size:w&&w.length||y.size||0,name:y.name||"",meta:null},_&&(t.meta=x&&x.meta||this.meta||{},!t.meta||!t.meta.thumb||t.meta.thumb.data instanceof r||(t.meta.thumb.data=new r(null,{type:"image/jpeg",data:t.meta.thumb.data}))),t},resize:function(t,i,n){var r=document.createElement("canvas");if(r.width=t.width,r.height=t.height,r.getContext("2d").drawImage(e(),t.x,t.y,t.width,t.height,0,0,r.width,r.height),v=s.scale(r,i),_=n.preserveHeaders,!_){var o=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1;v=f(v,o)}this.width=v.width,this.height=v.height,b=!0,this.trigger("Resize")},getAsCanvas:function(){return v||(v=c()),v.id=this.uid+"_canvas",v},getAsBlob:function(e,t){return e!==this.type?(b=!0,new o(null,{name:y.name||"",type:e,data:E.getAsDataURL(e,t)})):new o(null,{name:y.name||"",type:e,data:E.getAsBinaryString(e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!b)return g.src;if(c(),"image/jpeg"!==e)return v.toDataURL("image/png");try{return v.toDataURL("image/jpeg",t/100)}catch(i){return v.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!b)return w||(w=l(E.getAsDataURL(e,t))),w;if("image/jpeg"!==e)w=l(E.getAsDataURL(e,t));else{var i;t||(t=90),c();try{i=v.toDataURL("image/jpeg",t/100)}catch(n){i=v.toDataURL("image/jpeg")}w=l(i),x&&(w=x.stripHeaders(w),_&&(x.meta&&x.meta.exif&&x.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),w=x.writeHeaders(w)),x.purge(),x=null)}return b=!1,w},destroy:function(){E=null,p.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=c}),n("moxie/runtime/flash/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(i){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function s(e){var n=i.get(e);n&&"OBJECT"==n.nodeName&&("IE"===t.browser?(n.style.display="none",function r(){4==n.readyState?u(e):setTimeout(r,10)}()):n.parentNode.removeChild(n))}function u(e){var t=i.get(e);if(t){for(var n in t)"function"==typeof t[n]&&(t[n]=null);t.parentNode.removeChild(t)}}function c(u){var c,m=this;u=e.extend({swf_url:t.swf_url},u),o.call(this,u,l,{access_binary:function(e){return e&&"browser"===m.mode},access_image_binary:function(e){return e&&"browser"===m.mode},display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===m.mode},resize_image:o.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===m.mode},return_status_code:function(t){return"browser"===m.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:function(e){return e&&"browser"===m.mode},send_browser_cookies:function(e){return e&&"browser"===m.mode},send_custom_headers:function(e){return e&&"browser"===m.mode},send_multipart:o.capTrue,slice_blob:function(e){return e&&"browser"===m.mode},stream_upload:function(e){return e&&"browser"===m.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===m.mode},use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}},{access_binary:function(e){return e?"browser":"client"},access_image_binary:function(e){return e?"browser":"client"},report_upload_progress:function(e){return e?"browser":"client"},return_response_type:function(t){return e.arrayDiff(t,["","text","json","document"])?"browser":["client","browser"]},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"browser":["client","browser"]},send_binary_string:function(e){return e?"browser":"client"},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"browser":"client"},slice_blob:function(e){return e?"browser":"client"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),a()<11.3&&(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid)},shimExec:function(e,t){var i=[].slice.call(arguments,2);return m.getShim().exec(this.uid,e,t,i)},init:function(){var i,r,a;a=this.getShimContainer(),e.extend(a.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),i='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+u.swf_url+'" ',"IE"===t.browser&&(i+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),i+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+u.swf_url+'" />'+'<param name="flashvars" value="uid='+escape(this.uid)+"&target="+o.getGlobalEventTarget()+'" />'+'<param name="wmode" value="transparent" />'+'<param name="allowscriptaccess" value="always" />'+"</object>","IE"===t.browser?(r=document.createElement("div"),a.appendChild(r),r.outerHTML=i,r=a=null):a.innerHTML=i,c=setTimeout(function(){m&&!m.initialized&&m.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){s(m.uid),e.call(m),clearTimeout(c),u=c=e=m=null}}(this.destroy)},d)}var l="flash",d={};return o.addConstructor(l,c),d}),n("moxie/runtime/flash/file/Blob",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={slice:function(e,i,n,r){var o=this.getRuntime();return 0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),e=o.shimExec.call(this,"Blob","slice",i,n,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=i}),n("moxie/runtime/flash/file/FileInput",["moxie/runtime/flash/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){var r={init:function(e){var r=this,o=this.getRuntime(),a=i.get(e.browse_button);a&&(a.setAttribute("tabindex",-1),a=null),this.bind("Change",function(){var e=o.shimExec.call(r,"FileInput","getFiles");r.files=[],n.each(e,function(e){r.files.push(new t(o.uid,e))})},999),this.getRuntime().shimExec.call(this,"FileInput","init",{accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=r}),n("moxie/runtime/flash/file/FileReader",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n=this;return n.result="","readAsDataURL"===e&&(n.result="data:"+(t.type||"")+";base64,"),n.bind("Progress",function(t,r){r&&(n.result+=i(r,e))},999),n.getRuntime().shimExec.call(this,"FileReader","readAsBase64",t.uid)}};return e.FileReader=n}),n("moxie/runtime/flash/file/FileReaderSync",["moxie/runtime/flash/Runtime","moxie/core/utils/Encode"],function(e,t){function i(e,i){switch(i){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var n={read:function(e,t){var n,r=this.getRuntime();return(n=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(n="data:"+(t.type||"")+";base64,"+n),i(n,e,t.type)):null}};return e.FileReaderSync=n}),n("moxie/runtime/flash/runtime/Transporter",["moxie/runtime/flash/Runtime","moxie/file/Blob"],function(e,t){var i={getAsBlob:function(e){var i=this.getRuntime(),n=i.shimExec.call(this,"Transporter","getAsBlob",e);return n?new t(i.uid,n):null}};return e.Transporter=i}),n("moxie/runtime/flash/xhr/XMLHttpRequest",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/file/File","moxie/file/FileReaderSync","moxie/runtime/flash/file/FileReaderSync","moxie/xhr/FormData","moxie/runtime/Transporter","moxie/runtime/flash/runtime/Transporter"],function(e,t,i,n,r,o,a,s){var u={send:function(e,n){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,n)}function o(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),n=null,r()}function u(e,t){var i=new s;i.bind("TransportingComplete",function(){t(this.result)}),i.transport(e.getSource(),e.type,{ruid:l.uid})}var c=this,l=c.getRuntime();if(t.isEmptyObj(e.headers)||t.each(e.headers,function(e,t){l.shimExec.call(c,"XMLHttpRequest","setRequestHeader",t,e.toString())}),n instanceof a){var d;if(n.each(function(e,t){e instanceof i?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),n.hasBlob()){var m=n.getBlob();m.isDetached()?u(m,function(e){m.destroy(),o(d,e)}):o(d,m)}else n=null,r()}else n instanceof i?n.isDetached()?u(n,function(e){n.destroy(),n=e.uid,r()}):(n=n.uid,r()):r()},getResponse:function(e){var i,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new n(a.uid,o),"blob"===e)return o;try{if(i=new r,~t.inArray(e,["","text"]))return i.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(i.readAsText(o))}finally{o.destroy()}}return null},abort:function(){var e=this.getRuntime();e.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=u}),n("moxie/runtime/flash/image/Image",["moxie/runtime/flash/Runtime","moxie/core/utils/Basic","moxie/runtime/Transporter","moxie/file/Blob","moxie/file/FileReaderSync"],function(e,t,i,n,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(n,"Image","loadFromBlob",e.uid),n=r=null}var n=this,r=n.getRuntime();if(e.isDetached()){var o=new i;o.bind("TransportingComplete",function(){t(o.result.getSource())}),o.transport(e.getSource(),e.type,{ruid:r.uid})}else t(e.getSource())},loadFromImage:function(e){var t=this.getRuntime();return t.shimExec.call(this,"Image","loadFromImage",e.uid)},getInfo:function(){var e=this.getRuntime(),t=e.shimExec.call(this,"Image","getInfo");return t.meta&&t.meta.thumb&&t.meta.thumb.data&&!(e.meta.thumb.data instanceof n)&&(t.meta.thumb.data=new n(e.uid,t.meta.thumb.data)),t},getAsBlob:function(e,t){var i=this.getRuntime(),r=i.shimExec.call(this,"Image","getAsBlob",e,t);return r?new n(i.uid,r):null},getAsDataURL:function(){var e,t=this.getRuntime(),i=t.Image.getAsBlob.apply(this,arguments);return i?(e=new r,e.readAsDataURL(i)):null}};return e.Image=o}),n("moxie/runtime/silverlight/Runtime",["moxie/core/utils/Basic","moxie/core/utils/Env","moxie/core/utils/Dom","moxie/core/Exceptions","moxie/runtime/Runtime"],function(e,t,i,n,o){function a(e){var t,i,n,r,o,a=!1,s=null,u=0;try{try{s=new ActiveXObject("AgControl.AgControl"),s.IsVersionSupported(e)&&(a=!0),s=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(t=l.description,"1.0.30226.2"===t&&(t="2.0.30226.2"),i=t.split(".");i.length>3;)i.pop();for(;i.length<4;)i.push(0);for(n=e.split(".");n.length>4;)n.pop();do r=parseInt(n[u],10),o=parseInt(i[u],10),u++;while(u<n.length&&r===o);o>=r&&!isNaN(r)&&(a=!0)}}}catch(d){a=!1}return a}function s(s){var l,d=this;s=e.extend({xap_url:t.xap_url},s),o.call(this,s,u,{access_binary:o.capTrue,access_image_binary:o.capTrue,display_media:o.capTest(r("moxie/image/Image")),do_cors:o.capTrue,drag_and_drop:!1,report_upload_progress:o.capTrue,resize_image:o.capTrue,return_response_headers:function(e){return e&&"client"===d.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===d.mode||!e.arrayDiff(t,[200,404])},select_file:o.capTrue,select_multiple:o.capTrue,send_binary_string:o.capTrue,send_browser_cookies:function(e){return e&&"browser"===d.mode},send_custom_headers:function(e){return e&&"client"===d.mode},send_multipart:o.capTrue,slice_blob:o.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:o.capTrue,use_http_method:function(t){return"client"===d.mode||!e.arrayDiff(t,["GET","POST"])}},{return_response_headers:function(e){return e?"client":"browser"},return_status_code:function(t){return e.arrayDiff(t,[200,404])?"client":["client","browser"]},send_browser_cookies:function(e){return e?"browser":"client"},send_custom_headers:function(e){return e?"client":"browser"},use_http_method:function(t){return e.arrayDiff(t,["GET","POST"])?"client":["client","browser"]}}),a("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return i.get(this.uid).content.Moxie},shimExec:function(e,t){var i=[].slice.call(arguments,2);return d.getShim().exec(this.uid,e,t,i)},init:function(){var e;e=this.getShimContainer(),e.innerHTML='<object id="'+this.uid+'" data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%" style="outline:none;">'+'<param name="source" value="'+s.xap_url+'"/>'+'<param name="background" value="Transparent"/>'+'<param name="windowless" value="true"/>'+'<param name="enablehtmlaccess" value="true"/>'+'<param name="initParams" value="uid='+this.uid+",target="+o.getGlobalEventTarget()+'"/>'+"</object>",l=setTimeout(function(){d&&!d.initialized&&d.trigger("Error",new n.RuntimeError(n.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(d),clearTimeout(l),s=l=e=d=null}}(this.destroy)},c)}var u="silverlight",c={};return o.addConstructor(u,s),c}),n("moxie/runtime/silverlight/file/Blob",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/Blob"],function(e,t,i){return e.Blob=t.extend({},i)}),n("moxie/runtime/silverlight/file/FileInput",["moxie/runtime/silverlight/Runtime","moxie/file/File","moxie/core/utils/Dom","moxie/core/utils/Basic"],function(e,t,i,n){function r(e){for(var t="",i=0;i<e.length;i++)t+=(""!==t?"|":"")+e[i].title+" | *."+e[i].extensions.replace(/,/g,";*.");return t}var o={init:function(e){var o=this,a=this.getRuntime(),s=i.get(e.browse_button);s&&(s.setAttribute("tabindex",-1),s=null),this.bind("Change",function(){var e=a.shimExec.call(o,"FileInput","getFiles");
+o.files=[],n.each(e,function(e){o.files.push(new t(a.uid,e))})},999),a.shimExec.call(this,"FileInput","init",r(e.accept),e.multiple),this.trigger("ready")},setOption:function(e,t){"accept"==e&&(t=r(t)),this.getRuntime().shimExec.call(this,"FileInput","setOption",e,t)}};return e.FileInput=o}),n("moxie/runtime/silverlight/file/FileDrop",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Dom","moxie/core/utils/Events"],function(e,t,i){var n={init:function(){var e,n=this,r=n.getRuntime();return e=r.getShimContainer(),i.addEvent(e,"dragover",function(e){e.preventDefault(),e.stopPropagation(),e.dataTransfer.dropEffect="copy"},n.uid),i.addEvent(e,"dragenter",function(e){e.preventDefault();var i=t.get(r.uid).dragEnter(e);i&&e.stopPropagation()},n.uid),i.addEvent(e,"drop",function(e){e.preventDefault();var i=t.get(r.uid).dragDrop(e);i&&e.stopPropagation()},n.uid),r.shimExec.call(this,"FileDrop","init")}};return e.FileDrop=n}),n("moxie/runtime/silverlight/file/FileReader",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReader"],function(e,t,i){return e.FileReader=t.extend({},i)}),n("moxie/runtime/silverlight/file/FileReaderSync",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/file/FileReaderSync"],function(e,t,i){return e.FileReaderSync=t.extend({},i)}),n("moxie/runtime/silverlight/runtime/Transporter",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/runtime/Transporter"],function(e,t,i){return e.Transporter=t.extend({},i)}),n("moxie/runtime/silverlight/xhr/XMLHttpRequest",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/runtime/flash/xhr/XMLHttpRequest","moxie/runtime/silverlight/file/FileReaderSync","moxie/runtime/silverlight/runtime/Transporter"],function(e,t,i){return e.XMLHttpRequest=t.extend({},i)}),n("moxie/runtime/silverlight/image/Image",["moxie/runtime/silverlight/Runtime","moxie/core/utils/Basic","moxie/file/Blob","moxie/runtime/flash/image/Image"],function(e,t,i,n){return e.Image=t.extend({},n,{getInfo:function(){var e=this.getRuntime(),n=["tiff","exif","gps","thumb"],r={meta:{}},o=e.shimExec.call(this,"Image","getInfo");return o.meta&&(t.each(n,function(e){var t,i,n,a,s=o.meta[e];if(s&&s.keys)for(r.meta[e]={},i=0,n=s.keys.length;n>i;i++)t=s.keys[i],a=s[t],a&&(/^(\d|[1-9]\d+)$/.test(a)?a=parseInt(a,10):/^\d*\.\d+$/.test(a)&&(a=parseFloat(a)),r.meta[e][t]=a)}),r.meta&&r.meta.thumb&&r.meta.thumb.data&&!(e.meta.thumb.data instanceof i)&&(r.meta.thumb.data=new i(e.uid,r.meta.thumb.data))),r.width=parseInt(o.width,10),r.height=parseInt(o.height,10),r.size=parseInt(o.size,10),r.type=o.type,r.name=o.name,r},resize:function(e,t,i){this.getRuntime().shimExec.call(this,"Image","resize",e.x,e.y,e.width,e.height,t,i.preserveHeaders,i.resample)}})}),n("moxie/runtime/html4/Runtime",["moxie/core/utils/Basic","moxie/core/Exceptions","moxie/runtime/Runtime","moxie/core/utils/Env"],function(e,t,i,n){function o(t){var o=this,u=i.capTest,c=i.capTrue;i.call(this,t,a,{access_binary:u(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:u((n.can("create_canvas")||n.can("use_data_uri_over32kb"))&&r("moxie/image/Image")),do_cors:!1,drag_and_drop:!1,filter_by_extension:u(function(){return!("Chrome"===n.browser&&n.verComp(n.version,28,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<")||"Safari"===n.browser&&n.verComp(n.version,7,"<")||"Firefox"===n.browser&&n.verComp(n.version,37,"<"))}()),resize_image:function(){return s.Image&&o.can("access_binary")&&n.can("create_canvas")},report_upload_progress:!1,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!!~e.inArray(t,["text","document",""])},return_status_code:function(t){return!e.arrayDiff(t,[200,404])},select_file:function(){return n.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return o.can("select_file")},summon_file_dialog:function(){return o.can("select_file")&&!("Firefox"===n.browser&&n.verComp(n.version,4,"<")||"Opera"===n.browser&&n.verComp(n.version,12,"<")||"IE"===n.browser&&n.verComp(n.version,10,"<"))},upload_filesize:c,use_http_method:function(t){return!e.arrayDiff(t,["GET","POST"])}}),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(o),e=o=null}}(this.destroy)}),e.extend(this.getShim(),s)}var a="html4",s={};return i.addConstructor(a,o),s}),n("moxie/runtime/html4/file/FileInput",["moxie/runtime/html4/Runtime","moxie/file/File","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Events","moxie/core/utils/Mime","moxie/core/utils/Env"],function(e,t,i,n,r,o,a){function s(){function e(){var o,c,d,m,h,f,p=this,g=p.getRuntime();f=i.guid("uid_"),o=g.getShimContainer(),s&&(d=n.get(s+"_form"),d&&(i.extend(d.style,{top:"100%"}),d.firstChild.setAttribute("tabindex",-1))),m=document.createElement("form"),m.setAttribute("id",f+"_form"),m.setAttribute("method","post"),m.setAttribute("enctype","multipart/form-data"),m.setAttribute("encoding","multipart/form-data"),i.extend(m.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),h=document.createElement("input"),h.setAttribute("id",f),h.setAttribute("type","file"),h.setAttribute("accept",l.join(",")),g.can("summon_file_dialog")&&h.setAttribute("tabindex",-1),i.extend(h.style,{fontSize:"999px",opacity:0}),m.appendChild(h),o.appendChild(m),i.extend(h.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===a.browser&&a.verComp(a.version,10,"<")&&i.extend(h.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),h.onchange=function(){var i;this.value&&(i=this.files?this.files[0]:{name:this.value},i=new t(g.uid,i),this.onchange=function(){},e.call(p),p.files=[i],h.setAttribute("id",i.uid),m.setAttribute("id",i.uid+"_form"),p.trigger("change"),h=m=null)},g.can("summon_file_dialog")&&(c=n.get(u.browse_button),r.removeEvent(c,"click",p.uid),r.addEvent(c,"click",function(e){h&&!h.disabled&&h.click(),e.preventDefault()},p.uid)),s=f,o=d=c=null}var s,u,c,l=[];i.extend(this,{init:function(t){var i,a=this,s=a.getRuntime();u=t,l=o.extList2mimes(t.accept,s.can("filter_by_extension")),i=s.getShimContainer(),function(){var e,o,l;e=n.get(t.browse_button),c=n.getStyle(e,"z-index")||"auto",s.can("summon_file_dialog")?("static"===n.getStyle(e,"position")&&(e.style.position="relative"),a.bind("Refresh",function(){o=parseInt(c,10)||1,n.get(u.browse_button).style.zIndex=o,this.getRuntime().getShimContainer().style.zIndex=o-1})):e.setAttribute("tabindex",-1),l=s.can("summon_file_dialog")?e:i,r.addEvent(l,"mouseover",function(){a.trigger("mouseenter")},a.uid),r.addEvent(l,"mouseout",function(){a.trigger("mouseleave")},a.uid),r.addEvent(l,"mousedown",function(){a.trigger("mousedown")},a.uid),r.addEvent(n.get(t.container),"mouseup",function(){a.trigger("mouseup")},a.uid),e=null}(),e.call(this),i=null,a.trigger({type:"ready",async:!0})},setOption:function(e,t){var i,r=this.getRuntime();"accept"==e&&(l=t.mimes||o.extList2mimes(t,r.can("filter_by_extension"))),i=n.get(s),i&&i.setAttribute("accept",l.join(","))},disable:function(e){var t;(t=n.get(s))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),i=e.getShimContainer(),o=u&&n.get(u.container),a=u&&n.get(u.browse_button);o&&r.removeAllEvents(o,this.uid),a&&(r.removeAllEvents(a,this.uid),a.style.zIndex=c),i&&(r.removeAllEvents(i,this.uid),i.innerHTML=""),t.removeInstance(this.uid),s=l=u=i=o=a=t=null}})}return e.FileInput=s}),n("moxie/runtime/html4/file/FileReader",["moxie/runtime/html4/Runtime","moxie/runtime/html5/file/FileReader"],function(e,t){return e.FileReader=t}),n("moxie/runtime/html4/xhr/XMLHttpRequest",["moxie/runtime/html4/Runtime","moxie/core/utils/Basic","moxie/core/utils/Dom","moxie/core/utils/Url","moxie/core/Exceptions","moxie/core/utils/Events","moxie/file/Blob","moxie/xhr/FormData"],function(e,t,i,n,r,o,a,s){function u(){function e(e){var t,n,r,a,s=this,u=!1;if(l){if(t=l.id.replace(/_iframe$/,""),n=i.get(t+"_form")){for(r=n.getElementsByTagName("input"),a=r.length;a--;)switch(r[a].getAttribute("type")){case"hidden":r[a].parentNode.removeChild(r[a]);break;case"file":u=!0}r=[],u||n.parentNode.removeChild(n),n=null}setTimeout(function(){o.removeEvent(l,"load",s.uid),l.parentNode&&l.parentNode.removeChild(l);var t=s.getRuntime().getShimContainer();t.children.length||t.parentNode.removeChild(t),t=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,m){function h(){var i=w.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='<iframe id="'+f+'_iframe" name="'+f+'_iframe" src="javascript:&quot;&quot;" style="display:none"></iframe>',l=r.firstChild,i.appendChild(l),o.addEvent(l,"load",function(){var i;try{i=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(i.title)?u=i.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(i.body.innerHTML),v.trigger({type:"progress",loaded:c.length,total:c.length}),x&&v.trigger({type:"uploadprogress",loaded:x.size||1025,total:x.size||1025}))}catch(r){if(!n.hasSameOrigin(d.url))return e.call(v,function(){v.trigger("error")}),void 0;u=404}e.call(v,function(){v.trigger("load")})},v.uid)}var f,p,g,x,v=this,w=v.getRuntime();if(u=c=null,m instanceof s&&m.hasBlob()){if(x=m.getBlob(),f=x.uid,g=i.get(f),p=i.get(f+"_form"),!p)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else f=t.guid("uid_"),p=document.createElement("form"),p.setAttribute("id",f+"_form"),p.setAttribute("method",d.method),p.setAttribute("enctype","multipart/form-data"),p.setAttribute("encoding","multipart/form-data"),w.getShimContainer().appendChild(p);p.setAttribute("target",f+"_iframe"),m instanceof s&&m.each(function(e,i){if(e instanceof a)g&&g.setAttribute("name",i);else{var n=document.createElement("input");t.extend(n,{type:"hidden",name:i,value:e}),g?p.insertBefore(n,g):p.appendChild(n)}}),p.setAttribute("action",d.url),h(),p.submit(),v.trigger("loadstart")},getStatus:function(){return u},getResponse:function(e){if("json"===e&&"string"===t.typeOf(c)&&window.JSON)try{return JSON.parse(c.replace(/^\s*<pre[^>]*>/,"").replace(/<\/pre>\s*$/,""))}catch(i){return null}return c},abort:function(){var t=this;l&&l.contentWindow&&(l.contentWindow.stop?l.contentWindow.stop():l.contentWindow.document.execCommand?l.contentWindow.document.execCommand("Stop"):l.src="about:blank"),e.call(this,function(){t.dispatchEvent("abort")})},destroy:function(){this.getRuntime().getShim().removeInstance(this.uid)}})}return e.XMLHttpRequest=u}),n("moxie/runtime/html4/image/Image",["moxie/runtime/html4/Runtime","moxie/runtime/html5/image/Image"],function(e,t){return e.Image=t}),a(["moxie/core/utils/Basic","moxie/core/utils/Encode","moxie/core/utils/Env","moxie/core/Exceptions","moxie/core/utils/Dom","moxie/core/EventTarget","moxie/runtime/Runtime","moxie/runtime/RuntimeClient","moxie/file/Blob","moxie/core/I18n","moxie/core/utils/Mime","moxie/file/FileInput","moxie/file/File","moxie/file/FileDrop","moxie/file/FileReader","moxie/core/utils/Url","moxie/runtime/RuntimeTarget","moxie/xhr/FormData","moxie/xhr/XMLHttpRequest","moxie/image/Image","moxie/core/utils/Events","moxie/runtime/html5/image/ResizerCanvas"])}(this)});
/**
* Plupload - multi-runtime File Uploader
- * v2.3.3
+ * v2.3.6
*
* Copyright 2013, Moxiecode Systems AB
* Released under GPL License.
@@ -24,6 +24,6 @@ return t}var o={init:function(e){var o=this,a=this.getRuntime(),s=i.get(e.browse
* License: http://www.plupload.com/license
* Contributing: http://www.plupload.com/contributing
*
- * Date: 2017-08-28
+ * Date: 2017-11-03
*/
-!function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.plupload};"function"==typeof define&&define.amd?define("plupload",["./moxie"],i):"object"==typeof module&&module.exports?module.exports=i(require("./moxie")):e.plupload=i(e.moxie)}(this||window,function(e){!function(e,t,i){function n(e){function t(e,t,i){var r={chunks:"slice_blob",jpgresize:"send_binary_string",pngresize:"send_binary_string",progress:"report_upload_progress",multi_selection:"select_multiple",dragdrop:"drag_and_drop",drop_element:"drag_and_drop",headers:"send_custom_headers",urlstream_upload:"send_binary_string",canSendBinary:"send_binary",triggerDialog:"summon_file_dialog"};r[e]?n[r[e]]=t:i||(n[e]=t)}var i=e.required_features,n={};return"string"==typeof i?l.each(i.split(/\s*,\s*/),function(e){t(e,!0)}):"object"==typeof i?l.each(i,function(e,i){t(i,e)}):i===!0&&(e.chunk_size&&e.chunk_size>0&&(n.slice_blob=!0),l.isEmptyObj(e.resize)&&e.multipart!==!1||(n.send_binary_string=!0),e.http_method&&(n.use_http_method=e.http_method),l.each(e,function(e,i){t(i,!!e,!0)})),n}var r=window.setTimeout,s={},a=t.core.utils,o=t.runtime.Runtime,l={VERSION:"2.3.3",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,moxie:t,mimeTypes:a.Mime.mimes,ua:a.Env,typeOf:a.Basic.typeOf,extend:a.Basic.extend,guid:a.Basic.guid,getAll:function(e){var t,i=[];"array"!==l.typeOf(e)&&(e=[e]);for(var n=e.length;n--;)t=l.get(e[n]),t&&i.push(t);return i.length?i:null},get:a.Dom.get,each:a.Basic.each,getPos:a.Dom.getPos,getSize:a.Dom.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g;return e?(""+e).replace(i,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:a.Basic.toArray,inArray:a.Basic.inArray,inSeries:a.Basic.inSeries,addI18n:t.core.I18n.addI18n,translate:t.core.I18n.translate,sprintf:a.Basic.sprintf,isEmptyObj:a.Basic.isEmptyObj,hasClass:a.Dom.hasClass,addClass:a.Dom.addClass,removeClass:a.Dom.removeClass,getStyle:a.Dom.getStyle,addEvent:a.Events.addEvent,removeEvent:a.Events.removeEvent,removeAllEvents:a.Events.removeAllEvents,cleanName:function(e){var t,i;for(i=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"],t=0;t<i.length;t+=2)e=e.replace(i[t],i[t+1]);return e=e.replace(/\s+/g,"_"),e=e.replace(/[^a-z0-9_\-\.]+/gi,"")},buildUrl:function(e,t){var i="";return l.each(t,function(e,t){i+=(i?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(e)}),i&&(e+=(e.indexOf("?")>0?"&":"?")+i),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===i||/\D/.test(e))return l.translate("N/A");var n=Math.pow(1024,4);return e>n?t(e/n,1)+" "+l.translate("tb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("gb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("mb"):e>1024?Math.round(e/1024)+" "+l.translate("kb"):e+" "+l.translate("b")},parseSize:a.Basic.parseSizeStr,predictRuntime:function(e,t){var i,n;return i=new l.Uploader(e),n=o.thatCan(i.getOption().required_features,t||e.runtimes),i.destroy(),n},addFileFilter:function(e,t){s[e]=t}};l.addFileFilter("mime_types",function(e,t,i){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:l.FILE_EXTENSION_ERROR,message:l.translate("File extension error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("max_file_size",function(e,t,i){var n;e=l.parseSize(e),t.size!==n&&e&&t.size>e?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("prevent_duplicates",function(e,t,i){if(e)for(var n=this.files.length;n--;)if(t.name===this.files[n].name&&t.size===this.files[n].size)return this.trigger("Error",{code:l.FILE_DUPLICATE_ERROR,message:l.translate("Duplicate file error."),file:t}),i(!1),void 0;i(!0)}),l.addFileFilter("prevent_empty",function(e,t,n){e&&!t.size&&t.size!==i?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),n(!1)):n(!0)}),l.Uploader=function(e){function a(){var e,t,i=0;if(this.state==l.STARTED){for(t=0;t<D.length;t++)e||D[t].status!=l.QUEUED?i++:(e=D[t],this.trigger("BeforeUpload",e)&&(e.status=l.UPLOADING,this.trigger("UploadFile",e)));i==D.length&&(this.state!==l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged")),this.trigger("UploadComplete",D))}}function u(e){e.percent=e.size>0?Math.ceil(100*(e.loaded/e.size)):100,d()}function d(){var e,t,n,r=0;for(I.reset(),e=0;e<D.length;e++)t=D[e],t.size!==i?(I.size+=t.origSize,n=t.loaded*t.origSize/t.size,(!t.completeTimestamp||t.completeTimestamp>S)&&(r+=n),I.loaded+=n):I.size=i,t.status==l.DONE?I.uploaded++:t.status==l.FAILED?I.failed++:I.queued++;I.size===i?I.percent=D.length>0?Math.ceil(100*(I.uploaded/D.length)):0:(I.bytesPerSec=Math.ceil(r/((+new Date-S||1)/1e3)),I.percent=I.size>0?Math.ceil(100*(I.loaded/I.size)):0)}function c(){var e=F[0]||P[0];return e?e.getRuntime().uid:!1}function f(){this.bind("FilesAdded FilesRemoved",function(e){e.trigger("QueueChanged"),e.refresh()}),this.bind("CancelUpload",b),this.bind("BeforeUpload",m),this.bind("UploadFile",_),this.bind("UploadProgress",E),this.bind("StateChanged",v),this.bind("QueueChanged",d),this.bind("Error",R),this.bind("FileUploaded",y),this.bind("Destroy",z)}function p(e,i){var n=this,r=0,s=[],a={runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:x,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};l.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(a[t]=e[t])}),e.browse_button&&l.each(e.browse_button,function(i){s.push(function(s){var u=new t.file.FileInput(l.extend({},a,{accept:e.filters.mime_types,name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:i}));u.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),r++,F.push(this),s()},u.onchange=function(){n.addFile(this.files)},u.bind("mouseenter mouseleave mousedown mouseup",function(t){U||(e.browse_button_hover&&("mouseenter"===t.type?l.addClass(i,e.browse_button_hover):"mouseleave"===t.type&&l.removeClass(i,e.browse_button_hover)),e.browse_button_active&&("mousedown"===t.type?l.addClass(i,e.browse_button_active):"mouseup"===t.type&&l.removeClass(i,e.browse_button_active)))}),u.bind("mousedown",function(){n.trigger("Browse")}),u.bind("error runtimeerror",function(){u=null,s()}),u.init()})}),e.drop_element&&l.each(e.drop_element,function(e){s.push(function(i){var s=new t.file.FileDrop(l.extend({},a,{drop_zone:e}));s.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),dragdrop:e.can("drag_and_drop")}),r++,P.push(this),i()},s.ondrop=function(){n.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,i()}),s.init()})}),l.inSeries(s,function(){"function"==typeof i&&i(r)})}function g(e,n,r,s){var a=new t.image.Image;try{a.onload=function(){n.width>this.width&&n.height>this.height&&n.quality===i&&n.preserve_headers&&!n.crop?(this.destroy(),s(e)):a.downsize(n.width,n.height,n.crop,n.preserve_headers)},a.onresize=function(){var t=this.getAsBlob(e.type,n.quality);this.destroy(),s(t)},a.bind("error runtimeerror",function(){this.destroy(),s(e)}),a.load(e,r)}catch(o){s(e)}}function h(e,i,r){function s(e,i,n){var r=O[e];switch(e){case"max_file_size":"max_file_size"===e&&(O.max_file_size=O.filters.max_file_size=i);break;case"chunk_size":(i=l.parseSize(i))&&(O[e]=i,O.send_file_name=!0);break;case"multipart":O[e]=i,i||(O.send_file_name=!0);break;case"http_method":O[e]="PUT"===i.toUpperCase()?"PUT":"POST";break;case"unique_names":O[e]=i,i&&(O.send_file_name=!0);break;case"filters":"array"===l.typeOf(i)&&(i={mime_types:i}),n?l.extend(O.filters,i):O.filters=i,i.mime_types&&("string"===l.typeOf(i.mime_types)&&(i.mime_types=t.core.utils.Mime.mimes2extList(i.mime_types)),i.mime_types.regexp=function(e){var t=[];return l.each(e,function(e){l.each(e.extensions.split(/,/),function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})}),new RegExp("("+t.join("|")+")$","i")}(i.mime_types),O.filters.mime_types=i.mime_types);break;case"resize":O.resize=i?l.extend({preserve_headers:!0,crop:!1},i):!1;break;case"prevent_duplicates":O.prevent_duplicates=O.filters.prevent_duplicates=!!i;break;case"container":case"browse_button":case"drop_element":i="container"===e?l.get(i):l.getAll(i);case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":O[e]=i,n||(u=!0);break;default:O[e]=i}n||a.trigger("OptionChanged",e,i,r)}var a=this,u=!1;"object"==typeof e?l.each(e,function(e,t){s(t,e,r)}):s(e,i,r),r?(O.required_features=n(l.extend({},O)),x=n(l.extend({},O,{required_features:!0}))):u&&(a.trigger("Destroy"),p.call(a,O,function(e){e?(a.runtime=o.getInfo(c()).type,a.trigger("Init",{runtime:a.runtime}),a.trigger("PostInit")):a.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}))}function m(e,t){if(e.settings.unique_names){var i=t.name.match(/\.([^.]+)$/),n="part";i&&(n=i[1]),t.target_name=t.id+"."+n}}function _(e,i){function n(){c-->0?r(s,1e3):(i.loaded=p,e.trigger("Error",{code:l.HTTP_ERROR,message:l.translate("HTTP Error."),file:i,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}))}function s(){var t,n,r={};i.status===l.UPLOADING&&e.state!==l.STOPPED&&(e.settings.send_file_name&&(r.name=i.target_name||i.name),d&&f.chunks&&o.size>d?(n=Math.min(d,o.size-p),t=o.slice(p,p+n)):(n=o.size,t=o),d&&f.chunks&&(e.settings.send_chunk_number?(r.chunk=Math.ceil(p/d),r.chunks=Math.ceil(o.size/d)):(r.offset=p,r.total=o.size)),e.trigger("BeforeChunkUpload",i,r,t,p)&&a(r,t,n))}function a(a,d,g){var m;T=new t.xhr.XMLHttpRequest,T.upload&&(T.upload.onprogress=function(t){i.loaded=Math.min(i.size,p+t.loaded),e.trigger("UploadProgress",i)}),T.onload=function(){return T.status<200&&T.status>=400?(n(),void 0):(c=e.settings.max_retries,g<o.size?(d.destroy(),p+=g,i.loaded=Math.min(p,o.size),e.trigger("ChunkUploaded",i,{offset:i.loaded,total:o.size,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}),"Android Browser"===l.ua.browser&&e.trigger("UploadProgress",i)):i.loaded=i.size,d=m=null,!p||p>=o.size?(i.size!=i.origSize&&(o.destroy(),o=null),e.trigger("UploadProgress",i),i.status=l.DONE,i.completeTimestamp=+new Date,e.trigger("FileUploaded",i,{response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()})):r(s,1),void 0)},T.onerror=function(){n()},T.onloadend=function(){this.destroy()},e.settings.multipart&&f.multipart?(T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),m=new t.xhr.FormData,l.each(l.extend(a,e.settings.multipart_params),function(e,t){m.append(t,e)}),m.append(e.settings.file_data_name,d),T.send(m,h)):(u=l.buildUrl(e.settings.url,l.extend(a,e.settings.multipart_params)),T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),T.hasRequestHeader("Content-Type")||T.setRequestHeader("Content-Type","application/octet-stream"),T.send(d,h))}var o,u=e.settings.url,d=e.settings.chunk_size,c=e.settings.max_retries,f=e.features,p=0,h={runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:x,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url};i.loaded&&(p=i.loaded=d?d*Math.floor(i.loaded/d):0),o=i.getSource(),l.isEmptyObj(e.settings.resize)||-1===l.inArray(o.type,["image/jpeg","image/png"])?s():g(o,e.settings.resize,h,function(e){o=e,i.size=e.size,s()})}function E(e,t){u(t)}function v(e){if(e.state==l.STARTED)S=+new Date;else if(e.state==l.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==l.UPLOADING&&(e.files[t].status=l.QUEUED,d())}function b(){T&&T.abort()}function y(e){d(),r(function(){a.call(e)},1)}function R(e,t){t.code===l.INIT_ERROR?e.destroy():t.code===l.HTTP_ERROR&&(t.file.status=l.FAILED,t.file.completeTimestamp=+new Date,u(t.file),e.state==l.STARTED&&(e.trigger("CancelUpload"),r(function(){a.call(e)},1)))}function z(e){e.stop(),l.each(D,function(e){e.destroy()}),D=[],F.length&&(l.each(F,function(e){e.destroy()}),F=[]),P.length&&(l.each(P,function(e){e.destroy()}),P=[]),x={},U=!1,S=T=null,I.reset()}var O,S,I,T,w=l.guid(),D=[],x={},F=[],P=[],U=!1;O={chunk_size:0,file_data_name:"file",filters:{mime_types:[],max_file_size:0,prevent_duplicates:!1,prevent_empty:!0},flash_swf_url:"js/Moxie.swf",http_method:"POST",max_retries:0,multipart:!0,multi_selection:!0,resize:!1,runtimes:o.order,send_file_name:!0,send_chunk_number:!0,silverlight_xap_url:"js/Moxie.xap"},h.call(this,e,null,!0),I=new l.QueueProgress,l.extend(this,{id:w,uid:w,state:l.STOPPED,features:{},runtime:null,files:D,settings:O,total:I,init:function(){var e,t,i=this;return e=i.getOption("preinit"),"function"==typeof e?e(i):l.each(e,function(e,t){i.bind(t,e)}),f.call(i),l.each(["container","browse_button","drop_element"],function(e){return null===i.getOption(e)?(t={code:l.INIT_ERROR,message:l.sprintf(l.translate("%s specified, but cannot be found."),e)},!1):void 0}),t?i.trigger("Error",t):O.browse_button||O.drop_element?(p.call(i,O,function(e){var t=i.getOption("init");"function"==typeof t?t(i):l.each(t,function(e,t){i.bind(t,e)}),e?(i.runtime=o.getInfo(c()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}),void 0):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("You must specify either browse_button or drop_element.")})},setOption:function(e,t){h.call(this,e,t,!this.runtime)},getOption:function(e){return e?O[e]:O},refresh:function(){F.length&&l.each(F,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=l.STARTED&&(this.state=l.STARTED,this.trigger("StateChanged"),a.call(this))},stop:function(){this.state!=l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){U=arguments[0]!==i?arguments[0]:!0,F.length&&l.each(F,function(e){e.disable(U)}),this.trigger("DisableBrowse",U)},getFile:function(e){var t;for(t=D.length-1;t>=0;t--)if(D[t].id===e)return D[t]},addFile:function(e,i){function n(e,t){var i=[];l.each(u.settings.filters,function(t,n){s[n]&&i.push(function(i){s[n].call(u,t,e,function(e){i(!e)})})}),l.inSeries(i,t)}function a(e){var s=l.typeOf(e);if(e instanceof t.file.File){if(!e.ruid&&!e.isDetached()){if(!o)return!1;e.ruid=o,e.connectRuntime(o)}a(new l.File(e))}else e instanceof t.file.Blob?(a(e.getSource()),e.destroy()):e instanceof l.File?(i&&(e.name=i),d.push(function(t){n(e,function(i){i||(D.push(e),f.push(e),u.trigger("FileFiltered",e)),r(t,1)})})):-1!==l.inArray(s,["file","blob"])?a(new t.file.File(null,e)):"node"===s&&"filelist"===l.typeOf(e.files)?l.each(e.files,a):"array"===s&&(i=null,l.each(e,a))}var o,u=this,d=[],f=[];o=c(),a(e),d.length&&l.inSeries(d,function(){f.length&&u.trigger("FilesAdded",f)})},removeFile:function(e){for(var t="string"==typeof e?e:e.id,i=D.length-1;i>=0;i--)if(D[i].id===t)return this.splice(i,1)[0]},splice:function(e,t){var n=D.splice(e===i?0:e,t===i?D.length:t),r=!1;return this.state==l.STARTED&&(l.each(n,function(e){return e.status===l.UPLOADING?(r=!0,!1):void 0}),r&&this.stop()),this.trigger("FilesRemoved",n),l.each(n,function(e){e.destroy()}),r&&this.start(),n},dispatchEvent:function(e){var t,i;if(e=e.toLowerCase(),t=this.hasEventListener(e)){t.sort(function(e,t){return t.priority-e.priority}),i=[].slice.call(arguments),i.shift(),i.unshift(this);for(var n=0;n<t.length;n++)if(t[n].fn.apply(t[n].scope,i)===!1)return!1}return!0},bind:function(e,t,i,n){l.Uploader.prototype.bind.call(this,e,t,n,i)},destroy:function(){this.trigger("Destroy"),O=I=null,this.unbindAll()}})},l.Uploader.prototype=t.core.EventTarget.instance,l.File=function(){function e(e){l.extend(this,{id:l.guid(),name:e.name||e.fileName,type:e.type||"",relativePath:e.relativePath||"",size:e.fileSize||e.size,origSize:e.fileSize||e.size,loaded:0,percent:0,status:l.QUEUED,lastModifiedDate:e.lastModifiedDate||(new Date).toLocaleString(),completeTimestamp:0,getNative:function(){var e=this.getSource().getSource();return-1!==l.inArray(l.typeOf(e),["blob","file"])?e:null},getSource:function(){return t[this.id]?t[this.id]:null},destroy:function(){var e=this.getSource();e&&(e.destroy(),delete t[this.id])}}),t[this.id]=e}var t={};return e}(),l.QueueProgress=function(){var e=this;e.size=0,e.loaded=0,e.uploaded=0,e.failed=0,e.queued=0,e.percent=0,e.bytesPerSec=0,e.reset=function(){e.size=e.loaded=e.uploaded=e.failed=e.queued=e.percent=e.bytesPerSec=0}},e.plupload=l}(this,e)}); \ No newline at end of file
+!function(e,t){var i=function(){var e={};return t.apply(e,arguments),e.plupload};"function"==typeof define&&define.amd?define("plupload",["./moxie"],i):"object"==typeof module&&module.exports?module.exports=i(require("./moxie")):e.plupload=i(e.moxie)}(this||window,function(e){!function(e,t,i){function n(e){function t(e,t,i){var r={chunks:"slice_blob",jpgresize:"send_binary_string",pngresize:"send_binary_string",progress:"report_upload_progress",multi_selection:"select_multiple",dragdrop:"drag_and_drop",drop_element:"drag_and_drop",headers:"send_custom_headers",urlstream_upload:"send_binary_string",canSendBinary:"send_binary",triggerDialog:"summon_file_dialog"};r[e]?n[r[e]]=t:i||(n[e]=t)}var i=e.required_features,n={};return"string"==typeof i?l.each(i.split(/\s*,\s*/),function(e){t(e,!0)}):"object"==typeof i?l.each(i,function(e,i){t(i,e)}):i===!0&&(e.chunk_size&&e.chunk_size>0&&(n.slice_blob=!0),l.isEmptyObj(e.resize)&&e.multipart!==!1||(n.send_binary_string=!0),e.http_method&&(n.use_http_method=e.http_method),l.each(e,function(e,i){t(i,!!e,!0)})),n}var r=window.setTimeout,s={},a=t.core.utils,o=t.runtime.Runtime,l={VERSION:"2.3.6",STOPPED:1,STARTED:2,QUEUED:1,UPLOADING:2,FAILED:4,DONE:5,GENERIC_ERROR:-100,HTTP_ERROR:-200,IO_ERROR:-300,SECURITY_ERROR:-400,INIT_ERROR:-500,FILE_SIZE_ERROR:-600,FILE_EXTENSION_ERROR:-601,FILE_DUPLICATE_ERROR:-602,IMAGE_FORMAT_ERROR:-700,MEMORY_ERROR:-701,IMAGE_DIMENSIONS_ERROR:-702,moxie:t,mimeTypes:a.Mime.mimes,ua:a.Env,typeOf:a.Basic.typeOf,extend:a.Basic.extend,guid:a.Basic.guid,getAll:function(e){var t,i=[];"array"!==l.typeOf(e)&&(e=[e]);for(var n=e.length;n--;)t=l.get(e[n]),t&&i.push(t);return i.length?i:null},get:a.Dom.get,each:a.Basic.each,getPos:a.Dom.getPos,getSize:a.Dom.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},i=/[<>&\"\']/g;return e?(""+e).replace(i,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:a.Basic.toArray,inArray:a.Basic.inArray,inSeries:a.Basic.inSeries,addI18n:t.core.I18n.addI18n,translate:t.core.I18n.translate,sprintf:a.Basic.sprintf,isEmptyObj:a.Basic.isEmptyObj,hasClass:a.Dom.hasClass,addClass:a.Dom.addClass,removeClass:a.Dom.removeClass,getStyle:a.Dom.getStyle,addEvent:a.Events.addEvent,removeEvent:a.Events.removeEvent,removeAllEvents:a.Events.removeAllEvents,cleanName:function(e){var t,i;for(i=[/[\300-\306]/g,"A",/[\340-\346]/g,"a",/\307/g,"C",/\347/g,"c",/[\310-\313]/g,"E",/[\350-\353]/g,"e",/[\314-\317]/g,"I",/[\354-\357]/g,"i",/\321/g,"N",/\361/g,"n",/[\322-\330]/g,"O",/[\362-\370]/g,"o",/[\331-\334]/g,"U",/[\371-\374]/g,"u"],t=0;t<i.length;t+=2)e=e.replace(i[t],i[t+1]);return e=e.replace(/\s+/g,"_"),e=e.replace(/[^a-z0-9_\-\.]+/gi,"")},buildUrl:function(e,t){var i="";return l.each(t,function(e,t){i+=(i?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(e)}),i&&(e+=(e.indexOf("?")>0?"&":"?")+i),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===i||/\D/.test(e))return l.translate("N/A");var n=Math.pow(1024,4);return e>n?t(e/n,1)+" "+l.translate("tb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("gb"):e>(n/=1024)?t(e/n,1)+" "+l.translate("mb"):e>1024?Math.round(e/1024)+" "+l.translate("kb"):e+" "+l.translate("b")},parseSize:a.Basic.parseSizeStr,predictRuntime:function(e,t){var i,n;return i=new l.Uploader(e),n=o.thatCan(i.getOption().required_features,t||e.runtimes),i.destroy(),n},addFileFilter:function(e,t){s[e]=t}};l.addFileFilter("mime_types",function(e,t,i){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:l.FILE_EXTENSION_ERROR,message:l.translate("File extension error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("max_file_size",function(e,t,i){var n;e=l.parseSize(e),t.size!==n&&e&&t.size>e?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),i(!1)):i(!0)}),l.addFileFilter("prevent_duplicates",function(e,t,i){if(e)for(var n=this.files.length;n--;)if(t.name===this.files[n].name&&t.size===this.files[n].size)return this.trigger("Error",{code:l.FILE_DUPLICATE_ERROR,message:l.translate("Duplicate file error."),file:t}),i(!1),void 0;i(!0)}),l.addFileFilter("prevent_empty",function(e,t,n){e&&!t.size&&t.size!==i?(this.trigger("Error",{code:l.FILE_SIZE_ERROR,message:l.translate("File size error."),file:t}),n(!1)):n(!0)}),l.Uploader=function(e){function a(){var e,t,i=0;if(this.state==l.STARTED){for(t=0;t<D.length;t++)e||D[t].status!=l.QUEUED?i++:(e=D[t],this.trigger("BeforeUpload",e)&&(e.status=l.UPLOADING,this.trigger("UploadFile",e)));i==D.length&&(this.state!==l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged")),this.trigger("UploadComplete",D))}}function u(e){e.percent=e.size>0?Math.ceil(100*(e.loaded/e.size)):100,d()}function d(){var e,t,n,r=0;for(I.reset(),e=0;e<D.length;e++)t=D[e],t.size!==i?(I.size+=t.origSize,n=t.loaded*t.origSize/t.size,(!t.completeTimestamp||t.completeTimestamp>S)&&(r+=n),I.loaded+=n):I.size=i,t.status==l.DONE?I.uploaded++:t.status==l.FAILED?I.failed++:I.queued++;I.size===i?I.percent=D.length>0?Math.ceil(100*(I.uploaded/D.length)):0:(I.bytesPerSec=Math.ceil(r/((+new Date-S||1)/1e3)),I.percent=I.size>0?Math.ceil(100*(I.loaded/I.size)):0)}function c(){var e=F[0]||P[0];return e?e.getRuntime().uid:!1}function f(){this.bind("FilesAdded FilesRemoved",function(e){e.trigger("QueueChanged"),e.refresh()}),this.bind("CancelUpload",b),this.bind("BeforeUpload",m),this.bind("UploadFile",_),this.bind("UploadProgress",E),this.bind("StateChanged",v),this.bind("QueueChanged",d),this.bind("Error",R),this.bind("FileUploaded",y),this.bind("Destroy",z)}function p(e,i){var n=this,r=0,s=[],a={runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:x,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};l.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(a[t]=e[t])}),e.browse_button&&l.each(e.browse_button,function(i){s.push(function(s){var u=new t.file.FileInput(l.extend({},a,{accept:e.filters.mime_types,name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:i}));u.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),r++,F.push(this),s()},u.onchange=function(){n.addFile(this.files)},u.bind("mouseenter mouseleave mousedown mouseup",function(t){U||(e.browse_button_hover&&("mouseenter"===t.type?l.addClass(i,e.browse_button_hover):"mouseleave"===t.type&&l.removeClass(i,e.browse_button_hover)),e.browse_button_active&&("mousedown"===t.type?l.addClass(i,e.browse_button_active):"mouseup"===t.type&&l.removeClass(i,e.browse_button_active)))}),u.bind("mousedown",function(){n.trigger("Browse")}),u.bind("error runtimeerror",function(){u=null,s()}),u.init()})}),e.drop_element&&l.each(e.drop_element,function(e){s.push(function(i){var s=new t.file.FileDrop(l.extend({},a,{drop_zone:e}));s.onready=function(){var e=o.getInfo(this.ruid);l.extend(n.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),dragdrop:e.can("drag_and_drop")}),r++,P.push(this),i()},s.ondrop=function(){n.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,i()}),s.init()})}),l.inSeries(s,function(){"function"==typeof i&&i(r)})}function g(e,n,r,s){var a=new t.image.Image;try{a.onload=function(){n.width>this.width&&n.height>this.height&&n.quality===i&&n.preserve_headers&&!n.crop?(this.destroy(),s(e)):a.downsize(n.width,n.height,n.crop,n.preserve_headers)},a.onresize=function(){var t=this.getAsBlob(e.type,n.quality);this.destroy(),s(t)},a.bind("error runtimeerror",function(){this.destroy(),s(e)}),a.load(e,r)}catch(o){s(e)}}function h(e,i,r){function s(e,i,n){var r=O[e];switch(e){case"max_file_size":"max_file_size"===e&&(O.max_file_size=O.filters.max_file_size=i);break;case"chunk_size":(i=l.parseSize(i))&&(O[e]=i,O.send_file_name=!0);break;case"multipart":O[e]=i,i||(O.send_file_name=!0);break;case"http_method":O[e]="PUT"===i.toUpperCase()?"PUT":"POST";break;case"unique_names":O[e]=i,i&&(O.send_file_name=!0);break;case"filters":"array"===l.typeOf(i)&&(i={mime_types:i}),n?l.extend(O.filters,i):O.filters=i,i.mime_types&&("string"===l.typeOf(i.mime_types)&&(i.mime_types=t.core.utils.Mime.mimes2extList(i.mime_types)),i.mime_types.regexp=function(e){var t=[];return l.each(e,function(e){l.each(e.extensions.split(/,/),function(e){/^\s*\*\s*$/.test(e)?t.push("\\.*"):t.push("\\."+e.replace(new RegExp("["+"/^$.*+?|()[]{}\\".replace(/./g,"\\$&")+"]","g"),"\\$&"))})}),new RegExp("("+t.join("|")+")$","i")}(i.mime_types),O.filters.mime_types=i.mime_types);break;case"resize":O.resize=i?l.extend({preserve_headers:!0,crop:!1},i):!1;break;case"prevent_duplicates":O.prevent_duplicates=O.filters.prevent_duplicates=!!i;break;case"container":case"browse_button":case"drop_element":i="container"===e?l.get(i):l.getAll(i);case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":O[e]=i,n||(u=!0);break;default:O[e]=i}n||a.trigger("OptionChanged",e,i,r)}var a=this,u=!1;"object"==typeof e?l.each(e,function(e,t){s(t,e,r)}):s(e,i,r),r?(O.required_features=n(l.extend({},O)),x=n(l.extend({},O,{required_features:!0}))):u&&(a.trigger("Destroy"),p.call(a,O,function(e){e?(a.runtime=o.getInfo(c()).type,a.trigger("Init",{runtime:a.runtime}),a.trigger("PostInit")):a.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}))}function m(e,t){if(e.settings.unique_names){var i=t.name.match(/\.([^.]+)$/),n="part";i&&(n=i[1]),t.target_name=t.id+"."+n}}function _(e,i){function n(){c-->0?r(s,1e3):(i.loaded=p,e.trigger("Error",{code:l.HTTP_ERROR,message:l.translate("HTTP Error."),file:i,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}))}function s(){var t,n,r={};i.status===l.UPLOADING&&e.state!==l.STOPPED&&(e.settings.send_file_name&&(r.name=i.target_name||i.name),d&&f.chunks&&o.size>d?(n=Math.min(d,o.size-p),t=o.slice(p,p+n)):(n=o.size,t=o),d&&f.chunks&&(e.settings.send_chunk_number?(r.chunk=Math.ceil(p/d),r.chunks=Math.ceil(o.size/d)):(r.offset=p,r.total=o.size)),e.trigger("BeforeChunkUpload",i,r,t,p)&&a(r,t,n))}function a(a,d,g){var m;T=new t.xhr.XMLHttpRequest,T.upload&&(T.upload.onprogress=function(t){i.loaded=Math.min(i.size,p+t.loaded),e.trigger("UploadProgress",i)}),T.onload=function(){return T.status<200||T.status>=400?(n(),void 0):(c=e.settings.max_retries,g<o.size?(d.destroy(),p+=g,i.loaded=Math.min(p,o.size),e.trigger("ChunkUploaded",i,{offset:i.loaded,total:o.size,response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()}),"Android Browser"===l.ua.browser&&e.trigger("UploadProgress",i)):i.loaded=i.size,d=m=null,!p||p>=o.size?(i.size!=i.origSize&&(o.destroy(),o=null),e.trigger("UploadProgress",i),i.status=l.DONE,i.completeTimestamp=+new Date,e.trigger("FileUploaded",i,{response:T.responseText,status:T.status,responseHeaders:T.getAllResponseHeaders()})):r(s,1),void 0)},T.onerror=function(){n()},T.onloadend=function(){this.destroy()},e.settings.multipart&&f.multipart?(T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),m=new t.xhr.FormData,l.each(l.extend(a,e.settings.multipart_params),function(e,t){m.append(t,e)}),m.append(e.settings.file_data_name,d),T.send(m,h)):(u=l.buildUrl(e.settings.url,l.extend(a,e.settings.multipart_params)),T.open(e.settings.http_method,u,!0),l.each(e.settings.headers,function(e,t){T.setRequestHeader(t,e)}),T.hasRequestHeader("Content-Type")||T.setRequestHeader("Content-Type","application/octet-stream"),T.send(d,h))}var o,u=e.settings.url,d=e.settings.chunk_size,c=e.settings.max_retries,f=e.features,p=0,h={runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:x,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url};i.loaded&&(p=i.loaded=d?d*Math.floor(i.loaded/d):0),o=i.getSource(),l.isEmptyObj(e.settings.resize)||-1===l.inArray(o.type,["image/jpeg","image/png"])?s():g(o,e.settings.resize,h,function(e){o=e,i.size=e.size,s()})}function E(e,t){u(t)}function v(e){if(e.state==l.STARTED)S=+new Date;else if(e.state==l.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==l.UPLOADING&&(e.files[t].status=l.QUEUED,d())}function b(){T&&T.abort()}function y(e){d(),r(function(){a.call(e)},1)}function R(e,t){t.code===l.INIT_ERROR?e.destroy():t.code===l.HTTP_ERROR&&(t.file.status=l.FAILED,t.file.completeTimestamp=+new Date,u(t.file),e.state==l.STARTED&&(e.trigger("CancelUpload"),r(function(){a.call(e)},1)))}function z(e){e.stop(),l.each(D,function(e){e.destroy()}),D=[],F.length&&(l.each(F,function(e){e.destroy()}),F=[]),P.length&&(l.each(P,function(e){e.destroy()}),P=[]),x={},U=!1,S=T=null,I.reset()}var O,S,I,T,w=l.guid(),D=[],x={},F=[],P=[],U=!1;O={chunk_size:0,file_data_name:"file",filters:{mime_types:[],max_file_size:0,prevent_duplicates:!1,prevent_empty:!0},flash_swf_url:"js/Moxie.swf",http_method:"POST",max_retries:0,multipart:!0,multi_selection:!0,resize:!1,runtimes:o.order,send_file_name:!0,send_chunk_number:!0,silverlight_xap_url:"js/Moxie.xap"},h.call(this,e,null,!0),I=new l.QueueProgress,l.extend(this,{id:w,uid:w,state:l.STOPPED,features:{},runtime:null,files:D,settings:O,total:I,init:function(){var e,t,i=this;return e=i.getOption("preinit"),"function"==typeof e?e(i):l.each(e,function(e,t){i.bind(t,e)}),f.call(i),l.each(["container","browse_button","drop_element"],function(e){return null===i.getOption(e)?(t={code:l.INIT_ERROR,message:l.sprintf(l.translate("%s specified, but cannot be found."),e)},!1):void 0}),t?i.trigger("Error",t):O.browse_button||O.drop_element?(p.call(i,O,function(e){var t=i.getOption("init");"function"==typeof t?t(i):l.each(t,function(e,t){i.bind(t,e)}),e?(i.runtime=o.getInfo(c()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("Init error.")})}),void 0):i.trigger("Error",{code:l.INIT_ERROR,message:l.translate("You must specify either browse_button or drop_element.")})},setOption:function(e,t){h.call(this,e,t,!this.runtime)},getOption:function(e){return e?O[e]:O},refresh:function(){F.length&&l.each(F,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=l.STARTED&&(this.state=l.STARTED,this.trigger("StateChanged"),a.call(this))},stop:function(){this.state!=l.STOPPED&&(this.state=l.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){U=arguments[0]!==i?arguments[0]:!0,F.length&&l.each(F,function(e){e.disable(U)}),this.trigger("DisableBrowse",U)},getFile:function(e){var t;for(t=D.length-1;t>=0;t--)if(D[t].id===e)return D[t]},addFile:function(e,i){function n(e,t){var i=[];l.each(u.settings.filters,function(t,n){s[n]&&i.push(function(i){s[n].call(u,t,e,function(e){i(!e)})})}),l.inSeries(i,t)}function a(e){var s=l.typeOf(e);if(e instanceof t.file.File){if(!e.ruid&&!e.isDetached()){if(!o)return!1;e.ruid=o,e.connectRuntime(o)}a(new l.File(e))}else e instanceof t.file.Blob?(a(e.getSource()),e.destroy()):e instanceof l.File?(i&&(e.name=i),d.push(function(t){n(e,function(i){i||(D.push(e),f.push(e),u.trigger("FileFiltered",e)),r(t,1)})})):-1!==l.inArray(s,["file","blob"])?a(new t.file.File(null,e)):"node"===s&&"filelist"===l.typeOf(e.files)?l.each(e.files,a):"array"===s&&(i=null,l.each(e,a))}var o,u=this,d=[],f=[];o=c(),a(e),d.length&&l.inSeries(d,function(){f.length&&u.trigger("FilesAdded",f)})},removeFile:function(e){for(var t="string"==typeof e?e:e.id,i=D.length-1;i>=0;i--)if(D[i].id===t)return this.splice(i,1)[0]},splice:function(e,t){var n=D.splice(e===i?0:e,t===i?D.length:t),r=!1;return this.state==l.STARTED&&(l.each(n,function(e){return e.status===l.UPLOADING?(r=!0,!1):void 0}),r&&this.stop()),this.trigger("FilesRemoved",n),l.each(n,function(e){e.destroy()}),r&&this.start(),n},dispatchEvent:function(e){var t,i;if(e=e.toLowerCase(),t=this.hasEventListener(e)){t.sort(function(e,t){return t.priority-e.priority}),i=[].slice.call(arguments),i.shift(),i.unshift(this);for(var n=0;n<t.length;n++)if(t[n].fn.apply(t[n].scope,i)===!1)return!1}return!0},bind:function(e,t,i,n){l.Uploader.prototype.bind.call(this,e,t,n,i)},destroy:function(){this.trigger("Destroy"),O=I=null,this.unbindAll()}})},l.Uploader.prototype=t.core.EventTarget.instance,l.File=function(){function e(e){l.extend(this,{id:l.guid(),name:e.name||e.fileName,type:e.type||"",relativePath:e.relativePath||"",size:e.fileSize||e.size,origSize:e.fileSize||e.size,loaded:0,percent:0,status:l.QUEUED,lastModifiedDate:e.lastModifiedDate||(new Date).toLocaleString(),completeTimestamp:0,getNative:function(){var e=this.getSource().getSource();return-1!==l.inArray(l.typeOf(e),["blob","file"])?e:null},getSource:function(){return t[this.id]?t[this.id]:null},destroy:function(){var e=this.getSource();e&&(e.destroy(),delete t[this.id])}}),t[this.id]=e}var t={};return e}(),l.QueueProgress=function(){var e=this;e.size=0,e.loaded=0,e.uploaded=0,e.failed=0,e.queued=0,e.percent=0,e.bytesPerSec=0,e.reset=function(){e.size=e.loaded=e.uploaded=e.failed=e.queued=e.percent=e.bytesPerSec=0}},e.plupload=l}(this,e)}); \ No newline at end of file
diff --git a/phpBB/bin/phpbbcli.php b/phpBB/bin/phpbbcli.php
index 3061fee817..5ae18334d9 100755
--- a/phpBB/bin/phpbbcli.php
+++ b/phpBB/bin/phpbbcli.php
@@ -71,9 +71,12 @@ require($phpbb_root_path . 'includes/compatibility_globals.' . $phpEx);
register_compatibility_globals();
+/** @var \phpbb\config\config $config */
+$config = $phpbb_container->get('config');
+
/** @var \phpbb\language\language $language */
$language = $phpbb_container->get('language');
-$language->set_default_language($phpbb_container->get('config')['default_lang']);
+$language->set_default_language($config['default_lang']);
$language->add_lang(array('common', 'acp/common', 'cli'));
/* @var $user \phpbb\user */
diff --git a/phpBB/composer.json b/phpBB/composer.json
index 5bc8f5dc0d..33655b865f 100644
--- a/phpBB/composer.json
+++ b/phpBB/composer.json
@@ -4,7 +4,7 @@
"type": "project",
"keywords": ["phpbb", "forum"],
"homepage": "https://www.phpbb.com",
- "license": "GPL-2.0",
+ "license": "GPL-2.0-only",
"authors": [
{
"name": "phpBB Limited",
@@ -31,9 +31,9 @@
"guzzlehttp/guzzle": "~5.3",
"lusitanian/oauth": "^0.8.1",
"marc1706/fast-image-size": "^1.1",
- "paragonie/random_compat": "^1.4",
+ "paragonie/random_compat": "^2.0",
"patchwork/utf8": "^1.1",
- "s9e/text-formatter": "~0.11.0",
+ "s9e/text-formatter": "^1.3",
"symfony/config": "^2.8",
"symfony/console": "^2.8",
"symfony/debug": "^2.8",
@@ -69,7 +69,7 @@
},
"config": {
"platform": {
- "php": "5.4"
+ "php": "5.4.7"
}
}
}
diff --git a/phpBB/composer.lock b/phpBB/composer.lock
index 9345d07dbf..d2a95fd8a3 100644
--- a/phpBB/composer.lock
+++ b/phpBB/composer.lock
@@ -1,11 +1,10 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "hash": "7c30306b2abcb79a206bf6497ef45a02",
- "content-hash": "d559dd0af2317fb0fc15720a18834e33",
+ "content-hash": "cd42964227d699a6923798e33eab3dd5",
"packages": [
{
"name": "bantu/ini-get-wrapper",
@@ -35,7 +34,7 @@
"MIT"
],
"description": "Convenience wrapper around ini_get()",
- "time": "2014-09-15 13:12:35"
+ "time": "2014-09-15T13:12:35+00:00"
},
{
"name": "google/recaptcha",
@@ -80,25 +79,26 @@
"recaptcha",
"spam"
],
- "time": "2015-09-02 17:23:59"
+ "time": "2015-09-02T17:23:59+00:00"
},
{
"name": "guzzlehttp/guzzle",
- "version": "5.3.1",
+ "version": "5.3.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8"
+ "reference": "93bbdb30d59be6cd9839495306c65f2907370eb9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/70f1fa53b71c4647bf2762c09068a95f77e12fb8",
- "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/93bbdb30d59be6cd9839495306c65f2907370eb9",
+ "reference": "93bbdb30d59be6cd9839495306c65f2907370eb9",
"shasum": ""
},
"require": {
"guzzlehttp/ringphp": "^1.1",
- "php": ">=5.4.0"
+ "php": ">=5.4.0",
+ "react/promise": "^2.2"
},
"require-dev": {
"ext-curl": "*",
@@ -132,20 +132,20 @@
"rest",
"web service"
],
- "time": "2016-07-15 19:28:39"
+ "time": "2018-07-31T13:33:10+00:00"
},
{
"name": "guzzlehttp/ringphp",
- "version": "1.1.0",
+ "version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/RingPHP.git",
- "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b"
+ "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
- "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b",
+ "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/5e2a174052995663dd68e6b5ad838afd47dd615b",
+ "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b",
"shasum": ""
},
"require": {
@@ -183,7 +183,7 @@
}
],
"description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.",
- "time": "2015-05-20 03:37:09"
+ "time": "2018-07-31T13:22:33+00:00"
},
{
"name": "guzzlehttp/streams",
@@ -233,7 +233,7 @@
"Guzzle",
"stream"
],
- "time": "2014-10-12 19:18:40"
+ "time": "2014-10-12T19:18:40+00:00"
},
{
"name": "ircmaxell/password-compat",
@@ -275,20 +275,20 @@
"hashing",
"password"
],
- "time": "2014-11-20 16:49:30"
+ "time": "2014-11-20T16:49:30+00:00"
},
{
"name": "lusitanian/oauth",
- "version": "v0.8.10",
+ "version": "v0.8.11",
"source": {
"type": "git",
"url": "https://github.com/Lusitanian/PHPoAuthLib.git",
- "reference": "09f4af38f17db6938253f4d1b171d537913ac1ed"
+ "reference": "fc11a53db4b66da555a6a11fce294f574a8374f9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/09f4af38f17db6938253f4d1b171d537913ac1ed",
- "reference": "09f4af38f17db6938253f4d1b171d537913ac1ed",
+ "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/fc11a53db4b66da555a6a11fce294f574a8374f9",
+ "reference": "fc11a53db4b66da555a6a11fce294f574a8374f9",
"shasum": ""
},
"require": {
@@ -342,23 +342,24 @@
"oauth",
"security"
],
- "time": "2016-07-12 22:15:00"
+ "time": "2016-07-12T22:15:00+00:00"
},
{
"name": "marc1706/fast-image-size",
- "version": "v1.1.3",
+ "version": "v1.1.4",
"source": {
"type": "git",
"url": "https://github.com/marc1706/fast-image-size.git",
- "reference": "5f7e8377746524e2b8a49a631c1fc9afeb9d8bee"
+ "reference": "c4ded0223a4e49ae45a2183a69f6afac5baf7250"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/marc1706/fast-image-size/zipball/5f7e8377746524e2b8a49a631c1fc9afeb9d8bee",
- "reference": "5f7e8377746524e2b8a49a631c1fc9afeb9d8bee",
+ "url": "https://api.github.com/repos/marc1706/fast-image-size/zipball/c4ded0223a4e49ae45a2183a69f6afac5baf7250",
+ "reference": "c4ded0223a4e49ae45a2183a69f6afac5baf7250",
"shasum": ""
},
"require": {
+ "ext-mbstring": "*",
"php": ">=5.3.0"
},
"require-dev": {
@@ -393,7 +394,7 @@
"php",
"size"
],
- "time": "2017-03-26 12:48:28"
+ "time": "2017-10-23T18:52:01+00:00"
},
{
"name": "ocramius/proxy-manager",
@@ -456,20 +457,20 @@
"proxy pattern",
"service proxies"
],
- "time": "2015-08-09 04:28:19"
+ "time": "2015-08-09T04:28:19+00:00"
},
{
"name": "paragonie/random_compat",
- "version": "v1.4.2",
+ "version": "v2.0.18",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
- "reference": "965cdeb01fdcab7653253aa81d40441d261f1e66"
+ "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/965cdeb01fdcab7653253aa81d40441d261f1e66",
- "reference": "965cdeb01fdcab7653253aa81d40441d261f1e66",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
+ "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
"shasum": ""
},
"require": {
@@ -501,10 +502,11 @@
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
+ "polyfill",
"pseudorandom",
"random"
],
- "time": "2017-03-13 16:22:52"
+ "time": "2019-01-03T20:59:08+00:00"
},
{
"name": "patchwork/utf8",
@@ -563,20 +565,20 @@
"utf-8",
"utf8"
],
- "time": "2016-05-18 13:57:10"
+ "time": "2016-05-18T13:57:10+00:00"
},
{
"name": "psr/log",
- "version": "1.0.2",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
+ "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
"shasum": ""
},
"require": {
@@ -610,20 +612,20 @@
"psr",
"psr-3"
],
- "time": "2016-10-10 12:19:37"
+ "time": "2018-11-20T15:27:04+00:00"
},
{
"name": "react/promise",
- "version": "v2.5.1",
+ "version": "v2.7.1",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise.git",
- "reference": "62785ae604c8d69725d693eb370e1d67e94c4053"
+ "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise/zipball/62785ae604c8d69725d693eb370e1d67e94c4053",
- "reference": "62785ae604c8d69725d693eb370e1d67e94c4053",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/31ffa96f8d2ed0341a57848cbb84d88b89dd664d",
+ "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d",
"shasum": ""
},
"require": {
@@ -656,32 +658,33 @@
"promise",
"promises"
],
- "time": "2017-03-25 12:08:31"
+ "time": "2019-01-07T21:25:54+00:00"
},
{
"name": "s9e/text-formatter",
- "version": "0.11.0",
+ "version": "1.4.5",
"source": {
"type": "git",
"url": "https://github.com/s9e/TextFormatter.git",
- "reference": "664b3eaf52baaae4d93548f5e20246fa5942b2b9"
+ "reference": "6857c53658929b66dc0d92daece17f211c64ea61"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/664b3eaf52baaae4d93548f5e20246fa5942b2b9",
- "reference": "664b3eaf52baaae4d93548f5e20246fa5942b2b9",
+ "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/6857c53658929b66dc0d92daece17f211c64ea61",
+ "reference": "6857c53658929b66dc0d92daece17f211c64ea61",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-filter": "*",
"lib-pcre": ">=7.2",
- "php": ">=5.3.3"
+ "php": ">=5.4.7"
},
"require-dev": {
"matthiasmullie/minify": "*",
- "php": ">=5.3.3",
- "s9e/regexp-builder": ">=1.3.0"
+ "php-coveralls/php-coveralls": "*",
+ "phpunit/phpunit": "<6",
+ "s9e/regexp-builder": "1.*"
},
"suggest": {
"ext-curl": "Improves the performance of the MediaEmbed plugin and some JavaScript minifiers",
@@ -721,25 +724,26 @@
"parser",
"shortcodes"
],
- "time": "2017-08-04 23:06:38"
+ "time": "2019-06-04T15:47:55+00:00"
},
{
"name": "symfony/config",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "0b8541d18507d10204a08384640ff6df3c739ebe"
+ "reference": "7dd5f5040dc04c118d057fb5886563963eb70011"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/0b8541d18507d10204a08384640ff6df3c739ebe",
- "reference": "0b8541d18507d10204a08384640ff6df3c739ebe",
+ "url": "https://api.github.com/repos/symfony/config/zipball/7dd5f5040dc04c118d057fb5886563963eb70011",
+ "reference": "7dd5f5040dc04c118d057fb5886563963eb70011",
"shasum": ""
},
"require": {
"php": ">=5.3.9",
- "symfony/filesystem": "~2.3|~3.0.0"
+ "symfony/filesystem": "~2.3|~3.0.0",
+ "symfony/polyfill-ctype": "~1.8"
},
"require-dev": {
"symfony/yaml": "~2.7|~3.0.0"
@@ -777,20 +781,20 @@
],
"description": "Symfony Config Component",
"homepage": "https://symfony.com",
- "time": "2017-04-12 14:07:15"
+ "time": "2018-11-26T09:38:12+00:00"
},
{
"name": "symfony/console",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "efa4d466b67c2fc9bf9419a981e683e1f99fa029"
+ "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/efa4d466b67c2fc9bf9419a981e683e1f99fa029",
- "reference": "efa4d466b67c2fc9bf9419a981e683e1f99fa029",
+ "url": "https://api.github.com/repos/symfony/console/zipball/cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12",
+ "reference": "cbcf4b5e233af15cd2bbd50dee1ccc9b7927dc12",
"shasum": ""
},
"require": {
@@ -804,7 +808,7 @@
"symfony/process": "~2.1|~3.0.0"
},
"suggest": {
- "psr/log": "For using the console logger",
+ "psr/log-implementation": "For using the console logger",
"symfony/event-dispatcher": "",
"symfony/process": ""
},
@@ -838,20 +842,20 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2017-05-28 14:07:33"
+ "time": "2018-11-20T15:55:20+00:00"
},
{
"name": "symfony/debug",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "344f50ce827413b3640bfcb1e37386a67d06ea1f"
+ "reference": "74251c8d50dd3be7c4ce0c7b862497cdc641a5d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/344f50ce827413b3640bfcb1e37386a67d06ea1f",
- "reference": "344f50ce827413b3640bfcb1e37386a67d06ea1f",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/74251c8d50dd3be7c4ce0c7b862497cdc641a5d0",
+ "reference": "74251c8d50dd3be7c4ce0c7b862497cdc641a5d0",
"shasum": ""
},
"require": {
@@ -895,20 +899,20 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2017-04-19 19:56:30"
+ "time": "2018-11-11T11:18:13+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "155b770e68150139779295864d6b6cb3172cd821"
+ "reference": "c306198fee8f872a8f5f031e6e4f6f83086992d8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/155b770e68150139779295864d6b6cb3172cd821",
- "reference": "155b770e68150139779295864d6b6cb3172cd821",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/c306198fee8f872a8f5f031e6e4f6f83086992d8",
+ "reference": "c306198fee8f872a8f5f031e6e4f6f83086992d8",
"shasum": ""
},
"require": {
@@ -958,20 +962,20 @@
],
"description": "Symfony DependencyInjection Component",
"homepage": "https://symfony.com",
- "time": "2017-05-25 22:57:22"
+ "time": "2019-04-16T11:33:46+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "7fc8e2b4118ff316550596357325dfd92a51f531"
+ "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7fc8e2b4118ff316550596357325dfd92a51f531",
- "reference": "7fc8e2b4118ff316550596357325dfd92a51f531",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a77e974a5fecb4398833b0709210e3d5e334ffb0",
+ "reference": "a77e974a5fecb4398833b0709210e3d5e334ffb0",
"shasum": ""
},
"require": {
@@ -1018,24 +1022,25 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2017-04-26 16:56:54"
+ "time": "2018-11-21T14:20:20+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "19c11158da8d110cc5289c063bf2ec4cc1ce9e7c"
+ "reference": "7ae46872dad09dffb7fe1e93a0937097339d0080"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/19c11158da8d110cc5289c063bf2ec4cc1ce9e7c",
- "reference": "19c11158da8d110cc5289c063bf2ec4cc1ce9e7c",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/7ae46872dad09dffb7fe1e93a0937097339d0080",
+ "reference": "7ae46872dad09dffb7fe1e93a0937097339d0080",
"shasum": ""
},
"require": {
- "php": ">=5.3.9"
+ "php": ">=5.3.9",
+ "symfony/polyfill-ctype": "~1.8"
},
"type": "library",
"extra": {
@@ -1067,20 +1072,20 @@
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
- "time": "2017-05-28 14:07:33"
+ "time": "2018-11-11T11:18:13+00:00"
},
{
"name": "symfony/finder",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "b058a6f0cb6ee9b6b727aae03d5a62474a308528"
+ "reference": "1444eac52273e345d9b95129bf914639305a9ba4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/b058a6f0cb6ee9b6b727aae03d5a62474a308528",
- "reference": "b058a6f0cb6ee9b6b727aae03d5a62474a308528",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/1444eac52273e345d9b95129bf914639305a9ba4",
+ "reference": "1444eac52273e345d9b95129bf914639305a9ba4",
"shasum": ""
},
"require": {
@@ -1116,20 +1121,20 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
- "time": "2017-05-25 22:57:22"
+ "time": "2018-11-11T11:18:13+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "03bf5ded5a4b54473e7551df5cfab854f7434ed4"
+ "reference": "746f8d3638bf46ee8b202e62f2b214c3d61fb06a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/03bf5ded5a4b54473e7551df5cfab854f7434ed4",
- "reference": "03bf5ded5a4b54473e7551df5cfab854f7434ed4",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/746f8d3638bf46ee8b202e62f2b214c3d61fb06a",
+ "reference": "746f8d3638bf46ee8b202e62f2b214c3d61fb06a",
"shasum": ""
},
"require": {
@@ -1171,20 +1176,20 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
- "time": "2017-05-19 11:49:58"
+ "time": "2019-04-16T10:00:53+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v2.8.21",
+ "version": "v2.8.51",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "ae9dd4cfde4a3efa94475863fc330825715fe549"
+ "reference": "a01e2b4b267fda24dba9b06cd1c575ca87a51ad2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ae9dd4cfde4a3efa94475863fc330825715fe549",
- "reference": "ae9dd4cfde4a3efa94475863fc330825715fe549",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a01e2b4b267fda24dba9b06cd1c575ca87a51ad2",
+ "reference": "a01e2b4b267fda24dba9b06cd1c575ca87a51ad2",
"shasum": ""
},
"require": {
@@ -1192,10 +1197,12 @@
"psr/log": "~1.0",
"symfony/debug": "^2.6.2",
"symfony/event-dispatcher": "^2.6.7|~3.0.0",
- "symfony/http-foundation": "~2.7.20|~2.8.13|~3.1.6"
+ "symfony/http-foundation": "~2.7.36|~2.8.29|~3.1.6",
+ "symfony/polyfill-ctype": "~1.8"
},
"conflict": {
- "symfony/config": "<2.7"
+ "symfony/config": "<2.7",
+ "twig/twig": "<1.34|<2.4,>=2"
},
"require-dev": {
"symfony/browser-kit": "~2.3|~3.0.0",
@@ -1253,20 +1260,78 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "https://symfony.com",
- "time": "2017-05-29 19:14:58"
+ "time": "2019-04-17T16:42:28+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "82ebae02209c21113908c229e9883c419720738a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a",
+ "reference": "82ebae02209c21113908c229e9883c419720738a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Gert de Pagter",
+ "email": "backendtea@gmail.com"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "time": "2019-02-06T07:57:58+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.3.0",
+ "version": "v1.11.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ "reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
},
"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/fe5e94c604826c35a32fa832f35bd036b6799609",
+ "reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
"shasum": ""
},
"require": {
@@ -1278,7 +1343,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-master": "1.11-dev"
}
},
"autoload": {
@@ -1312,20 +1377,20 @@
"portable",
"shim"
],
- "time": "2016-11-14 01:06:16"
+ "time": "2019-02-06T07:57:58+00:00"
},
{
"name": "symfony/polyfill-php54",
- "version": "v1.3.0",
+ "version": "v1.11.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php54.git",
- "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0"
+ "reference": "2964b17ddc32dba7bcba009d5501c84d3fba1452"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/90e085822963fdcc9d1c5b73deb3d2e5783b16a0",
- "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0",
+ "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/2964b17ddc32dba7bcba009d5501c84d3fba1452",
+ "reference": "2964b17ddc32dba7bcba009d5501c84d3fba1452",
"shasum": ""
},
"require": {
@@ -1334,7 +1399,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-master": "1.11-dev"
}
},
"autoload": {
@@ -1370,20 +1435,20 @@
"portable",
"shim"
],
- "time": "2016-11-14 01:06:16"
+ "time": "2019-02-06T07:57:58+00:00"
},
{
"name": "symfony/polyfill-php55",
- "version": "v1.3.0",
+ "version": "v1.11.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php55.git",
- "reference": "03e3f0350bca2220e3623a0e340eef194405fc67"
+ "reference": "96fa25cef405ea452919559a0025d5dc16e30e4c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/03e3f0350bca2220e3623a0e340eef194405fc67",
- "reference": "03e3f0350bca2220e3623a0e340eef194405fc67",
+ "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/96fa25cef405ea452919559a0025d5dc16e30e4c",
+ "reference": "96fa25cef405ea452919559a0025d5dc16e30e4c",
"shasum": ""
},
"require": {
@@ -1393,7 +1458,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-master": "1.11-dev"
}
},
"autoload": {
@@ -1426,20 +1491,20 @@
"portable",
"shim"
],
- "time": "2016-11-14 01:06:16"
+ "time": "2019-02-06T07:57:58+00:00"
},
{
"name": "symfony/proxy-manager-bridge",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/proxy-manager-bridge.git",
- "reference": "991c0fcd1d461ee9c7cde7d2c44d1ed7f4cc36ae"
+ "reference": "40802595fea26ada845ed58124d8000a13dd4c6f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/991c0fcd1d461ee9c7cde7d2c44d1ed7f4cc36ae",
- "reference": "991c0fcd1d461ee9c7cde7d2c44d1ed7f4cc36ae",
+ "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/40802595fea26ada845ed58124d8000a13dd4c6f",
+ "reference": "40802595fea26ada845ed58124d8000a13dd4c6f",
"shasum": ""
},
"require": {
@@ -1480,20 +1545,20 @@
],
"description": "Symfony ProxyManager Bridge",
"homepage": "https://symfony.com",
- "time": "2017-04-12 14:07:15"
+ "time": "2019-04-16T11:33:46+00:00"
},
{
"name": "symfony/routing",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "a8f328c7e701b7bb05a93fca62a5ab2b6b3e500e"
+ "reference": "8b0df6869d1997baafff6a1541826eac5a03d067"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/a8f328c7e701b7bb05a93fca62a5ab2b6b3e500e",
- "reference": "a8f328c7e701b7bb05a93fca62a5ab2b6b3e500e",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/8b0df6869d1997baafff6a1541826eac5a03d067",
+ "reference": "8b0df6869d1997baafff6a1541826eac5a03d067",
"shasum": ""
},
"require": {
@@ -1504,7 +1569,6 @@
},
"require-dev": {
"doctrine/annotations": "~1.0",
- "doctrine/common": "~2.2",
"psr/log": "~1.0",
"symfony/config": "~2.7|~3.0.0",
"symfony/expression-language": "~2.4|~3.0.0",
@@ -1555,36 +1619,40 @@
"uri",
"url"
],
- "time": "2017-04-12 14:07:15"
+ "time": "2018-11-20T15:55:20+00:00"
},
{
"name": "symfony/twig-bridge",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bridge.git",
- "reference": "362aa855b5819355811b58f8b5f15679196a181e"
+ "reference": "ecc1e30d05fa99f25b504e2d6a8684555ae39f7c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/362aa855b5819355811b58f8b5f15679196a181e",
- "reference": "362aa855b5819355811b58f8b5f15679196a181e",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ecc1e30d05fa99f25b504e2d6a8684555ae39f7c",
+ "reference": "ecc1e30d05fa99f25b504e2d6a8684555ae39f7c",
"shasum": ""
},
"require": {
"php": ">=5.3.9",
- "twig/twig": "~1.28|~2.0"
+ "twig/twig": "~1.34|~2.4"
+ },
+ "conflict": {
+ "symfony/form": "<2.8.23"
},
"require-dev": {
"symfony/asset": "~2.7|~3.0.0",
"symfony/console": "~2.8|~3.0.0",
"symfony/expression-language": "~2.4|~3.0.0",
"symfony/finder": "~2.3|~3.0.0",
- "symfony/form": "^2.8.19",
+ "symfony/form": "^2.8.23",
+ "symfony/http-foundation": "^2.8.29|~3.0.0",
"symfony/http-kernel": "~2.8|~3.0.0",
"symfony/polyfill-intl-icu": "~1.0",
"symfony/routing": "~2.2|~3.0.0",
- "symfony/security": "~2.6|~3.0.0",
+ "symfony/security": "^2.8.31|^3.3.13",
"symfony/security-acl": "~2.6|~3.0.0",
"symfony/stopwatch": "~2.2|~3.0.0",
"symfony/templating": "~2.1|~3.0.0",
@@ -1636,24 +1704,25 @@
],
"description": "Symfony Twig Bridge",
"homepage": "https://symfony.com",
- "time": "2017-04-12 14:07:15"
+ "time": "2018-11-11T11:18:13+00:00"
},
{
"name": "symfony/yaml",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "93ccdde79f4b079c7558da4656a3cb1c50c68e02"
+ "reference": "02c1859112aa779d9ab394ae4f3381911d84052b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/93ccdde79f4b079c7558da4656a3cb1c50c68e02",
- "reference": "93ccdde79f4b079c7558da4656a3cb1c50c68e02",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/02c1859112aa779d9ab394ae4f3381911d84052b",
+ "reference": "02c1859112aa779d9ab394ae4f3381911d84052b",
"shasum": ""
},
"require": {
- "php": ">=5.3.9"
+ "php": ">=5.3.9",
+ "symfony/polyfill-ctype": "~1.8"
},
"type": "library",
"extra": {
@@ -1685,39 +1754,43 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2017-05-01 14:31:55"
+ "time": "2018-11-11T11:18:13+00:00"
},
{
"name": "twig/twig",
- "version": "v1.33.2",
+ "version": "v1.42.2",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "dd6ca96227917e1e85b41c7c3cc6507b411e0927"
+ "reference": "21707d6ebd05476854805e4f91b836531941bcd4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/dd6ca96227917e1e85b41c7c3cc6507b411e0927",
- "reference": "dd6ca96227917e1e85b41c7c3cc6507b411e0927",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/21707d6ebd05476854805e4f91b836531941bcd4",
+ "reference": "21707d6ebd05476854805e4f91b836531941bcd4",
"shasum": ""
},
"require": {
- "php": ">=5.2.7"
+ "php": ">=5.4.0",
+ "symfony/polyfill-ctype": "^1.8"
},
"require-dev": {
"psr/container": "^1.0",
- "symfony/debug": "~2.7",
- "symfony/phpunit-bridge": "~3.3@dev"
+ "symfony/debug": "^2.7",
+ "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.33-dev"
+ "dev-master": "1.42-dev"
}
},
"autoload": {
"psr-0": {
"Twig_": "lib/"
+ },
+ "psr-4": {
+ "Twig\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1738,16 +1811,16 @@
},
{
"name": "Twig Team",
- "homepage": "http://twig.sensiolabs.org/contributors",
+ "homepage": "https://twig.symfony.com/contributors",
"role": "Contributors"
}
],
"description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "http://twig.sensiolabs.org",
+ "homepage": "https://twig.symfony.com",
"keywords": [
"templating"
],
- "time": "2017-04-20 17:39:48"
+ "time": "2019-06-18T15:35:16+00:00"
},
{
"name": "zendframework/zend-code",
@@ -1800,7 +1873,7 @@
"code",
"zf2"
],
- "time": "2015-06-03 15:31:59"
+ "time": "2015-06-03T15:31:59+00:00"
},
{
"name": "zendframework/zend-eventmanager",
@@ -1845,7 +1918,7 @@
"eventmanager",
"zf2"
],
- "time": "2015-06-03 15:32:01"
+ "time": "2015-06-03T15:32:01+00:00"
},
{
"name": "zendframework/zend-stdlib",
@@ -1901,7 +1974,7 @@
"stdlib",
"zf2"
],
- "time": "2015-06-03 15:32:03"
+ "time": "2015-06-03T15:32:03+00:00"
}
],
"packages-dev": [
@@ -1957,7 +2030,7 @@
"constructor",
"instantiate"
],
- "time": "2015-06-14 21:17:01"
+ "time": "2015-06-14T21:17:01+00:00"
},
{
"name": "fabpot/goutte",
@@ -2006,7 +2079,7 @@
"keywords": [
"scraper"
],
- "time": "2015-05-05 21:14:57"
+ "time": "2015-05-05T21:14:57+00:00"
},
{
"name": "facebook/webdriver",
@@ -2052,7 +2125,7 @@
"selenium",
"webdriver"
],
- "time": "2016-08-10 00:44:08"
+ "time": "2016-08-10T00:44:08+00:00"
},
{
"name": "laravel/homestead",
@@ -2093,34 +2166,29 @@
}
],
"description": "A virtual machine for web artisans.",
- "time": "2016-09-17 04:42:33"
+ "time": "2016-09-17T04:42:33+00:00"
},
{
"name": "michelf/php-markdown",
- "version": "1.7.0",
+ "version": "1.8.0",
"source": {
"type": "git",
"url": "https://github.com/michelf/php-markdown.git",
- "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
+ "reference": "01ab082b355bf188d907b9929cd99b2923053495"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
- "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/01ab082b355bf188d907b9929cd99b2923053495",
+ "reference": "01ab082b355bf188d907b9929cd99b2923053495",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-lib": "1.4.x-dev"
- }
- },
"autoload": {
- "psr-0": {
- "Michelf": ""
+ "psr-4": {
+ "Michelf\\": "Michelf/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2144,7 +2212,7 @@
"keywords": [
"markdown"
],
- "time": "2016-10-29 18:58:20"
+ "time": "2018-01-15T00:49:33+00:00"
},
{
"name": "nikic/php-parser",
@@ -2189,7 +2257,7 @@
"parser",
"php"
],
- "time": "2014-07-23 18:24:17"
+ "time": "2014-07-23T18:24:17+00:00"
},
{
"name": "phing/phing",
@@ -2227,7 +2295,8 @@
"authors": [
{
"name": "Michiel Rook",
- "email": "mrook@php.net"
+ "email": "mrook@php.net",
+ "role": "Lead"
},
{
"name": "Phing Community",
@@ -2241,7 +2310,7 @@
"task",
"tool"
],
- "time": "2012-11-29 21:23:47"
+ "time": "2012-11-29T21:23:47+00:00"
},
{
"name": "phpdocumentor/reflection-docblock",
@@ -2290,42 +2359,42 @@
"email": "mike.vanriel@naenius.com"
}
],
- "time": "2016-01-25 08:17:30"
+ "time": "2016-01-25T08:17:30+00:00"
},
{
"name": "phpspec/prophecy",
- "version": "v1.7.0",
+ "version": "1.8.1",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
+ "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073",
- "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76",
+ "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.0.2",
"php": "^5.3|^7.0",
- "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
- "sebastian/comparator": "^1.1|^2.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
+ "sebastian/comparator": "^1.1|^2.0|^3.0",
"sebastian/recursion-context": "^1.0|^2.0|^3.0"
},
"require-dev": {
"phpspec/phpspec": "^2.5|^3.2",
- "phpunit/phpunit": "^4.8 || ^5.6.5"
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6.x-dev"
+ "dev-master": "1.8.x-dev"
}
},
"autoload": {
- "psr-0": {
- "Prophecy\\": "src/"
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2353,7 +2422,7 @@
"spy",
"stub"
],
- "time": "2017-03-02 20:05:34"
+ "time": "2019-06-13T12:50:23+00:00"
},
{
"name": "phpunit/dbunit",
@@ -2412,7 +2481,8 @@
"testing",
"xunit"
],
- "time": "2015-03-29 14:23:04"
+ "abandoned": true,
+ "time": "2015-03-29T14:23:04+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -2474,20 +2544,20 @@
"testing",
"xunit"
],
- "time": "2015-10-06 15:47:00"
+ "time": "2015-10-06T15:47:00+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "1.4.2",
+ "version": "1.4.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
- "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
"shasum": ""
},
"require": {
@@ -2521,7 +2591,7 @@
"filesystem",
"iterator"
],
- "time": "2016-10-03 07:40:28"
+ "time": "2017-11-27T13:52:08+00:00"
},
{
"name": "phpunit/php-text-template",
@@ -2562,7 +2632,7 @@
"keywords": [
"template"
],
- "time": "2015-06-21 13:50:34"
+ "time": "2015-06-21T13:50:34+00:00"
},
{
"name": "phpunit/php-timer",
@@ -2611,20 +2681,20 @@
"keywords": [
"timer"
],
- "time": "2017-02-26 11:10:40"
+ "time": "2017-02-26T11:10:40+00:00"
},
{
"name": "phpunit/php-token-stream",
- "version": "1.4.11",
+ "version": "1.4.12",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
+ "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
- "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16",
+ "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16",
"shasum": ""
},
"require": {
@@ -2660,20 +2730,20 @@
"keywords": [
"tokenizer"
],
- "time": "2017-02-27 10:12:30"
+ "time": "2017-12-04T08:55:13+00:00"
},
{
"name": "phpunit/phpunit",
- "version": "4.8.35",
+ "version": "4.8.36",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87"
+ "reference": "46023de9a91eec7dfb06cc56cb4e260017298517"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87",
- "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517",
+ "reference": "46023de9a91eec7dfb06cc56cb4e260017298517",
"shasum": ""
},
"require": {
@@ -2732,7 +2802,7 @@
"testing",
"xunit"
],
- "time": "2017-02-06 05:18:07"
+ "time": "2017-06-21T08:07:12+00:00"
},
{
"name": "phpunit/phpunit-mock-objects",
@@ -2788,7 +2858,8 @@
"mock",
"xunit"
],
- "time": "2015-10-02 06:51:40"
+ "abandoned": true,
+ "time": "2015-10-02T06:51:40+00:00"
},
{
"name": "pimple/pimple",
@@ -2834,7 +2905,7 @@
"container",
"dependency injection"
],
- "time": "2013-03-08 08:21:40"
+ "time": "2013-03-08T08:21:40+00:00"
},
{
"name": "sami/sami",
@@ -2891,7 +2962,8 @@
"keywords": [
"phpdoc"
],
- "time": "2015-06-05 03:36:34"
+ "abandoned": true,
+ "time": "2015-06-05T03:36:34+00:00"
},
{
"name": "sebastian/comparator",
@@ -2955,7 +3027,7 @@
"compare",
"equality"
],
- "time": "2017-01-29 09:50:25"
+ "time": "2017-01-29T09:50:25+00:00"
},
{
"name": "sebastian/diff",
@@ -3007,7 +3079,7 @@
"keywords": [
"diff"
],
- "time": "2017-05-22 07:24:03"
+ "time": "2017-05-22T07:24:03+00:00"
},
{
"name": "sebastian/environment",
@@ -3057,7 +3129,7 @@
"environment",
"hhvm"
],
- "time": "2016-08-18 05:49:44"
+ "time": "2016-08-18T05:49:44+00:00"
},
{
"name": "sebastian/exporter",
@@ -3124,7 +3196,7 @@
"export",
"exporter"
],
- "time": "2016-06-17 09:04:28"
+ "time": "2016-06-17T09:04:28+00:00"
},
{
"name": "sebastian/global-state",
@@ -3175,7 +3247,7 @@
"keywords": [
"global state"
],
- "time": "2015-10-12 03:26:01"
+ "time": "2015-10-12T03:26:01+00:00"
},
{
"name": "sebastian/recursion-context",
@@ -3228,7 +3300,7 @@
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
- "time": "2016-10-03 07:41:43"
+ "time": "2016-10-03T07:41:43+00:00"
},
{
"name": "sebastian/version",
@@ -3263,20 +3335,20 @@
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
- "time": "2015-06-21 13:59:46"
+ "time": "2015-06-21T13:59:46+00:00"
},
{
"name": "squizlabs/php_codesniffer",
- "version": "2.9.1",
+ "version": "2.9.2",
"source": {
"type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62"
+ "reference": "2acf168de78487db620ab4bc524135a13cfe6745"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62",
- "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/2acf168de78487db620ab4bc524135a13cfe6745",
+ "reference": "2acf168de78487db620ab4bc524135a13cfe6745",
"shasum": ""
},
"require": {
@@ -3341,20 +3413,20 @@
"phpcs",
"standards"
],
- "time": "2017-05-22 02:43:20"
+ "time": "2018-11-07T22:31:41+00:00"
},
{
"name": "symfony/browser-kit",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/browser-kit.git",
- "reference": "4386755566fc8d29bddf89694663b0e96cb01e61"
+ "reference": "b507697225f32a76a9d333d0766fb46353e9d00d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/browser-kit/zipball/4386755566fc8d29bddf89694663b0e96cb01e61",
- "reference": "4386755566fc8d29bddf89694663b0e96cb01e61",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b507697225f32a76a9d333d0766fb46353e9d00d",
+ "reference": "b507697225f32a76a9d333d0766fb46353e9d00d",
"shasum": ""
},
"require": {
@@ -3398,20 +3470,20 @@
],
"description": "Symfony BrowserKit Component",
"homepage": "https://symfony.com",
- "time": "2017-04-12 14:07:15"
+ "time": "2018-11-26T06:55:10+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "ba3204654efa779691fac9e948a96b4a7067e4ab"
+ "reference": "7b1692e418d7ccac24c373528453bc90e42797de"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/ba3204654efa779691fac9e948a96b4a7067e4ab",
- "reference": "ba3204654efa779691fac9e948a96b4a7067e4ab",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/7b1692e418d7ccac24c373528453bc90e42797de",
+ "reference": "7b1692e418d7ccac24c373528453bc90e42797de",
"shasum": ""
},
"require": {
@@ -3451,24 +3523,25 @@
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
- "time": "2017-05-01 14:31:55"
+ "time": "2018-11-11T11:18:13+00:00"
},
{
"name": "symfony/dom-crawler",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "b19d01ec41c704497b0bee78bce8bf97619c0649"
+ "reference": "2cdc7d3909eea6f982a6298d2e9ab7db01b6403c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b19d01ec41c704497b0bee78bce8bf97619c0649",
- "reference": "b19d01ec41c704497b0bee78bce8bf97619c0649",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2cdc7d3909eea6f982a6298d2e9ab7db01b6403c",
+ "reference": "2cdc7d3909eea6f982a6298d2e9ab7db01b6403c",
"shasum": ""
},
"require": {
"php": ">=5.3.9",
+ "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.0"
},
"require-dev": {
@@ -3507,20 +3580,20 @@
],
"description": "Symfony DomCrawler Component",
"homepage": "https://symfony.com",
- "time": "2017-05-25 22:57:22"
+ "time": "2018-11-24T22:30:19+00:00"
},
{
"name": "symfony/process",
- "version": "v2.8.21",
+ "version": "v2.8.50",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9"
+ "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/d54232f5682fda2f8bbebff7c81b864646867ab9",
- "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9",
+ "url": "https://api.github.com/repos/symfony/process/zipball/c3591a09c78639822b0b290d44edb69bf9f05dc8",
+ "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8",
"shasum": ""
},
"require": {
@@ -3556,7 +3629,7 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2017-05-08 01:19:21"
+ "time": "2018-11-11T11:18:13+00:00"
}
],
"aliases": [],
@@ -3569,6 +3642,6 @@
},
"platform-dev": [],
"platform-overrides": {
- "php": "5.4"
+ "php": "5.4.7"
}
}
diff --git a/phpBB/config/default/container/services.yml b/phpBB/config/default/container/services.yml
index 9bb1d673f4..3ead1e6181 100644
--- a/phpBB/config/default/container/services.yml
+++ b/phpBB/config/default/container/services.yml
@@ -122,7 +122,13 @@ services:
group_helper:
class: phpbb\group\helper
arguments:
+ - '@auth'
+ - '@cache'
+ - '@config'
- '@language'
+ - '@dispatcher'
+ - '@path_helper'
+ - '@user'
log:
class: phpbb\log\log
diff --git a/phpBB/config/default/container/services_avatar.yml b/phpBB/config/default/container/services_avatar.yml
index 6cc38516ae..d96aa6239a 100644
--- a/phpBB/config/default/container/services_avatar.yml
+++ b/phpBB/config/default/container/services_avatar.yml
@@ -3,6 +3,7 @@ services:
class: phpbb\avatar\manager
arguments:
- '@config'
+ - '@dispatcher'
- '@avatar.driver_collection'
# ----- Avatar drivers -----
diff --git a/phpBB/config/default/container/services_console.yml b/phpBB/config/default/container/services_console.yml
index 697e147d85..05e467ff8d 100644
--- a/phpBB/config/default/container/services_console.yml
+++ b/phpBB/config/default/container/services_console.yml
@@ -3,7 +3,6 @@ services:
class: phpbb\console\exception_subscriber
arguments:
- '@language'
- - '%debug.exceptions%'
tags:
- { name: kernel.event_subscriber }
@@ -209,6 +208,7 @@ services:
console.command.thumbnail.delete:
class: phpbb\console\command\thumbnail\delete
arguments:
+ - '@config'
- '@user'
- '@dbal.conn'
- '%core.root_path%'
@@ -218,6 +218,7 @@ services:
console.command.thumbnail.generate:
class: phpbb\console\command\thumbnail\generate
arguments:
+ - '@config'
- '@user'
- '@dbal.conn'
- '@cache'
diff --git a/phpBB/config/default/container/services_content.yml b/phpBB/config/default/container/services_content.yml
index 602fd25f4e..6717c20337 100644
--- a/phpBB/config/default/container/services_content.yml
+++ b/phpBB/config/default/container/services_content.yml
@@ -35,6 +35,7 @@ services:
- '@config_text'
- '@dbal.conn'
- '@user'
+ - '@dispatcher'
- '%core.root_path%'
- '%core.php_ext%'
diff --git a/phpBB/config/default/container/services_feed.yml b/phpBB/config/default/container/services_feed.yml
index d3e7924f2f..e8bac4b5ce 100644
--- a/phpBB/config/default/container/services_feed.yml
+++ b/phpBB/config/default/container/services_feed.yml
@@ -18,9 +18,10 @@ services:
class: phpbb\feed\helper
arguments:
- '@config'
+ - '@service_container'
+ - '@path_helper'
+ - '@text_formatter.renderer'
- '@user'
- - '%core.root_path%'
- - '%core.php_ext%'
feed.forum:
class: phpbb\feed\forum
@@ -78,6 +79,10 @@ services:
- '@dispatcher'
- '%core.php_ext%'
+ feed.quote_helper:
+ class: phpbb\feed\quote_helper
+ parent: text_formatter.s9e.quote_helper
+
feed.topic:
class: phpbb\feed\topic
shared: false
diff --git a/phpBB/config/default/container/services_text_formatter.yml b/phpBB/config/default/container/services_text_formatter.yml
index a9f2efdb16..07087cd4a9 100644
--- a/phpBB/config/default/container/services_text_formatter.yml
+++ b/phpBB/config/default/container/services_text_formatter.yml
@@ -26,6 +26,11 @@ services:
text_formatter.utils:
alias: text_formatter.s9e.utils
+ text_formatter.s9e.bbcode_merger:
+ class: phpbb\textformatter\s9e\bbcode_merger
+ arguments:
+ - '@text_formatter.s9e.factory'
+
text_formatter.s9e.factory:
class: phpbb\textformatter\s9e\factory
arguments:
@@ -34,6 +39,7 @@ services:
- '@dispatcher'
- '@config'
- '@text_formatter.s9e.link_helper'
+ - '@log'
- '%text_formatter.cache.dir%'
- '%text_formatter.cache.parser.key%'
- '%text_formatter.cache.renderer.key%'
diff --git a/phpBB/config/installer/container/services_install_obtain_data.yml b/phpBB/config/installer/container/services_install_obtain_data.yml
index cd8d0c8072..010aba829d 100644
--- a/phpBB/config/installer/container/services_install_obtain_data.yml
+++ b/phpBB/config/installer/container/services_install_obtain_data.yml
@@ -33,13 +33,6 @@ services:
tags:
- { name: install_obtain_data, order: 40 }
- installer.obtain_data.obtain_imagick_path:
- class: phpbb\install\module\obtain_data\task\obtain_imagick_path
- arguments:
- - '@installer.helper.config'
- tags:
- - { name: install_obtain_data, order: 60 }
-
installer.obtain_data.obtain_server_data:
class: phpbb\install\module\obtain_data\task\obtain_server_data
arguments:
diff --git a/phpBB/develop/add_permissions.php b/phpBB/develop/add_permissions.php
index c575729d91..d7308a1acc 100644
--- a/phpBB/develop/add_permissions.php
+++ b/phpBB/develop/add_permissions.php
@@ -185,7 +185,7 @@ while ($row = $db->sql_fetchrow($result))
}
$db->sql_freeresult($result);
-if (sizeof($remove_auth_options))
+if (count($remove_auth_options))
{
$db->sql_query('DELETE FROM ' . ACL_USERS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')');
$db->sql_query('DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')');
@@ -199,7 +199,7 @@ $prefixes = array('f_', 'a_', 'm_', 'u_');
foreach ($prefixes as $prefix)
{
$var = $prefix . 'permissions';
- if (sizeof(${$var}))
+ if (count(${$var}))
{
foreach (${$var} as $auth_option => $l_ary)
{
diff --git a/phpBB/develop/check_flash_bbcodes.php b/phpBB/develop/check_flash_bbcodes.php
index 5dc112bfc0..282adad229 100644
--- a/phpBB/develop/check_flash_bbcodes.php
+++ b/phpBB/develop/check_flash_bbcodes.php
@@ -51,7 +51,7 @@ function check_table_flash_bbcodes($table_name, $id_field, $content_field, $uid_
$ids = get_table_flash_bbcode_pkids($table_name, $id_field, $content_field, $uid_field, $bitfield_field);
- $size = sizeof($ids);
+ $size = count($ids);
if ($size)
{
echo "Found $size potentially dangerous flash bbcodes.\n";
diff --git a/phpBB/develop/create_variable_overview.php b/phpBB/develop/create_variable_overview.php
index ace2e4d953..da9a4fe683 100644
--- a/phpBB/develop/create_variable_overview.php
+++ b/phpBB/develop/create_variable_overview.php
@@ -489,12 +489,12 @@ foreach ($lang_references as $lang_var => $filenames)
$html_data .= '<b>' . $lang_var . '</b><ul>';
- if (sizeof($filenames) != 1)
+ if (count($filenames) != 1)
{
fwrite($common_fp, (($entry['common']) ? ",\n" : '') . "\t'$var' => '" . $lang[$var] . "'");
$entry['common'] = true;
}
- else if (sizeof($filenames) == 1)
+ else if (count($filenames) == 1)
{
// Merge logical - hardcoded
$fname = (preg_match('#^(' . implode('|', $merge) . ')#', $filenames[0], $match)) ? $match[0] . '.php' : str_replace($ext, 'php', $filenames[0]);
diff --git a/phpBB/develop/regex_idn.php b/phpBB/develop/regex_idn.php
index d871695c50..30373f8de3 100644
--- a/phpBB/develop/regex_idn.php
+++ b/phpBB/develop/regex_idn.php
@@ -120,7 +120,7 @@ do
$pct_encoded = "%[\dA-F]{2}";
$unreserved = "$add_chars\pL0-9\-._~";
$sub_delims = ($inline) ? '!$&\'(*+,;=' : '!$&\'()*+,;=';
- $scheme = ($inline) ? '[a-z][a-z\d+]*': '[a-z][a-z\d+\-.]*' ; // avoid automatic parsing of "word" in "last word.http://..."
+ $scheme = ($inline) ? '[a-z][a-z\d+]*(?<!javascript)': '[a-z][a-z\d+\-.]*(?<!javascript)' ; // avoid automatic parsing of "word" in "last word.http://..."
$pchar = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)"; // rfc: no "|"
$reg_name = "(?:[^$remove_chars]*[$unreserved$sub_delims:@|]+|$pct_encoded)+"; // rfc: * instead of + and no "|" and no "@" and no ":" (included instead of userinfo)
diff --git a/phpBB/develop/search_fill.php b/phpBB/develop/search_fill.php
index 07c4024b2f..4f684b5b27 100644
--- a/phpBB/develop/search_fill.php
+++ b/phpBB/develop/search_fill.php
@@ -89,7 +89,7 @@ for(;$postcounter <= $max_post_id; $postcounter += $batchsize)
$rowset = $db->sql_fetchrowset($result);
$db->sql_freeresult($result);
- $post_rows = sizeof($rowset);
+ $post_rows = count($rowset);
if( $post_rows )
{
diff --git a/phpBB/docs/CHANGELOG.html b/phpBB/docs/CHANGELOG.html
index 266a65a9c0..dc68e62f49 100644
--- a/phpBB/docs/CHANGELOG.html
+++ b/phpBB/docs/CHANGELOG.html
@@ -50,6 +50,18 @@
<ol>
<li><a href="#changelog">Changelog</a>
<ul>
+ <li><a href="#v327">Changes since 3.2.7</a></li>
+ <li><a href="#v326">Changes since 3.2.6</a></li>
+ <li><a href="#v326rc1">Changes since 3.2.6-RC1</a></li>
+ <li><a href="#v325">Changes since 3.2.5</a></li>
+ <li><a href="#v325rc1">Changes since 3.2.5-RC1</a></li>
+ <li><a href="#v324">Changes since 3.2.4</a></li>
+ <li><a href="#v324rc1">Changes since 3.2.4-RC1</a></li>
+ <li><a href="#v323">Changes since 3.2.3</a></li>
+ <li><a href="#v323rc2">Changes since 3.2.3-RC2</a></li>
+ <li><a href="#v323rc1">Changes since 3.2.3-RC1</a></li>
+ <li><a href="#v322">Changes since 3.2.2</a></li>
+ <li><a href="#v321">Changes since 3.2.1</a></li>
<li><a href="#v320">Changes since 3.2.0</a></li>
<li><a href="#v320rc1">Changes since 3.2.0-RC1</a></li>
<li><a href="#v320b2">Changes since 3.2.0-b2</a></li>
@@ -57,6 +69,7 @@
<li><a href="#v320a2">Changes since 3.2.0-a2</a></li>
<li><a href="#v320a1">Changes since 3.2.0-a1</a></li>
<li><a href="#v31x">Changes since 3.1.x</a></li>
+ <li><a href="#v3111">Changes since 3.1.11</a></li>
<li><a href="#v3110">Changes since 3.1.10</a></li>
<li><a href="#v319">Changes since 3.1.9</a></li>
<li><a href="#v318">Changes since 3.1.8</a></li>
@@ -126,6 +139,558 @@
<div class="inner">
<div class="content">
+ <a name="v327"></a><h3>Changes since 3.2.7</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13175">PHPBB3-13175</a>] - External accounts can be linked to more than one local account</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14459">PHPBB3-14459</a>] - Check language input for group</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15211">PHPBB3-15211</a>] - Emoji characters in forum name causing SQL errors</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15885">PHPBB3-15885</a>] - Group rank not displaying on memberlist_body</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15897">PHPBB3-15897</a>] - Unicode Characters in Attachment Comment Causes mySQL Error </li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15932">PHPBB3-15932</a>] - Users can delete their attachments in the UCP, even if the post is locked</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15961">PHPBB3-15961</a>] - SMTP support for TLS is forcing use of deprecated TLS 1.0</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15974">PHPBB3-15974</a>] - The link &quot;Back to previous page&quot; can redirect to another page, not the previous one</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15976">PHPBB3-15976</a>] - Changing account settings without changing password resets user_passchg</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15982">PHPBB3-15982</a>] - Q&amp;A captcha plug-in still throws PHP 7.2.x countable warning</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16003">PHPBB3-16003</a>] - Post count not updated when deleting only post in topic</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16021">PHPBB3-16021</a>] - Recognize number of Template Event instances in events.md file</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16040">PHPBB3-16040</a>] - Topic Icon with space in filename isn't displayed by viewforum_body.html</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16048">PHPBB3-16048</a>] - Unable to restore any backup from ACP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16050">PHPBB3-16050</a>] - PHP warning in MCP banning tab on PHP 7.2+</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16053">PHPBB3-16053</a>] - BBCodes using {TEXT} in HTML tags no longer work</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16054">PHPBB3-16054</a>] - Style templates no longer able to login &quot;from any page.&quot;</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16055">PHPBB3-16055</a>] - Unable to login using Oauth via Forums, topics or posts</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16061">PHPBB3-16061</a>] - Migrator never drops unique indexes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16063">PHPBB3-16063</a>] - board_dst config value is not removed from config table after conversion</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16066">PHPBB3-16066</a>] - Banned or suspended user receives &quot;The submitted form was invalid. Try submitting again.&quot;</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16071">PHPBB3-16071</a>] - Undefined index for custom attachments groups</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16073">PHPBB3-16073</a>] - Fix warning in ACP version check</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16074">PHPBB3-16074</a>] - Twemoji -fe0f sequence not rendering</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16075">PHPBB3-16075</a>] - PM filter “sent to my default usergroup” triggers array to string conversion warning</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16080">PHPBB3-16080</a>] - Warnings When a Style exists on database but not on FTP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16093">PHPBB3-16093</a>] - Attach row template always gets displayed with JS disabled</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16096">PHPBB3-16096</a>] - MySQL full text search always uses MyISAM limits</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16124">PHPBB3-16124</a>] - Incorrect users search by last visit time in memberlist.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16126">PHPBB3-16126</a>] - AppVeyor builds fail due to chocolatey being unable to install PHP</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15745">PHPBB3-15745</a>] - Hardcoded lang in credit line</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15886">PHPBB3-15886</a>] - Group helper functions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15946">PHPBB3-15946</a>] - Add event - core.posting_modify_row_data</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15967">PHPBB3-15967</a>] - Unambiguous wording in user activation request email to Admin/Moderator</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15984">PHPBB3-15984</a>] - Use of 'Cache-Control: public' for serving files</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16000">PHPBB3-16000</a>] - Provide link to PHP Date Function in both ACP and UCP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16013">PHPBB3-16013</a>] - Do not prevent username changes in ACP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16019">PHPBB3-16019</a>] - Deny prosilver's uninstallation</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16024">PHPBB3-16024</a>] - Add core.topic_review_modify_sql_ary</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16025">PHPBB3-16025</a>] - Add 2 template events *_author_username_{append/prepend}</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16047">PHPBB3-16047</a>] - ACP Private Messages: Wording could be better</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16058">PHPBB3-16058</a>] - Remove sudo required from travis config</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16065">PHPBB3-16065</a>] - Undefined index: user_ip in oauth.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16068">PHPBB3-16068</a>] - Incorrect docblock parameter types</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16070">PHPBB3-16070</a>] - Remove support for WebSTAR and Xitami</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16078">PHPBB3-16078</a>] - Use chrome webdriver for UI tests</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16089">PHPBB3-16089</a>] - Add core.confirm_box_ajax_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16097">PHPBB3-16097</a>] - Add core.viewtopic_gen_sort_selects_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16101">PHPBB3-16101</a>] - Add Referrer-Policy header</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16102">PHPBB3-16102</a>] - Add core.posting_modify_post_subject</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16103">PHPBB3-16103</a>] - Add core.pm_modify_message_subject</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16106">PHPBB3-16106</a>] - Add core.mcp_main_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16107">PHPBB3-16107</a>] - Add mcp_move_destination_forum_before|after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16108">PHPBB3-16108</a>] - Add topiclist_row_topic_by_author_before|after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16109">PHPBB3-16109</a>] - Custom Profile Field visibility is incorrectly explained</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16111">PHPBB3-16111</a>] - Add core.message_history_modify_sql_ary</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16113">PHPBB3-16113</a>] - Add core.mcp_topic_modify_sql_ary</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16114">PHPBB3-16114</a>] - Add 2 mcp_topic_post_author_full_{append/prepend}</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16127">PHPBB3-16127</a>] - Add UI for Mass email $max_chunk_size</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16129">PHPBB3-16129</a>] - The attachment's ALT tag is supposed to describe the image, not the file.</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16067">PHPBB3-16067</a>] - Define trusty build environment for travis builds</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16112">PHPBB3-16112</a>] - Update composer dependencies to latest</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16119">PHPBB3-16119</a>] - The text input for poll question has a too high maxlength attribute</li>
+ </ul>
+
+ <a name="v326"></a><h3>Changes since 3.2.6</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16034">PHPBB3-16034</a>] - Links created with [url=] - are sometimes incorrectly shortened</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16036">PHPBB3-16036</a>] - Cannot login with 3.2.6</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16037">PHPBB3-16037</a>] - Private message ViewFolder Broken</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16039">PHPBB3-16039</a>] - Unable to change announcement to standard topic due to missing global</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16042">PHPBB3-16042</a>] - Use S_LOGIN_REDIRECT to output login form token</li>
+ </ul>
+
+ <a name="v326rc1"></a><h3>Changes since 3.2.6-RC1</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16027">PHPBB3-16027</a>] - Appveyor builds fail on PHP 7.0</li>
+ </ul>
+ <h4>Security Issue</h4>
+ <ul>
+ <li>[SECURITY-231] - Remote avatar functionality allows checking for files and ports on local network</li>
+ <li>[SECURITY-235] - Fulltext native search can be used to cause long execution times</li>
+ </ul>
+ <h4>Hardening</h4>
+ <ul>
+ <li>[SECURITY-228] - Require form token in login_box</li>
+ <li>[SECURITY-233] - SMTP auth data shouldn't be cached</li>
+ <li>[SECURITY-234] - Main website URL in Admin Control Panel should not support JS URLs</li>
+ </ul>
+
+ <a name="v325"></a><h3>Changes since 3.2.5</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15509">PHPBB3-15509</a>] - Update database: info message is to scary</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15869">PHPBB3-15869</a>] - Cookies Problem with domains with special chars</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15876">PHPBB3-15876</a>] - Mysql 5.7 support Q&amp;A plugin</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15883">PHPBB3-15883</a>] - No error for invalid usernames on bulk add to usergroup</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15904">PHPBB3-15904</a>] - PHP warning when accessing modules in ACP System tab</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15917">PHPBB3-15917</a>] - Unapproved posts count towards forum post count</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15918">PHPBB3-15918</a>] - Ban reason messages show backslash (\) before apostrophe -- ex. (don\'t).</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15919">PHPBB3-15919</a>] - Lint test throws PHP warnings due to node modules folder</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15931">PHPBB3-15931</a>] - Issues in PM report emails</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15954">PHPBB3-15954</a>] - Some calls to include() don't have a safeguard</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15957">PHPBB3-15957</a>] - User preferences show notification method &quot;both&quot; with disabled Jabber in ACP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15959">PHPBB3-15959</a>] - Travis Network Test is Failing for news.cnet.com</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15965">PHPBB3-15965</a>] - Console command to handle thumbnails have files directory hardcoded</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15975">PHPBB3-15975</a>] - Delete or prune an user doesn't remove its entries in the user_notifications table</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15986">PHPBB3-15986</a>] - Add missing language key for posting.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15996">PHPBB3-15996</a>] - Invalid data provider function name in migrator_tool_permission_test</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16006">PHPBB3-16006</a>] - Duplicate form IDs in UCP oauth form</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15884">PHPBB3-15884</a>] - Add memberlist_body_* events</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15889">PHPBB3-15889</a>] - Add core.memberlist_modify_memberrow_sql</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15890">PHPBB3-15890</a>] - Add core.memberlist_modify_viewprofile_sql</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15891">PHPBB3-15891</a>] - Add core.memberlist_modify_view_profile_template_vars</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15898">PHPBB3-15898</a>] - Add core.ucp_pm_compose_template</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15899">PHPBB3-15899</a>] - Add core.modify_attachment_sql_ary_on_* events</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15901">PHPBB3-15901</a>] - Add mcp_post_* template events</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15910">PHPBB3-15910</a>] - Pass object arguments by reference implicitly</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15914">PHPBB3-15914</a>] - Add core.modify_memberlist_viewprofile_group_sql and core.modify_memberlist_viewprofile_group_data</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15915">PHPBB3-15915</a>] - Add template events to posting_attach_body.html</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15924">PHPBB3-15924</a>] - Move from precise to trusty builds</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15926">PHPBB3-15926</a>] - Deny installs on PHP &gt;= 7.3@dev - Increase min. req. to 5.4.7</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15928">PHPBB3-15928</a>] - Remove support for backup download</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15939">PHPBB3-15939</a>] - Pagination docblocks</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15941">PHPBB3-15941</a>] - Replace MAX SQL in functions_posting.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15942">PHPBB3-15942</a>] - Array to string conversion when permanently deleting a post</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15948">PHPBB3-15948</a>] - Add core.mcp_change_topic_type_after/before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15949">PHPBB3-15949</a>] - [Template] - ucp_profile_signature_posting_editor_options_prepend</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15950">PHPBB3-15950</a>] - Add SQL transactions to mcp_main.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15960">PHPBB3-15960</a>] - Add SQL transactions to functions_admin.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15970">PHPBB3-15970</a>] - Add core.message_admin_form_submit_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15972">PHPBB3-15972</a>] - Add core.markread_after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15992">PHPBB3-15992</a>] - Fix breadcrumb schema</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15995">PHPBB3-15995</a>] - Add core.memberlist_modify_sort_pagination_params</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15997">PHPBB3-15997</a>] - Increase webdriver timeout for UI tests</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16001">PHPBB3-16001</a>] - Append data to the OAuth's redirect URL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16009">PHPBB3-16009</a>] - Display OAuth login's buttons in a row.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16010">PHPBB3-16010</a>] - Automatically check order of events in events.md file</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16018">PHPBB3-16018</a>] - Update composer and dependencies for 3.2.6</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-16020">PHPBB3-16020</a>] - Fix placement of event viewforum_body_topic_author_username_append</li>
+ </ul>
+ <h4>New Feature</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15944">PHPBB3-15944</a>] - Add core.posting_modify_quote_attributes</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15921">PHPBB3-15921</a>] - Update TextFormatter to 1.3.2</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15953">PHPBB3-15953</a>] - pm reported missing border color</li>
+ </ul>
+
+ <a name="v325rc1"></a><h3>Changes since 3.2.5-RC1</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15888">PHPBB3-15888</a>] - Update link to user guide</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15893">PHPBB3-15893</a>] - Call to undefined $user in phpbb_format_quote() when BBCodes are disabled</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15911">PHPBB3-15911</a>] - SQL general error on DB update from 3.0 branch</li>
+ </ul>
+ <h4>Hardening</h4>
+ <ul>
+ <li>[SECURITY-229] - Update to latest version of jQuery 1.x and add ajax prefilter</li>
+ </ul>
+
+ <a name="v324"></a><h3>Changes since 3.2.4</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15665">PHPBB3-15665</a>] - MSSQL implementation crashes when upload directory &gt; 2GB</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15858">PHPBB3-15858</a>] - Unapproved User(s) appearing as Guest in Team Page.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15867">PHPBB3-15867</a>] - Contact form without class</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15871">PHPBB3-15871</a>] - PHP 7.1+ warning in ACP extensions module</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15875">PHPBB3-15875</a>] - BBCode parsing error (PHP fatal error)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15881">PHPBB3-15881</a>] - Login keys are not reset after password update in some cases</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15542">PHPBB3-15542</a>] - Some JS files being called without assets version</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15859">PHPBB3-15859</a>] - Modify the topic ordering if needed</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15863">PHPBB3-15863</a>] - Modify the topic sort ordering from the beginning</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15870">PHPBB3-15870</a>] - Modify the forum ID to handle the correct display of viewtopic if needed</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15872">PHPBB3-15872</a>] - Add show_user_activity to display_user_activity_modify_actives</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15873">PHPBB3-15873</a>] - Event to add/modify MCP report details template data.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15878">PHPBB3-15878</a>] - Add attachment to core.ucp_pm_view_message</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15879">PHPBB3-15879</a>] - Modify attachment's poster_id for get_submitted_attachment_data</li>
+ </ul>
+
+ <a name="v324rc1"></a><h3>Changes since 3.2.4-RC1</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15860">PHPBB3-15860</a>] - Backups filenames arent saved in the expected format</li>
+ </ul>
+ <h4>Security Issue</h4>
+ <ul>
+ <li>[SECURITY-227] - Phar deserialization in ACP leads to Remote Code Execution</li>
+ </ul>
+
+ <a name="v323"></a><h3>Changes since 3.2.3</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11453">PHPBB3-11453</a>] - phpbb_notification_method_email unnecessarily loads data of banned users.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12430">PHPBB3-12430</a>] - hilit not removed from URL after search</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13043">PHPBB3-13043</a>] - Fixing HTML5 conformance</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13128">PHPBB3-13128</a>] - sql_query_info, max_matches and charset_type removed from sphinxsearch 2.2.2-beta</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14812">PHPBB3-14812</a>] - No shadow pruning with system cron enabled</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15329">PHPBB3-15329</a>] - View/Edit drafts contain underlying HTML coding</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15420">PHPBB3-15420</a>] - Quote Notification Sent for Edited Posts by Non Author</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15494">PHPBB3-15494</a>] - Users can only be removed once from newly registered users</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15507">PHPBB3-15507</a>] - PHP 7.2 Warning</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15544">PHPBB3-15544</a>] - Migrations don't delete modules in every case</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15552">PHPBB3-15552</a>] - Private Message (PM) &quot;find a member&quot; button &quot;select marked&quot; not working</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15557">PHPBB3-15557</a>] - Used composer version has bug with PHP 7.2</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15583">PHPBB3-15583</a>] - Updating session time in AJAX request ignores 60 seconds check</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15593">PHPBB3-15593</a>] - Disabling &quot;print view&quot; (permission or private messages settings) actually doesn't block the feature</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15600">PHPBB3-15600</a>] - Ban reasons are not escaped in mcp_ban.html template</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15604">PHPBB3-15604</a>] - Appveyor builds unable to download and unpack MSSQL drivers</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15606">PHPBB3-15606</a>] - Hide/Reveal 'Profile' Link According to Permission Setting</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15607">PHPBB3-15607</a>] - Board's cookies not deleted on disabled board</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15611">PHPBB3-15611</a>] - Prosilver mobile layout: Misaligned text in user profile</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15612">PHPBB3-15612</a>] - PHP warning with MSSQL on PHP 7.2</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15616">PHPBB3-15616</a>] - Jumpbox doesn't display in the login forum page (access to forum with password)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15618">PHPBB3-15618</a>] - Team page link always appears when you are logout (anonymous), even if you don't have the permission (unlike memberlist link)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15619">PHPBB3-15619</a>] - Legends of custom profile fields could be hidden in memberlist, when viewing an user group</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15620">PHPBB3-15620</a>] - Avatar gallery can be unusable on multilingual boards, unless people use the board default language</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15622">PHPBB3-15622</a>] - Quoting messages (while viewing one, not inside post editor) can return a wrong chain</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15637">PHPBB3-15637</a>] - Event list only has first line of PHP event description</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15651">PHPBB3-15651</a>] - Migration 'if' conditions only support booleans</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15659">PHPBB3-15659</a>] - retrieve_block_vars generates warnings in PHP 7.2</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15666">PHPBB3-15666</a>] - Language system is not fully supported in Twig</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15670">PHPBB3-15670</a>] - Group forum permission: Can see forum gives NO SQL ERROR</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15673">PHPBB3-15673</a>] - Duplicated links for (ACP,MCP,FAQ) in QuickLinks and main nav bar</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15680">PHPBB3-15680</a>] - INSTALL.html should point to 3.2 documentation instead of 3.1</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15693">PHPBB3-15693</a>] - gen_rand_string() don't return a string with the expected length</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15695">PHPBB3-15695</a>] - gen_rand_string can return less characters than expected</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15700">PHPBB3-15700</a>] - {T_THEME_LANG_NAME} template variable could be wrong when log off</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15705">PHPBB3-15705</a>] - phpbbcli language parse error in PHP &lt;= 5.5.38</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15716">PHPBB3-15716</a>] - OAuth link information remains after deleting a user, causes fatal exception</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15717">PHPBB3-15717</a>] - Old email address missing from log when user changes email address</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15723">PHPBB3-15723</a>] - gen_rand_string() return wrong number or characters sometimes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15733">PHPBB3-15733</a>] - Remove unused variables related to deprecated flood control</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15742">PHPBB3-15742</a>] - Remove get_magic_quotes_gpc from type_cast_helper</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15751">PHPBB3-15751</a>] - Warning when update with CLI</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15755">PHPBB3-15755</a>] - Broken events in /phpbb/attachment/delete.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15758">PHPBB3-15758</a>] - String INSECURE_REDIRECT is not shown translated</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15770">PHPBB3-15770</a>] - Sphinx assertion fails on unread posts when exceeding an offset of 999</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15788">PHPBB3-15788</a>] - Return button from privacy policy shows wrong text</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15817">PHPBB3-15817</a>] - Unable to install in Oracle 11R2 Express</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15824">PHPBB3-15824</a>] - UI test framework Broken for extensions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15830">PHPBB3-15830</a>] - 'core.modify_notification_message' event is useless</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15849">PHPBB3-15849</a>] - PHP 7.2 compat for bitfield class</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15852">PHPBB3-15852</a>] - IPv6 address not working in Whois</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10432">PHPBB3-10432</a>] - Don't require username when user forgets password</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11500">PHPBB3-11500</a>] - on Custom profile fields the field_ident field lacks name</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12739">PHPBB3-12739</a>] - Make the font color palette in ACP same as Prosilver</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14656">PHPBB3-14656</a>] - Add a list-unsubscribe header with the unsubscribe URL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14990">PHPBB3-14990</a>] - Add core event to the Twig environment</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15554">PHPBB3-15554</a>] - Simple footer after load js</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15579">PHPBB3-15579</a>] - Add core.ucp_main_front_modify_sql and core.ucp_main_front_modify_template_vars</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15590">PHPBB3-15590</a>] - Add PHP events after adding, updating and deleting BBCodes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15628">PHPBB3-15628</a>] - newtopic_notify.txt does not have directly link to the new topic</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15638">PHPBB3-15638</a>] - Add word-break for overflowing.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15642">PHPBB3-15642</a>] - String to be used in HTML element contains &quot;&gt;&quot;</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15656">PHPBB3-15656</a>] - Add &quot;View post&quot; link in the mod logs on the ACP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15661">PHPBB3-15661</a>] - Add core.viewtopic_modify_poll_ajax_data</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15662">PHPBB3-15662</a>] - Add $this-&gt;template to core.modify_notification_message</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15668">PHPBB3-15668</a>] - Change JQuery .load(fn) event to .on('load',fn)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15674">PHPBB3-15674</a>] - Edit language lines in file en\acp\profile.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15683">PHPBB3-15683</a>] - Better error message when commit message has CRLF</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15696">PHPBB3-15696</a>] - 'if' module tool should support calling other tools</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15706">PHPBB3-15706</a>] - [Template] - mcp_post_report_buttons_top_*</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15719">PHPBB3-15719</a>] - Add core event on viewtopic post_list query for query modification</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15726">PHPBB3-15726</a>] - Implement selective purge in APCu cache driver</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15735">PHPBB3-15735</a>] - [Template] - *_content_after (for posts)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15737">PHPBB3-15737</a>] - [PHP] - Add $user_rows to core.delete_user_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15762">PHPBB3-15762</a>] - Topics per page Conformity</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15768">PHPBB3-15768</a>] - Add a license to a repository</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15771">PHPBB3-15771</a>] - Q&amp;A configuration instructions not optilmal</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15799">PHPBB3-15799</a>] - Find correct poll for voting animation</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15803">PHPBB3-15803</a>] - Add core events on ucp_pm_compose for additional message list actions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15819">PHPBB3-15819</a>] - Add core event to functions_posting to modify notifications</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15825">PHPBB3-15825</a>] - Add core.acp_manage_forums_move_content_sql_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15826">PHPBB3-15826</a>] - Add core.mcp_main_fork_sql_after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15827">PHPBB3-15827</a>] - [Template] - Add *_username_{prepend/append} template events</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15831">PHPBB3-15831</a>] - ACP signature update should trigger event</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15832">PHPBB3-15832</a>] - ACP avatar update event</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15833">PHPBB3-15833</a>] - ACP and UCP avatar delete events</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15837">PHPBB3-15837</a>] - Add core.ucp_register_welcome_email_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15838">PHPBB3-15838</a>] - Add core.ucp_register_register_after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15839">PHPBB3-15839</a>] - Add core.ucp_login_link_template_after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15841">PHPBB3-15841</a>] - Allow postrow pm link to be modified by event</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15848">PHPBB3-15848</a>] - Up-version plupload to v2.3.6 to fix image rotation issues</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15850">PHPBB3-15850</a>] - Use standard SQL cache for notification types</li>
+ </ul>
+ <h4>New Feature</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15792">PHPBB3-15792</a>] - [Template] - confirm_delete_body_delete_reason_before</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15596">PHPBB3-15596</a>] - Migrate from data-vocabulary.org to schema.org</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15621">PHPBB3-15621</a>] - Some graphical inconsistencies with colored users groups in posting, UCP and MCP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15701">PHPBB3-15701</a>] - {SIGNATURE} variable is added in mcp_post.html but not defined in MCP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15809">PHPBB3-15809</a>] - Allow events with twig syntax</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15857">PHPBB3-15857</a>] - Add rubencm to CREDITS.txt</li>
+ </ul>
+
+ <a name="v323rc2"></a><h3>Changes since 3.2.3-RC2</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15504">PHPBB3-15504</a>] - phpBB Debug warning in 3.2.2</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15740">PHPBB3-15740</a>] - Terms &amp; Privavy hardcoded</li>
+ </ul>
+
+ <a name="v323rc1"></a><h3>Changes since 3.2.3-RC1</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11847">PHPBB3-11847</a>] - auth_provider_oauth migration must depend on at least one migration that ensures the module tables exist as expected</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15548">PHPBB3-15548</a>] - Dead link in ACP_COOKIE_SETTINGS_EXPLAIN language entry</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15586">PHPBB3-15586</a>] - When creating a module without the modes array a missing 'module_langname' index is accessed</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15613">PHPBB3-15613</a>] - Notification dropdown said to be not RTL compliant</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15627">PHPBB3-15627</a>] - Improve wording of YES_ACCURATE_PM_BUTTON + EXPLAIN</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15678">PHPBB3-15678</a>] - PHP warning in filesystem.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15731">PHPBB3-15731</a>] - Fix acp_search language parameters when deleting index</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15630">PHPBB3-15630</a>] - Change &lt;b&gt; to &lt;strong&gt; </li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15633">PHPBB3-15633</a>] - Remove extra space in GROUP_MAX_RECIPIENTS_EXPLAIN</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15657">PHPBB3-15657</a>] - Add core.mcp_queue_get_posts_for_posts_query_before and core.mcp_queue_get_posts_modify_post_row</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15676">PHPBB3-15676</a>] - Display privacy policy &amp; terms of use more prominently</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15677">PHPBB3-15677</a>] - Updated dependencies for 3.2.3-RC2</li>
+ </ul>
+
+ <a name="v322"></a><h3>Changes since 3.2.2</h3>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14936">PHPBB3-14936</a>] - Missing language variable INST_ERR_DB</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15491">PHPBB3-15491</a>] - Outdated linkes in installer support page</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15492">PHPBB3-15492</a>] - Permissions role combobox does not work in RTL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15500">PHPBB3-15500</a>] - Docs outdated for new PHP 5.4.7 requirement</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15502">PHPBB3-15502</a>] - Errors in migrations in 3.2.2 release</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15506">PHPBB3-15506</a>] - Previewing new post empties attachment list of all but first attachment</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15512">PHPBB3-15512</a>] - Avoid reparsing non-existent polls</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15513">PHPBB3-15513</a>] - Signature edit in acp gives error</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15520">PHPBB3-15520</a>] - DbDriver-&gt;sql_build_query cant cope with sub-selects</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15522">PHPBB3-15522</a>] - Allow multiple color palettes per page</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15523">PHPBB3-15523</a>] - AdBlocker may cause JS error when using CookieConsent</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15525">PHPBB3-15525</a>] - composer.json License is Invalid/Deprecated</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15526">PHPBB3-15526</a>] - Cast bbcode ID to integer</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15527">PHPBB3-15527</a>] - Cannot interpret the BBCode definition</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15532">PHPBB3-15532</a>] - Update pull request template</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15533">PHPBB3-15533</a>] - Typo in viewtopic_topic_tools.html</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15558">PHPBB3-15558</a>] - phpbb\report\report_handler_post.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15559">PHPBB3-15559</a>] - phpbb\report\report_handler_pm.php:56</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15595">PHPBB3-15595</a>] - Migration Module Exists Tool Broken</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12579">PHPBB3-12579</a>] - Add BUTTON_ language strings for post &amp; PM buttons</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15495">PHPBB3-15495</a>] - Use transactions for queries in move_forum</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15499">PHPBB3-15499</a>] - Drop HHVM support</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15510">PHPBB3-15510</a>] - Link Orphan attachments in ACP&gt;General to Orphaned attachments page </li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15514">PHPBB3-15514</a>] - Improve accessibility by adding vital info from explanation to a title</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15518">PHPBB3-15518</a>] - Do not attempt to accurately determine whether posters can read private messages in viewtopic</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15528">PHPBB3-15528</a>] - Display the version of the installed styles in acp</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15529">PHPBB3-15529</a>] - Color groups in ACP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15531">PHPBB3-15531</a>] - Log malformed BBCodes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15534">PHPBB3-15534</a>] - Outdated ACP extensions database link for phpBB 3.2</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15535">PHPBB3-15535</a>] - Add S_FIRST_POST to postrow on viewtopic</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15537">PHPBB3-15537</a>] - Add events core.search_(native|mysql|postgres|sphinx)_index_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15547">PHPBB3-15547</a>] - Add file object to event core.avatar_driver_upload_move_file_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15561">PHPBB3-15561</a>] - Add core events for adding columns to MySQL and Postgres search backends</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15568">PHPBB3-15568</a>] - Update depencies to latest versions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15569">PHPBB3-15569</a>] - Adjust update instructions to suggest file replacement method</li>
+ </ul>
+ <h4>New Feature</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15398">PHPBB3-15398</a>] - Add event to oauth login after ID check</li>
+ </ul>
+ <h4>Security Issue</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15570">PHPBB3-15570</a>] - Extension version check is restricted to TLS 1.0</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15466">PHPBB3-15466</a>] - Move Nils in CREDITS.txt</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15516">PHPBB3-15516</a>] - Add instructions on running UI tests</li>
+ </ul>
+
+ <a name="v321"></a><h3>Changes since 3.2.1</h3>
+ <h4>Security Issue</h4>
+ <ul>
+ <li>[SECURITY-211] - URLs with javascript scheme should not be made clickable</li>
+ </ul>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7845">PHPBB3-7845</a>] - Error on posting local image when script path is empty</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13214">PHPBB3-13214</a>] - Contact us page textarea looks narrow in responsive mode</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14629">PHPBB3-14629</a>] - acp global quick reply will not enable quick reply correctly</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14857">PHPBB3-14857</a>] - ordinal suffix in dateformat is not handled in translations</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15041">PHPBB3-15041</a>] - Cannot delete Orphaned Attachments when large number of attachments</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15060">PHPBB3-15060</a>] - Online user list fails on notifications</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15089">PHPBB3-15089</a>] - Enable/Disable settings backwards for Cookie Secure</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15133">PHPBB3-15133</a>] - Fast image size library sometimes returns no size or invalid sizes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15149">PHPBB3-15149</a>] - Unexpected Ctrl+Enter behavior on reply</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15171">PHPBB3-15171</a>] - Confusing bitfield values</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15172">PHPBB3-15172</a>] - $request-&gt;server('server_port') is returning wrong port</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15174">PHPBB3-15174</a>] - Unable to purge cache (ext &amp; acp)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15195">PHPBB3-15195</a>] - Code direction in print view is not defined as &quot;ltr&quot;</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15201">PHPBB3-15201</a>] - Removing style sets user_style to 0</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15224">PHPBB3-15224</a>] - Advanced search in &quot;message text only&quot; crashes with SQL error when using Mysql fulltext search index</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15245">PHPBB3-15245</a>] - Relative URLs in atom feeds broken when accessing via app.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15262">PHPBB3-15262</a>] - WebFontConfig google families script issue in 3.2.1</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15266">PHPBB3-15266</a>] - Content visibility events do not allow what they describe</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15273">PHPBB3-15273</a>] - 'COOKIE_PATH_EXPLAIN' does not make sense</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15285">PHPBB3-15285</a>] - Travis tests are failing due to trusty changes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15292">PHPBB3-15292</a>] - Retina imageset is blurry when displayed in Chrome browser</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15297">PHPBB3-15297</a>] - Current date in board index is broken into lines in RTL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15298">PHPBB3-15298</a>] - Errors being suppressed in cli</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15303">PHPBB3-15303</a>] - Typo in memcached driver</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15306">PHPBB3-15306</a>] - Error and missing information in core.acp_users_profile_validate event</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15309">PHPBB3-15309</a>] - Improved fix for pagination layout in tables</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15314">PHPBB3-15314</a>] - Wrong class constructor definition for convertor component</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15319">PHPBB3-15319</a>] - Database update v310\style_update_p2 fails to drop sequences</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15320">PHPBB3-15320</a>] - Redis cache does not save keys with expiration date 0 (no expiration)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15322">PHPBB3-15322</a>] - Wrong return Return-Path in emails</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15331">PHPBB3-15331</a>] - Gravatars cannot be overridden</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15332">PHPBB3-15332</a>] - Dark background is always removed after confirm popup</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15333">PHPBB3-15333</a>] - Callback isn't called when confirm dialog is canceled</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15339">PHPBB3-15339</a>] - Missing acp_send_statistics -&gt; Upgrading to 3.2.0 fails for phpBB 3.0.5</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15346">PHPBB3-15346</a>] - The installer tries to enable all extensions even if they are not enableable</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15347">PHPBB3-15347</a>] - Password updater in cron generates invalid postgres SQL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15349">PHPBB3-15349</a>] - Cli doesn't check if an extension is enableable before enable it</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15350">PHPBB3-15350</a>] - Links to Plural rules are outdated</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15351">PHPBB3-15351</a>] - Confirm box function does not work with symlink on server config</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15353">PHPBB3-15353</a>] - Invalid HTML in ACP board settings</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15355">PHPBB3-15355</a>] - Empty version field in versioncheck when using the latest version</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15356">PHPBB3-15356</a>] - Avatar remote upload doesn't work</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15361">PHPBB3-15361</a>] - Topic / Forum Icons Look Withered (on Safari)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15362">PHPBB3-15362</a>] - Excessive value for {NOTIFICATION_TYPES_COLS}</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15365">PHPBB3-15365</a>] - Fix invalidating OPcache</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15367">PHPBB3-15367</a>] - Sphinx search backend doesn't escape special characters</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15368">PHPBB3-15368</a>] - Schema upgrade fails in 3.2.1 when using SQL Server</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15379">PHPBB3-15379</a>] - Reparser cron will always run</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15381">PHPBB3-15381</a>] - L_CONTACT_US_ENABLE_EXPLAIN should specify that &quot;Enable board-wide emails&quot; is also needed for it to work</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15390">PHPBB3-15390</a>] - Admin permissions role tooltip popup has vertical bar running through it.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15396">PHPBB3-15396</a>] - revert_schema() steps not executed in correct order</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15401">PHPBB3-15401</a>] - Use separate constant for memcached driver config</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15419">PHPBB3-15419</a>] - Sphinx does not search UTF keywords in delta index</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15423">PHPBB3-15423</a>] - Wrong title for topic's &quot;Unappproved posts&quot; icon</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15432">PHPBB3-15432</a>] - Don't remove dark background if fadedark is false</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15433">PHPBB3-15433</a>] - phpbbcli can enable non-existent extension</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15445">PHPBB3-15445</a>] - Git Contribution Guidelines in README.md is outdated</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15464">PHPBB3-15464</a>] - Can't reparse [IMG] - in uppercase</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15475">PHPBB3-15475</a>] - Restore Travis PR commit message validation</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15478">PHPBB3-15478</a>] - core.js $loadingIndicator JavaScript errors</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15489">PHPBB3-15489</a>] - Wrong footer text on forum of type &quot;category&quot;</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15496">PHPBB3-15496</a>] - SQL Error in PostgreSQL Fulltext search when results displayed as topics</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15497">PHPBB3-15497</a>] - Declaration of admin_activate_user::create_insert_array not compatible with base</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15498">PHPBB3-15498</a>] - confirm_box() adds duplicate strings to URLs in extensions</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-7488">PHPBB3-7488</a>] - View Only - Categories: No Message</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9819">PHPBB3-9819</a>] - Move functions definitions out of mcp.php and includes/mcp/mcp_*.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12291">PHPBB3-12291</a>] - Allow extensions to use custom topic icons</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12939">PHPBB3-12939</a>] - Drop support for IE &lt;11 on January 2016</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14677">PHPBB3-14677</a>] - Extension update check is not very colorblind / colourblind friendly.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14820">PHPBB3-14820</a>] - Style Version Missing</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14919">PHPBB3-14919</a>] - Inconsistent use of globals vs class elements in acp_extensions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14927">PHPBB3-14927</a>] - event core.user_add_modify_data</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14944">PHPBB3-14944</a>] - Add possibility to search for template loop indexes by key</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14950">PHPBB3-14950</a>] - Add possibility to delete a template block with alter_block_array</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14979">PHPBB3-14979</a>] - Remove underline from unread icon</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14994">PHPBB3-14994</a>] - Refactor template-&gt;assign_block_var to be consistent with alter_block_array</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14995">PHPBB3-14995</a>] - Add ACP template events acp_ext_list_*_name_after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15111">PHPBB3-15111</a>] - Fix the typo in ucp_pm_view_messsage</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15134">PHPBB3-15134</a>] - Avatar upload driver should use filesystem service</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15247">PHPBB3-15247</a>] - Add driver for APCu v5.x cache</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15267">PHPBB3-15267</a>] - Hide birthday block if the user cannot view profile</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15291">PHPBB3-15291</a>] - Allow short array notation in event declarations</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15293">PHPBB3-15293</a>] - Prevent skipping file changes in automatic updater</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15307">PHPBB3-15307</a>] - Allow extensions to add custom modes to acp_users module</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15328">PHPBB3-15328</a>] - Disable email/jabber checkbox if notification method isn't supported</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15340">PHPBB3-15340</a>] - Update to plupload 2.3.1, stable for one year</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15352">PHPBB3-15352</a>] - Add text to clarify forum descriptions won't display on categories</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15374">PHPBB3-15374</a>] - Add core event to modify page title in viewforum.php</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15384">PHPBB3-15384</a>] - Add linebreaks to SMTP configuration option explanations</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15385">PHPBB3-15385</a>] - nginx sample config: www redirection, security regex</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15387">PHPBB3-15387</a>] - prosilver: vertical bars on forum rows on index page not full height</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15389">PHPBB3-15389</a>] - Simplify migration between event names</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15391">PHPBB3-15391</a>] - Remove not needed image rendering from topic/forum images</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15394">PHPBB3-15394</a>] - Add $user_cache and $post_edit_list to core.viewtopic_modify_post_row</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15408">PHPBB3-15408</a>] - Reject duplicate BBCodes in ACP</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15409">PHPBB3-15409</a>] - Add u_action to core.acp_users_overview_run_quicktool</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15442">PHPBB3-15442</a>] - Allow unsafe HTML in bbcode.html</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15444">PHPBB3-15444</a>] - Merge duplicate BBCodes via a migration</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15446">PHPBB3-15446</a>] - Add event core.acp_profile_action</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15447">PHPBB3-15447</a>] - Add event core.acp_profile_modify_profile_row</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15451">PHPBB3-15451</a>] - [EVENT] - mcp_topic_postrow_attachments_before/after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15452">PHPBB3-15452</a>] - [EVENT] - mcp_topic_postrow_post_before</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15453">PHPBB3-15453</a>] - Add event in acp_language after delete language</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15454">PHPBB3-15454</a>] - event - mcp_queue_approve_details_template</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15470">PHPBB3-15470</a>] - attachment boxes need there own font-size</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15471">PHPBB3-15471</a>] - Add core events to ACP when pruning a forum</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15476">PHPBB3-15476</a>] - Add core event before search rows are edited</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15485">PHPBB3-15485</a>] - Add template event to forumlist_body &gt; forum images</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15486">PHPBB3-15486</a>] - Add core event to the function user_add() to modify notifications data</li>
+ </ul>
+ <h4>New Feature</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13344">PHPBB3-13344</a>] - Add new events for logging</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15122">PHPBB3-15122</a>] - Support using memcached instead of memcache</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15372">PHPBB3-15372</a>] - Add a &quot;Can view topics&quot; permission</li>
+ </ul>
+ <h4>Sub-task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13150">PHPBB3-13150</a>] - [Event] - core.phpbb_log_get_topic_auth_sql_after</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15468">PHPBB3-15468</a>] - Add a service to merge duplicate BBCodes</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15179">PHPBB3-15179</a>] - Update 3.2.x dependencies and fix Twig &gt; 1.25 compatibility</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15304">PHPBB3-15304</a>] - Update s9e/text-formatter dependency</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15455">PHPBB3-15455</a>] - Margin discrepancy due to &lt;!-- INCLUDE jumpbox.html --&gt;</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15457">PHPBB3-15457</a>] - Update s9e/text-formatter dependency</li>
+ </ul>
+
<a name="v320"></a><h3>Changes since 3.2.0</h3>
<h4>Bug</h4>
<ul>
@@ -718,6 +1283,53 @@
<li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14265">PHPBB3-14265</a>] - Make all tables available in the container</li>
</ul>
+ <a name="v3111"></a><h3>Changes since 3.1.11</h3>
+
+ <h4>Security Issue</h4>
+ <ul>
+ <li>[SECURITY-211] - URLs with javascript scheme should not be made clickable</li>
+ </ul>
+ <h4>Bug</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-9533">PHPBB3-9533</a>] - phpbb_own_realpath() doesn't always replicate realpath() behaviour</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-12835">PHPBB3-12835</a>] - Jump-box dropdown menu doesn't expand with according to line length in IE8</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13360">PHPBB3-13360</a>] - rename_too_long_indexes migration never deleted the old unique index</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13464">PHPBB3-13464</a>] - problem with drop down options and Arabic letters in chrome</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13574">PHPBB3-13574</a>] - Last post not showing in &quot;Active topics&quot; when Prosilver goes responsive</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15174">PHPBB3-15174</a>] - Unable to purge cache (ext &amp; acp)</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15285">PHPBB3-15285</a>] - Travis tests are failing due to trusty changes</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15303">PHPBB3-15303</a>] - Typo in memcached driver</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15347">PHPBB3-15347</a>] - Password updater in cron generates invalid postgres SQL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15367">PHPBB3-15367</a>] - Sphinx search backend doesn't escape special characters</li>
+ </ul>
+ <h4>Improvement</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10122">PHPBB3-10122</a>] - [list=] - should support &quot;none&quot;, along with CSS2 types</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11063">PHPBB3-11063</a>] - Change version check to SSL</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14820">PHPBB3-14820</a>] - Style Version Missing</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14919">PHPBB3-14919</a>] - Inconsistent use of globals vs class elements in acp_extensions</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14927">PHPBB3-14927</a>] - event core.user_add_modify_data</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14944">PHPBB3-14944</a>] - Add possibility to search for template loop indexes by key</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-14995">PHPBB3-14995</a>] - Add ACP template events acp_ext_list_*_name_after</li>
+ </ul>
+ <h4>New Feature</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13344">PHPBB3-13344</a>] - Add new events for logging</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-15122">PHPBB3-15122</a>] - Support using memcached instead of memcache</li>
+ </ul>
+ <h4>Sub-task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11182">PHPBB3-11182</a>] - Ensure that template files use L_COLON instead of colons.</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-11676">PHPBB3-11676</a>] - generate_text_for_storage on includes/acp/acp_users.php</li>
+ </ul>
+ <h4>Task</h4>
+ <ul>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10758">PHPBB3-10758</a>] - Improve Functional Test Code Coverage</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10791">PHPBB3-10791</a>] - Add a section for extensions to readme.html</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-10792">PHPBB3-10792</a>] - Add a section for 3.0 to 3.1 upgrades to install.html</li>
+ <li>[<a href="http://tracker.phpbb.com/browse/PHPBB3-13874">PHPBB3-13874</a>] - Add master to sami API docs</li>
+ </ul>
+
<a name="v3110"></a><h3>Changes since 3.1.10</h3>
<h4>Bug</h4>
diff --git a/phpBB/docs/CREDITS.txt b/phpBB/docs/CREDITS.txt
index 2df7543ce1..90e9a31127 100644
--- a/phpBB/docs/CREDITS.txt
+++ b/phpBB/docs/CREDITS.txt
@@ -20,15 +20,16 @@
phpBB Project Manager: Marshalrusty (Yuriy Rusko)
-phpBB Product Manager: naderman (Nils Adermann)
-
phpBB Lead Developer: Marc (Marc Alexander)
phpBB Developers: bantu (Andreas Fischer)
CHItA (Máté Bartus)
+ Derky (Derk Ruitenbeek)
Elsensee (Oliver Schramm)
+ Hanakin (Michael Miday)
+ MichaelC (Michael Cullum)
Nicofuma (Tristan Darricau)
- prototech (Cesar Gallegos)
+ rubencm (Rubén Calvo)
For a list of phpBB Team members, please see:
http://www.phpbb.com/about/team/
@@ -41,7 +42,10 @@ https://github.com/phpbb/phpbb/graphs/contributors
phpBB Project Manager: theFinn (James Atkinson) [Founder - 04/2007]
SHS` (Jonathan Stanley)
-phpBB Lead Developer: Acyd Burn (Meik Sievertsen) [09/2005 - 01/2010]
+phpBB Product Manager: naderman (Nils Adermann) [02/2016 - 02/2017]
+
+phpBB Lead Developer: naderman (Nils Adermann) [01/2010 - 02/2016]
+ Acyd Burn (Meik Sievertsen) [09/2005 - 01/2010]
psoTFX (Paul S. Owen) [2001 - 09/2005]
phpBB Developers: A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010]
@@ -61,6 +65,7 @@ phpBB Developers: A_Jelly_Doughnut (Josh Woody) [01/2010 - 11/2010]
kellanved (Henry Sudhof) [04/2007 - 03/2011]
nickvergessen (Joas Schilling)[04/2010 - 12/2015]
Oleg (Oleg Pudeyev) [01/2011 - 05/2013]
+ prototech (Cesar Gallegos) [01/2014 - 12/2016]
rxu (Ruslan Uzdenov) [04/2010 - 12/2012]
TerraFrost (Jim Wigginton) [04/2009 - 01/2011]
ToonArmy (Chris Smith) [06/2008 - 11/2011]
@@ -99,3 +104,6 @@ Text_Diff-0.2.1 http://pear.php.net/package/Text_Diff
MIT licenced:
Symfony2 (c) 2004-2011 Fabien Potencier, https://symfony.com/
Cookie Consent (c) 2015 Silktide Ltd, https://cookieconsent.insites.com
+
+Emoji by:
+Twemoji (c) 2018 Twitter, Inc, https://twemoji.twitter.com/
diff --git a/phpBB/docs/INSTALL.html b/phpBB/docs/INSTALL.html
index 956a384263..4f7f07d3dc 100644
--- a/phpBB/docs/INSTALL.html
+++ b/phpBB/docs/INSTALL.html
@@ -44,7 +44,7 @@
<p>
A basic overview of running phpBB can be found in the accompanying <a href="README.html">README</a> file.
Please ensure you read that document in addition to this! For more detailed information on using, installing,
- updating and converting phpBB you should read <a href="https://www.phpbb.com/support/docs/en/3.1/ug/">the documentation</a>
+ updating and converting phpBB you should read <a href="https://www.phpbb.com/support/docs/en/3.2/ug/">the documentation</a>
available online.
</p>
</div>
@@ -147,7 +147,7 @@
<li>Oracle</li>
</ul>
</li>
- <li><strong>PHP 5.4.0+</strong> with support for the database you intend to use.</li>
+ <li><strong>PHP 5.4.7+</strong> but less than <strong>PHP 7.3</strong> with support for the database you intend to use.</li>
<li>The following PHP modules are required:
<ul>
<li>json</li>
@@ -159,7 +159,6 @@
<li>zlib Compression support</li>
<li>Remote FTP support</li>
<li>XML support</li>
- <li>ImageMagick support</li>
<li>GD Support</li>
</ul>
</li>
@@ -269,11 +268,11 @@
<a name="update_full"></a><h3>4.i. Full package</h3>
- <p>The full package is normally meant for new installations only, but if you want to replace all source files, this package comes in handy.</p>
+ <p>Updating using the full package is the recommended update method for boards without modifications to core phpBB files.</p>
- <p>First, you should make a copy of your existing <code>config.php</code> file; keep it in a safe place! Next, delete all the existing phpBB files, you may want to leave your <code>files/</code>, <code>images/</code> and <code>ext/</code> directories in place, otherwise you will lose your file attachments, uploaded images and get error due to missing extension files. You can leave alternative styles in place too. With this complete, you can upload the new phpBB files (see <a href="#install">New installation</a> for details if necessary). Once complete, copy back your saved <code>config.php</code>, replacing the new one. Another method is to just <strong>replace</strong> the existing files with the files from the full package - though make sure you do <strong>not</strong> overwrite your config.php file.</p>
+ <p>First, you should make a copy of your existing <code>config.php</code> file; keep it in a safe place! Next, delete all the existing phpBB files, you should leave your <code>files/</code>, <code>images/</code> and <code>ext/</code> directories in place, otherwise you will lose your file attachments, uploaded images and get errors due to missing extension files. You can leave alternative styles in place too. With this complete, you can upload the new phpBB files (see <a href="#install">New installation</a> for details if necessary). Once complete, copy back your saved <code>config.php</code>, replacing the new one. Another method is to just <strong>replace</strong> the existing files with the files from the full package - though make sure you do <strong>not</strong> overwrite your config.php file.</p>
- <p>You should now got to <code>/install/app.php/update</code> which will display a warning: <strong>No valid update directory was found, please make sure you uploaded the relevant files</strong>. Beneath that warning you will see a radion button <em>Update database only</em>, just click <strong>Submit</strong>. Depending on your previous version this will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker). If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
+ <p>You should now got to <code>/install/app.php/update</code> which will display a warning: <strong>No valid update directory was found, please make sure you uploaded the relevant files</strong>. Beneath that warning you will see a radio button <em>Update database only</em>, just click <strong>Submit</strong>. Depending on your previous version this will make a number of database changes. You may receive <em>FAILURES</em> during this procedure. They should not be a cause for concern unless you see an actual <em>ERROR</em>, in which case the script will stop (in this case you should seek help via our forums or bug tracker). If you have shell access to your server, you may wish to update via the command line interface. From your board's root, execute the following command: <code>php bin/phpbbcli.php --safe-mode db:migrate</code>.</p>
<p>Once <code>/install/app.php/update</code> has completed, it displays the success message: <strong>The database update was successful</strong>. You may proceed to the Administration Control Panel and then remove the install directory as advised.</p>
@@ -301,7 +300,7 @@
<a name="update_auto"></a><h3>4.iv. Automatic update package</h3>
- <p>This update method is the recommended method for updating. This package detects changed files automatically and merges in changes if needed.</p>
+ <p>This update method is only recommended for installations with modifications to core phpBB files. This package detects changed files automatically and merges in changes if needed.</p>
<p>The automatic update package will update the board from a given version to the latest version. A number of automatic update files are available, and you should choose the one that corresponds to the version of the board that you are currently running. For example, if your current version is <strong>3.2.0</strong>, you need the <code>phpBB-3.2.0_to_3.2.1.zip/tar.bz2</code> file.</p>
diff --git a/phpBB/docs/README.html b/phpBB/docs/README.html
index 7fd80b3c2d..8fb9036ad8 100644
--- a/phpBB/docs/README.html
+++ b/phpBB/docs/README.html
@@ -323,11 +323,11 @@
<div class="content">
- <p>phpBB 3.2.x takes advantage of new features added in PHP 5.4. We recommend that you upgrade to the latest stable release of PHP to run phpBB. The minimum version required is PHP 5.4.0 and the maximum supported version is the latest stable version of PHP.</p>
+ <p>phpBB 3.2.x takes advantage of new features added in PHP 5.4. We recommend that you upgrade to the latest stable release of PHP to run phpBB. The minimum version required is PHP 5.4.7 and the maximum supported version is the latest stable version of PHP.</p>
<p>Please remember that running any application on a development (unstable, e.g. a beta release) version of PHP can lead to strange/unexpected results which may appear to be bugs in the application. Therefore, we recommend you upgrade to the newest stable version of PHP before running phpBB. If you are running a development version of PHP please check any bugs you find on a system running a stable release before submitting.</p>
- <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, PostgreSQL 8.x, Oracle 8 and SQLite 3. Versions of PHP used range from 5.4.x above 5.6.x to 7.0.x without problem.</p>
+ <p>This board has been developed and tested under Linux and Windows (amongst others) running Apache using MySQL 3.23, 4.x, 5.x, MariaDB 5.x, PostgreSQL 8.x, Oracle 8 and SQLite 3. Versions of PHP used range from 5.4.7 above 5.6.x to 7.1.x and 7.2.x without problem.</p>
<a name="phpsec"></a><h3>7.i. Notice on PHP security issues</h3>
diff --git a/phpBB/docs/coding-guidelines.html b/phpBB/docs/coding-guidelines.html
index d90f4d4d32..569ffe680c 100644
--- a/phpBB/docs/coding-guidelines.html
+++ b/phpBB/docs/coding-guidelines.html
@@ -627,7 +627,7 @@ $min = ($i &lt; $j) ? $i : $j;</pre>
<pre>if (isset($forum) &amp;&amp; $forum == 5)</pre>
</div>
- <p>The <code>empty()</code> function is useful if you want to check if a variable is not set or being empty (an empty string, 0 as an integer or string, NULL, false, an empty array or a variable declared, but without a value in a class). Therefore empty should be used in favor of <code>isset($array) &amp;&amp; sizeof($array) &gt; 0</code> - this can be written in a shorter way as <code>!empty($array)</code>.</p>
+ <p>The <code>empty()</code> function is useful if you want to check if a variable is not set or being empty (an empty string, 0 as an integer or string, NULL, false, an empty array or a variable declared, but without a value in a class). Therefore empty should be used in favor of <code>isset($array) &amp;&amp; count($array) &gt; 0</code> - this can be written in a shorter way as <code>!empty($array)</code>.</p>
<h4>Switch statements:</h4>
<p>Switch/case code blocks can get a bit long sometimes. To have some level of notice and being in-line with the opening/closing brace requirement (where they are on the same line for better readability), this also applies to switch/case code blocks and the breaks. An example:</p>
@@ -994,9 +994,9 @@ $sql = $db-&gt;sql_build_query('SELECT', $sql_array);</pre>
<h4>Operations in loop definition: </h4>
<p>Always try to optimize your loops if operations are going on at the comparing part, since this part is executed every time the loop is parsed through. For assignments a descriptive name should be chosen. Example:</p>
- <p class="bad">// On every iteration the sizeof function is called</p>
+ <p class="bad">// On every iteration the count function is called</p>
<div class="codebox"><pre>
-for ($i = 0; $i &lt; sizeof($post_data); $i++)
+for ($i = 0; $i &lt; count($post_data); $i++)
{
do_something();
}</pre>
@@ -1004,7 +1004,7 @@ for ($i = 0; $i &lt; sizeof($post_data); $i++)
<p class="good">// You are able to assign the (not changing) result within the loop itself</p>
<div class="codebox"><pre>
-for ($i = 0, $size = sizeof($post_data); $i &lt; $size; $i++)
+for ($i = 0, $size = count($post_data); $i &lt; $size; $i++)
{
do_something();
}</pre>
diff --git a/phpBB/docs/events.md b/phpBB/docs/events.md
index 6af3f55d21..467b03e8f3 100644
--- a/phpBB/docs/events.md
+++ b/phpBB/docs/events.md
@@ -28,29 +28,29 @@ acp_bbcodes_edit_fieldsets_after
* Since: 3.1.0-a3
* Purpose: Add settings to BBCode add/edit form
-acp_email_group_options_append
+acp_email_find_username_append
===
* Location: adm/style/acp_email.html
* Since: 3.1.7-RC1
-* Purpose: Add content at the end of the group options select box
+* Purpose: Add content at the end of the find username link
-acp_email_group_options_prepend
+acp_email_find_username_prepend
===
* Location: adm/style/acp_email.html
* Since: 3.1.7-RC1
-* Purpose: Add content at the start of the group options select box
+* Purpose: Add content at the start of the find username link
-acp_email_find_username_append
+acp_email_group_options_append
===
* Location: adm/style/acp_email.html
* Since: 3.1.7-RC1
-* Purpose: Add content at the end of the fimd username link
+* Purpose: Add content at the end of the group options select box
-acp_email_find_username_prepend
+acp_email_group_options_prepend
===
* Location: adm/style/acp_email.html
* Since: 3.1.7-RC1
-* Purpose: Add content at the start of the fimd username link
+* Purpose: Add content at the start of the group options select box
acp_email_options_after
===
@@ -160,17 +160,17 @@ acp_forums_rules_settings_prepend
* Since: 3.1.2-RC1
* Purpose: Add settings to forums before rules settings section
-acp_group_options_before
+acp_group_options_after
===
* Location: adm/style/acp_groups.html
* Since: 3.1.0-b4
-* Purpose: Add addtional options to group settings (before GROUP_FOUNDER_MANAGE)
+* Purpose: Add additional options to group settings (after GROUP_RECEIVE_PM)
-acp_group_options_after
+acp_group_options_before
===
* Location: adm/style/acp_groups.html
* Since: 3.1.0-b4
-* Purpose: Add addtional options to group settings (after GROUP_RECEIVE_PM)
+* Purpose: Add additional options to group settings (before GROUP_FOUNDER_MANAGE)
acp_groups_find_username_append
===
@@ -281,29 +281,29 @@ acp_overall_header_stylesheets_after
* Purpose: Add assets after stylesheets within the `<head>` tags in the ACP.
Note that INCLUDECSS will not work with this event.
-acp_permission_forum_copy_src_forum_append
+acp_permission_forum_copy_dest_forum_append
===
* Location: adm/style/permission_forum_copy.html
* Since: 3.1.7-RC1
-* Purpose: Add content after the sourse forum select form
+* Purpose: Add content after the destination forum select form
-acp_permission_forum_copy_src_forum_prepend
+acp_permission_forum_copy_dest_forum_prepend
===
* Location: adm/style/permission_forum_copy.html
* Since: 3.1.7-RC1
-* Purpose: Add content before the sourse forum select form
+* Purpose: Add content before the destination forum select form
-acp_permission_forum_copy_dest_forum_append
+acp_permission_forum_copy_src_forum_append
===
* Location: adm/style/permission_forum_copy.html
* Since: 3.1.7-RC1
-* Purpose: Add content after the destiny forum select form
+* Purpose: Add content after the source forum select form
-acp_permission_forum_copy_dest_forum_prepend
+acp_permission_forum_copy_src_forum_prepend
===
* Location: adm/style/permission_forum_copy.html
* Since: 3.1.7-RC1
-* Purpose: Add content before the destiny forum select form
+* Purpose: Add content before the source forum select form
acp_permissions_add_group_options_append
===
@@ -433,6 +433,13 @@ acp_prune_forums_prepend
* Since: 3.1.7-RC1
* Purpose: Add content before the forum select form label
+acp_prune_forums_settings_append
+===
+* Locations:
+ + adm/style/acp_prune_forums.html
+* Since: 3.2.2-RC1
+* Purpose: Add content after the prune settings
+
acp_prune_users_find_username_append
===
* Locations:
@@ -491,41 +498,6 @@ acp_ranks_list_header_before
* Purpose: Add content after the last header-column (but before the action column)
in the ranks list in the ACP
-acp_styles_list_before
-===
-* Locations:
- + adm/style/acp_styles.html
-* Since: 3.1.7-RC1
-* Purpose: Add content before list of styles
-
-acp_users_mode_add
-===
-* Locations:
- + adm/style/acp_users.html
-* Since: 3.2.2-RC1
-* Purpose: Add extra modes to the ACP user page
-
-acp_users_profile_before
-===
-* Locations:
- + adm/style/acp_users_profile.html
-* Since: 3.1.4-RC1
-* Purpose: Add content before the profile details when editing a user in the ACP
-
-acp_users_profile_after
-===
-* Locations:
- + adm/style/acp_users_profile.html
-* Since: 3.1.4-RC1
-* Purpose: Add content after the profile details but before the custom profile fields when editing a user in the ACP
-
-acp_users_profile_custom_after
-===
-* Locations:
- + adm/style/acp_users_profile.html
-* Since: 3.1.4-RC1
-* Purpose: Add content after the the custom profile fields when editing a user in the ACP
-
acp_simple_footer_after
===
* Location: adm/style/simple_footer.html
@@ -551,6 +523,20 @@ acp_simple_header_stylesheets_after
* Purpose: Add assets after stylesheets within the `<head>` tags in the simple header
of the ACP. Note that INCLUDECSS will not work with this event.
+acp_styles_list_before
+===
+* Locations:
+ + adm/style/acp_styles.html
+* Since: 3.1.7-RC1
+* Purpose: Add content before list of styles
+
+acp_users_mode_add
+===
+* Locations:
+ + adm/style/acp_users.html
+* Since: 3.2.2-RC1
+* Purpose: Add extra modes to the ACP user page
+
acp_users_overview_options_append
===
* Location: adm/style/acp_users_overview.html
@@ -563,12 +549,6 @@ acp_users_prefs_append
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the bottom of ACP users prefs settings
-acp_users_prefs_prepend
-===
-* Location: adm/style/acp_users_prefs.html
-* Since: 3.1.0-b3
-* Purpose: Add user options fieldset to the top of ACP users prefs settings
-
acp_users_prefs_personal_append
===
* Location: adm/style/acp_users_prefs.html
@@ -593,6 +573,12 @@ acp_users_prefs_post_prepend
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the top of ACP users post prefs settings
+acp_users_prefs_prepend
+===
+* Location: adm/style/acp_users_prefs.html
+* Since: 3.1.0-b3
+* Purpose: Add user options fieldset to the top of ACP users prefs settings
+
acp_users_prefs_view_append
===
* Location: adm/style/acp_users_prefs.html
@@ -605,6 +591,27 @@ acp_users_prefs_view_prepend
* Since: 3.1.0-b3
* Purpose: Add user options fieldset to the top of ACP users view prefs settings
+acp_users_profile_after
+===
+* Locations:
+ + adm/style/acp_users_profile.html
+* Since: 3.1.4-RC1
+* Purpose: Add content after the profile details but before the custom profile fields when editing a user in the ACP
+
+acp_users_profile_before
+===
+* Locations:
+ + adm/style/acp_users_profile.html
+* Since: 3.1.4-RC1
+* Purpose: Add content before the profile details when editing a user in the ACP
+
+acp_users_profile_custom_after
+===
+* Locations:
+ + adm/style/acp_users_profile.html
+* Since: 3.1.4-RC1
+* Purpose: Add content after the the custom profile fields when editing a user in the ACP
+
acp_users_select_group_after
===
* Location: adm/style/acp_users.html
@@ -645,6 +652,13 @@ attachment_file_prepend
* Since: 3.1.6-RC1
* Purpose: Add custom attachment types displaying to the top of attachment block.
+confirm_delete_body_delete_reason_before
+===
+* Locations:
+ + styles/prosilver/template/confirm_delete_body.html
+* Since: 3.2.4-RC1
+* Purpose: Add custom text to the confirmation of a post that is deleted.
+
forumlist_body_category_header_after
===
* Locations:
@@ -673,6 +687,34 @@ forumlist_body_category_header_row_prepend
* Since: 3.1.5-RC1
* Purpose: Add content before the header row of the category on the forum list.
+forumlist_body_forum_image_after
+===
+* Locations:
+ + styles/prosilver/template/forumlist_body.html
+* Since: 3.2.2-RC1
+* Purpose: Add content after the forum image on the forum list.
+
+forumlist_body_forum_image_append
+===
+* Locations:
+ + styles/prosilver/template/forumlist_body.html
+* Since: 3.2.2-RC1
+* Purpose: Add content at the start of the forum image on the forum list.
+
+forumlist_body_forum_image_before
+===
+* Locations:
+ + styles/prosilver/template/forumlist_body.html
+* Since: 3.2.2-RC1
+* Purpose: Add content before the forum image on the forum list.
+
+forumlist_body_forum_image_prepend
+===
+* Locations:
+ + styles/prosilver/template/forumlist_body.html
+* Since: 3.2.2-RC1
+* Purpose: Add content at the end of the forum image on the forum list.
+
forumlist_body_forum_row_after
===
* Locations:
@@ -708,6 +750,27 @@ forumlist_body_last_post_title_prepend
* Since: 3.1.0-a1
* Purpose: Add content before the post title of the latest post in a forum on the forum list.
+forumlist_body_last_poster_username_append
+===
+* Locations:
+ + styles/prosilver/template/forumlist_body.html
+* Since: 3.2.4-RC1
+* Purpose: Append information to last poster username of member
+
+forumlist_body_last_poster_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/forumlist_body.html
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to last poster username of member
+
+forumlist_body_last_row_after
+===
+* Locations:
+ + styles/prosilver/template/forumlist_body.html
+* Since: 3.1.0-b2
+* Purpose: Add content after the very last row of the forum list.
+
forumlist_body_subforum_link_append
===
* Locations:
@@ -736,13 +799,6 @@ forumlist_body_subforums_before
* Since: 3.1.0-a4
* Purpose: Add content before the list of subforums (if any) for each forum on the forum list.
-forumlist_body_last_row_after
-===
-* Locations:
- + styles/prosilver/template/forumlist_body.html
-* Since: 3.1.0-b2
-* Purpose: Add content after the very last row of the forum list.
-
index_body_birthday_block_before
===
* Locations:
@@ -876,19 +932,19 @@ mcp_forum_actions_before
* Since: 3.1.11-RC1
* Purpose: Add some information before actions fieldset
-mcp_forum_topic_title_before
+mcp_forum_topic_title_after
===
* Locations:
+ styles/prosilver/template/mcp_forum.html
* Since: 3.1.6-RC1
-* Purpose: Add some information before the topic title
+* Purpose: Add some information after the topic title
-mcp_forum_topic_title_after
+mcp_forum_topic_title_before
===
* Locations:
+ styles/prosilver/template/mcp_forum.html
* Since: 3.1.6-RC1
-* Purpose: Add some information after the topic title
+* Purpose: Add some information before the topic title
mcp_front_latest_logs_after
===
@@ -932,6 +988,20 @@ mcp_move_before
* Since: 3.1.10-RC1
* Purpose: Add content before move topic/post form
+mcp_move_destination_forum_after
+===
+* Locations:
+ + styles/prosilver/template/mcp_move.html
+* Since: 3.2.8-RC1
+* Purpose: Add content after the destination select element in the move topic/post form
+
+mcp_move_destination_forum_before
+===
+* Locations:
+ + styles/prosilver/template/mcp_move.html
+* Since: 3.2.8-RC1
+* Purpose: Add content before the destination select element in the move topic/post form
+
mcp_post_additional_options
===
* Locations:
@@ -939,6 +1009,34 @@ mcp_post_additional_options
* Since: 3.1.5-RC1
* Purpose: Add content within the list of post moderation actions
+mcp_post_report_buttons_top_after
+===
+* Locations:
+ + styles/prosilver/template/mcp_post.html
+* Since: 3.2.4-RC1
+* Purpose: Add content after report buttons
+
+mcp_post_report_buttons_top_before
+===
+* Locations:
+ + styles/prosilver/template/mcp_post.html
+* Since: 3.2.4-RC1
+* Purpose: Add content before report buttons
+
+mcp_post_text_after
+===
+* Locations:
+ + styles/prosilver/template/mcp_post.html
+* Since: 3.2.6-RC1
+* Purpose: Add content after the post text
+
+mcp_post_text_before
+===
+* Locations:
+ + styles/prosilver/template/mcp_post.html
+* Since: 3.2.6-RC1
+* Purpose: Add content before the post text
+
mcp_topic_options_after
===
* Locations:
@@ -953,6 +1051,41 @@ mcp_topic_options_before
* Since: 3.1.6-RC1
* Purpose: Add some options (field, checkbox, ...) before the subject field when split a subject
+mcp_topic_post_author_full_append
+===
+* Locations:
+ + styles/prosilver/template/mcp_topic.html
+* Since: 3.2.8-RC1
+* Purpose: Append information to message author username for post details in topic moderation
+
+mcp_topic_post_author_full_prepend
+===
+* Locations:
+ + styles/prosilver/template/mcp_topic.html
+* Since: 3.2.8-RC1
+* Purpose: Prepend information to message author username for post details in topic moderation
+
+mcp_topic_postrow_attachments_after
+===
+* Locations:
+ + styles/prosilver/template/mcp_topic.html
+* Since: 3.2.2-RC1
+* Purpose: Show additional content after attachments in mcp topic review
+
+mcp_topic_postrow_attachments_before
+===
+* Locations:
+ + styles/prosilver/template/mcp_topic.html
+* Since: 3.2.2-RC1
+* Purpose: Show additional content before attachments in mcp topic review
+
+mcp_topic_postrow_post_before
+===
+* Locations:
+ + styles/prosilver/template/mcp_topic.html
+* Since: 3.2.2-RC1
+* Purpose: Show additional content after postrow begins in mcp topic review
+
mcp_topic_postrow_post_details_after
===
* Locations:
@@ -1023,6 +1156,83 @@ mcp_warn_user_add_warning_field_before
* Since: 3.1.0-RC4
* Purpose: Add content during warning a user - before add warning field.
+memberlist_body_group_desc_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the group description and type in the group profile page.
+
+memberlist_body_group_name_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the group name in the group profile page.
+
+memberlist_body_group_name_before
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data before the group name in the group profile page.
+
+memberlist_body_group_rank_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the group rank in the group profile page.
+
+memberlist_body_group_rank_before
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data before the group rank in the group profile page.
+
+memberlist_body_leaders_set_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the last row in the memberlist mode leaders.
+
+memberlist_body_memberlist_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the last row in the memberlist.
+
+memberlist_body_memberrow_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the last memberrow in the memberlist.
+
+memberlist_body_page_footer_before
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data before the page footer.
+
+memberlist_body_page_header_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the page header.
+
+memberlist_body_page_title_before
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data before the page title.
+
memberlist_body_rank_append
===
* Locations:
@@ -1039,6 +1249,13 @@ memberlist_body_rank_prepend
* Purpose: Add information before rank in memberlist. Works in
all display modes (leader, group and normal memberlist).
+memberlist_body_show_group_after
+===
+* Locations:
+ + styles/prosilver/template/memberlist_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add data after the last row in the memberlist mode group.
+
memberlist_body_username_append
===
* Locations:
@@ -1195,6 +1412,20 @@ memberlist_view_user_statistics_before
* Since: 3.1.0-a1
* Purpose: Add entries before the user statistics part of any user profile
+memberlist_view_username_append
+===
+* Locations:
+ + styles/prosilver/template/memberlist_view.html
+* Since: 3.2.4-RC1
+* Purpose: Append information to username of member
+
+memberlist_view_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/memberlist_view.html
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to username of member
+
memberlist_view_zebra_after
===
* Locations:
@@ -1490,19 +1721,61 @@ overall_header_stylesheets_after
* Purpose: Add asset calls after stylesheets within the `</head>` tag.
Note that INCLUDECSS will not work with this event.
+posting_attach_body_attach_row_after
+===
+* Locations:
+ + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add content after attachment row in the file list
+
+posting_attach_body_attach_row_append
+===
+* Locations:
+ + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add content appending the attachment row in the file list
+
+posting_attach_body_attach_row_before
+===
+* Locations:
+ + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add content before attachment row in the file list
+
posting_attach_body_attach_row_controls_append
===
* Locations:
+ styles/prosilver/template/posting_attach_body.html
* Since: 3.2.2-RC1
-* Purpose: Add content after attachment control elements
+* Purpose: Add content after attachment control elements
posting_attach_body_attach_row_controls_prepend
===
* Locations:
+ styles/prosilver/template/posting_attach_body.html
* Since: 3.2.2-RC1
-* Purpose: Add content before attachment control elements
+* Purpose: Add content before attachment control elements
+
+posting_attach_body_attach_row_prepend
+===
+* Locations:
+ + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add content prepending attachment row in the file list
+
+posting_attach_body_file_list_after
+===
+* Locations:
+ + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add content after attachments list
+
+posting_attach_body_file_list_before
+===
+* Locations:
+ + styles/prosilver/template/posting_attach_body.html
+* Since: 3.2.6-RC1
+* Purpose: Add content before attachments list
posting_editor_add_panel_tab
===
@@ -1651,6 +1924,13 @@ posting_poll_body_options_after
* Since: 3.1.4-RC1
* Purpose: Add content after the poll options on creating a poll
+posting_preview_content_after
+===
+* Locations:
+ + styles/prosilver/template/posting_preview.html
+* Since: 3.2.4-RC1
+* Purpose: Add content after the message content preview
+
posting_preview_poll_after
===
* Locations:
@@ -1658,6 +1938,41 @@ posting_preview_poll_after
* Since: 3.1.7-RC1
* Purpose: Add content after the poll preview block
+posting_review_row_post_author_username_append
+===
+* Locations:
+ + styles/prosilver/template/posting_review.html
+* Since: 3.2.8-RC1
+* Purpose: Append information to post author username of member
+
+posting_review_row_post_author_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/posting_review.html
+* Since: 3.2.8-RC1
+* Purpose: Prepend information to post author username of member
+
+posting_topic_review_row_content_after
+===
+* Locations:
+ + styles/prosilver/template/posting_topic_review.html
+* Since: 3.2.4-RC1
+* Purpose: Add content after the message content in topic review
+
+posting_topic_review_row_post_author_username_append
+===
+* Locations:
+ + styles/prosilver/template/posting_topic_review.html
+* Since: 3.2.8-RC1
+* Purpose: Append information to post author username of member
+
+posting_topic_review_row_post_author_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/posting_topic_review.html
+* Since: 3.2.8-RC1
+* Purpose: Prepend information to post author username of member
+
posting_topic_review_row_post_details_after
===
* Locations:
@@ -1686,33 +2001,33 @@ posting_topic_title_before
* Since: 3.1.6-RC1
* Purpose: Allows to add some information on the left of the topic title in the posting form
-quickreply_editor_panel_after
+quickreply_editor_message_after
===
* Locations:
+ styles/prosilver/template/quickreply_editor.html
-* Since: 3.1.0-b2
-* Purpose: Add content after the quick reply panel (but inside the form)
+* Since: 3.1.0-a4
+* Purpose: Add content after the quick reply textbox
-quickreply_editor_panel_before
+quickreply_editor_message_before
===
* Locations:
+ styles/prosilver/template/quickreply_editor.html
-* Since: 3.1.0-b2
-* Purpose: Add content before the quick reply panel (but inside the form)
+* Since: 3.1.0-a4
+* Purpose: Add content before the quick reply textbox
-quickreply_editor_message_after
+quickreply_editor_panel_after
===
* Locations:
+ styles/prosilver/template/quickreply_editor.html
-* Since: 3.1.0-a4
-* Purpose: Add content after the quick reply textbox
+* Since: 3.1.0-b2
+* Purpose: Add content after the quick reply panel (but inside the form)
-quickreply_editor_message_before
+quickreply_editor_panel_before
===
* Locations:
+ styles/prosilver/template/quickreply_editor.html
-* Since: 3.1.0-a4
-* Purpose: Add content before the quick reply textbox
+* Since: 3.1.0-b2
+* Purpose: Add content before the quick reply panel (but inside the form)
quickreply_editor_subject_before
===
@@ -1819,6 +2134,13 @@ search_body_search_query_prepend
* Since: 3.1.7-RC1
* Purpose: Put content at the top of the search query fields set
+search_results_content_after
+===
+* Locations:
+ + styles/prosilver/template/search_results.html
+* Since: 3.2.4-RC1
+* Purpose: Add content after the message content in search results
+
search_results_header_after
===
* Locations:
@@ -1833,6 +2155,20 @@ search_results_header_before
* Since: 3.1.4-RC1
* Purpose: Add content before the header of the search results.
+search_results_last_post_author_username_append
+===
+* Locations:
+ + styles/prosilver/template/search_results.html (2)
+* Since: 3.2.4-RC1
+* Purpose: Append information to last post author username of member
+
+search_results_last_post_author_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/search_results.html (2)
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to last post author username of member
+
search_results_post_after
===
* Locations:
@@ -1840,6 +2176,20 @@ search_results_post_after
* Since: 3.1.0-b3
* Purpose: Add data after search result posts
+search_results_post_author_username_append
+===
+* Locations:
+ + styles/prosilver/template/search_results.html
+* Since: 3.2.4-RC1
+* Purpose: Append information to post author username of member
+
+search_results_post_author_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/search_results.html
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to post author username of member
+
search_results_post_before
===
* Locations:
@@ -1875,6 +2225,20 @@ search_results_topic_after
* Since: 3.1.0-b4
* Purpose: Add data after search result topics
+search_results_topic_author_username_append
+===
+* Locations:
+ + styles/prosilver/template/search_results.html
+* Since: 3.2.4-RC1
+* Purpose: Append information to topic author username of member
+
+search_results_topic_author_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/search_results.html
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to topic author username of member
+
search_results_topic_before
===
* Locations:
@@ -1894,6 +2258,13 @@ simple_footer_after
* Locations:
+ styles/prosilver/template/simple_footer.html
* Since: 3.1.0-a1
+* Purpose: Add content prior to the scripts of the simple footer
+
+simple_footer_body_after
+===
+* Locations:
+ + styles/prosilver/template/simple_footer.html
+* Since: 3.2.4-RC1
* Purpose: Add content directly prior to the `</body>` tag of the simple footer
simple_header_body_before
@@ -1918,7 +2289,7 @@ simple_header_stylesheets_after
* Purpose: Add asset calls after stylesheets within the `</head>` tag.
Note that INCLUDECSS will not work with this event.
-topiclist_row_prepend
+topiclist_row_append
===
* Locations:
+ styles/prosilver/template/search_results.html
@@ -1928,7 +2299,7 @@ topiclist_row_prepend
* Changed: 3.1.6-RC1 Added event to mcp_forum.html
* Purpose: Add content into topic rows (inside the elements containing topic titles)
-topiclist_row_append
+topiclist_row_prepend
===
* Locations:
+ styles/prosilver/template/search_results.html
@@ -1938,6 +2309,24 @@ topiclist_row_append
* Changed: 3.1.6-RC1 Added event to mcp_forum.html
* Purpose: Add content into topic rows (inside the elements containing topic titles)
+topiclist_row_topic_by_author_after
+===
+* Locations:
+ + styles/prosilver/template/search_results.html
+ + styles/prosilver/template/viewforum_body.html
+ + styles/prosilver/template/mcp_forum.html
+* Since: 3.2.8-RC1
+* Purpose: Add content into topic rows (after the "by topic author" row)
+
+topiclist_row_topic_by_author_before
+===
+* Locations:
+ + styles/prosilver/template/search_results.html
+ + styles/prosilver/template/viewforum_body.html
+ + styles/prosilver/template/mcp_forum.html
+* Since: 3.2.8-RC1
+* Purpose: Add content into topic rows (before the "by topic author" row)
+
topiclist_row_topic_title_after
===
* Locations:
@@ -1961,6 +2350,20 @@ ucp_agreement_terms_before
* Since: 3.1.0-b3
* Purpose: Add content before the terms of agreement text at user registration
+ucp_friend_list_after
+===
+* Locations:
+ + styles/prosilver/template/ucp_zebra_friends.html
+* Since: 3.1.0-a4
+* Purpose: Add optional elements after list of friends in UCP
+
+ucp_friend_list_before
+===
+* Locations:
+ + styles/prosilver/template/ucp_zebra_friends.html
+* Since: 3.1.0-a4
+* Purpose: Add optional elements before list of friends in UCP
+
ucp_main_front_user_activity_after
===
* Locations:
@@ -2035,6 +2438,20 @@ ucp_pm_history_review_before
* Since: 3.1.6-RC1
* Purpose: Add content before the private messages history review.
+ucp_pm_history_row_message_author_username_append
+===
+* Locations:
+ + styles/prosilver/template/ucp_pm_history.html
+* Since: 3.2.8-RC1
+* Purpose: Append information to message author username of member
+
+ucp_pm_history_row_message_author_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/ucp_pm_history.html
+* Since: 3.2.8-RC1
+* Purpose: Prepend information to message author username of member
+
ucp_pm_viewmessage_avatar_after
===
* Locations:
@@ -2143,6 +2560,13 @@ ucp_pm_viewmessage_rank_before
* Purpose: Add data before the rank on the user profile when viewing
a private message
+ucp_prefs_personal_append
+===
+* Locations:
+ + styles/prosilver/template/ucp_prefs_personal.html
+* Since: 3.1.0-a1
+* Purpose: Add user options to the bottom of the Edit Global Settings block
+
ucp_prefs_personal_prepend
===
* Locations:
@@ -2150,12 +2574,12 @@ ucp_prefs_personal_prepend
* Since: 3.1.0-a1
* Purpose: Add user options to the top of the Edit Global Settings block
-ucp_prefs_personal_append
+ucp_prefs_post_append
===
* Locations:
- + styles/prosilver/template/ucp_prefs_personal.html
+ + styles/prosilver/template/ucp_prefs_post.html
* Since: 3.1.0-a1
-* Purpose: Add user options to the bottom of the Edit Global Settings block
+* Purpose: Add user options to the bottom of the Edit Posting Defaults block
ucp_prefs_post_prepend
===
@@ -2164,12 +2588,13 @@ ucp_prefs_post_prepend
* Since: 3.1.0-a1
* Purpose: Add user options to the top of the Edit Posting Defaults block
-ucp_prefs_post_append
+ucp_prefs_view_radio_buttons_append
===
* Locations:
- + styles/prosilver/template/ucp_prefs_post.html
+ + styles/prosilver/template/ucp_prefs_view.html
* Since: 3.1.0-a1
-* Purpose: Add user options to the bottom of the Edit Posting Defaults block
+* Purpose: Add options to the bottom of the radio buttons block of the Edit
+Display Options screen
ucp_prefs_view_radio_buttons_prepend
===
@@ -2179,12 +2604,12 @@ ucp_prefs_view_radio_buttons_prepend
* Purpose: Add options to the top of the radio buttons block of the Edit
Display Options screen
-ucp_prefs_view_radio_buttons_append
+ucp_prefs_view_select_menu_append
===
* Locations:
+ styles/prosilver/template/ucp_prefs_view.html
* Since: 3.1.0-a1
-* Purpose: Add options to the bottom of the radio buttons block of the Edit
+* Purpose: Add options to the bottom of the drop-down lists block of the Edit
Display Options screen
ucp_prefs_view_select_menu_prepend
@@ -2195,13 +2620,12 @@ ucp_prefs_view_select_menu_prepend
* Purpose: Add options to the top of the drop-down lists block of the Edit
Display Options screen
-ucp_prefs_view_select_menu_append
+ucp_profile_profile_info_after
===
* Locations:
- + styles/prosilver/template/ucp_prefs_view.html
-* Since: 3.1.0-a1
-* Purpose: Add options to the bottom of the drop-down lists block of the Edit
-Display Options screen
+ + styles/prosilver/template/ucp_profile_profile_info.html
+* Since: 3.1.4-RC1
+* Purpose: Add options in profile page fieldset - after custom profile fields.
ucp_profile_profile_info_before
===
@@ -2210,12 +2634,12 @@ ucp_profile_profile_info_before
* Since: 3.1.4-RC1
* Purpose: Add options in profile page fieldset - before jabber field.
-ucp_profile_profile_info_after
+ucp_profile_register_details_after
===
* Locations:
- + styles/prosilver/template/ucp_profile_profile_info.html
+ + styles/prosilver/template/ucp_profile_reg_details.html
* Since: 3.1.4-RC1
-* Purpose: Add options in profile page fieldset - after custom profile fields.
+* Purpose: Add options in profile page fieldset - after confirm password field.
ucp_profile_register_details_before
===
@@ -2224,12 +2648,12 @@ ucp_profile_register_details_before
* Since: 3.1.4-RC1
* Purpose: Add options in profile page fieldset - before first field.
-ucp_profile_register_details_after
+ucp_profile_signature_posting_editor_options_prepend
===
* Locations:
- + styles/prosilver/template/ucp_profile_reg_details.html
-* Since: 3.1.4-RC1
-* Purpose: Add options in profile page fieldset - after confirm password field.
+ + styles/prosilver/template/ucp_profile_signature.html
+* Since: 3.2.6-RC1
+* Purpose: Add options signature posting editor - before first option.
ucp_register_buttons_before
===
@@ -2238,33 +2662,33 @@ ucp_register_buttons_before
* Since: 3.1.11-RC1
* Purpose: Add content before buttons in registration form.
-ucp_register_credentials_before
+ucp_register_credentials_after
===
* Locations:
+ styles/prosilver/template/ucp_register.html
* Since: 3.1.0-b5
-* Purpose: Add options in registration page fieldset - before first field.
+* Purpose: Add options in registration page fieldset - after password field.
-ucp_register_profile_fields_after
+ucp_register_credentials_before
===
* Locations:
+ styles/prosilver/template/ucp_register.html
* Since: 3.1.0-b5
-* Purpose: Add options in registration page fieldset - after last field.
+* Purpose: Add options in registration page fieldset - before first field.
-ucp_register_credentials_after
+ucp_register_options_before
===
* Locations:
+ styles/prosilver/template/ucp_register.html
* Since: 3.1.0-b5
-* Purpose: Add options in registration page fieldset - after password field.
+* Purpose: Add options in registration page fieldset - before language selector.
-ucp_register_options_before
+ucp_register_profile_fields_after
===
* Locations:
+ styles/prosilver/template/ucp_register.html
* Since: 3.1.0-b5
-* Purpose: Add options in registration page fieldset - before language selector.
+* Purpose: Add options in registration page fieldset - after last field.
ucp_register_profile_fields_before
===
@@ -2273,19 +2697,33 @@ ucp_register_profile_fields_before
* Since: 3.1.0-b5
* Purpose: Add options in registration page fieldset - before profile fields.
-ucp_friend_list_before
+viewforum_body_last_post_author_username_append
===
* Locations:
- + styles/prosilver/template/ucp_zebra_friends.html
-* Since: 3.1.0-a4
-* Purpose: Add optional elements before list of friends in UCP
+ + styles/prosilver/template/viewforum_body.html (2)
+* Since: 3.2.4-RC1
+* Purpose: Append information to last post author username of member
-ucp_friend_list_after
+viewforum_body_last_post_author_username_prepend
===
* Locations:
- + styles/prosilver/template/ucp_zebra_friends.html
-* Since: 3.1.0-a4
-* Purpose: Add optional elements after list of friends in UCP
+ + styles/prosilver/template/viewforum_body.html (2)
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to last post author username of member
+
+viewforum_body_topic_author_username_append
+===
+* Locations:
+ + styles/prosilver/template/viewforum_body.html
+* Since: 3.2.4-RC1
+* Purpose: Append information to topic author username of member
+
+viewforum_body_topic_author_username_prepend
+===
+* Locations:
+ + styles/prosilver/template/viewforum_body.html
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to topic author username of member
viewforum_body_topic_row_after
===
@@ -2322,13 +2760,6 @@ viewforum_body_topicrow_row_before
* Since: 3.1.10-RC1
* Purpose: Add content before list of topics.
-viewforum_buttons_bottom_before
-===
-* Locations:
- + styles/prosilver/template/viewforum_body.html
-* Since: 3.1.0-RC5
-* Purpose: Add buttons before New Topic button on the bottom of the topic's list
-
viewforum_buttons_bottom_after
===
* Locations:
@@ -2336,12 +2767,12 @@ viewforum_buttons_bottom_after
* Since: 3.1.0-RC5
* Purpose: Add buttons after New Topic button on the bottom of the topic's list
-viewforum_buttons_top_before
+viewforum_buttons_bottom_before
===
* Locations:
+ styles/prosilver/template/viewforum_body.html
* Since: 3.1.0-RC5
-* Purpose: Add buttons before New Topic button on the top of the topic's list
+* Purpose: Add buttons before New Topic button on the bottom of the topic's list
viewforum_buttons_top_after
===
@@ -2350,47 +2781,12 @@ viewforum_buttons_top_after
* Since: 3.1.0-RC5
* Purpose: Add buttons after New Topic button on the top of the topic's list
-viewtopic_buttons_bottom_before
-===
-* Locations:
- + styles/prosilver/template/viewtopic_body.html
-* Since: 3.1.0-RC5
-* Purpose: Add buttons before Post Reply button on the bottom of the posts's list
-
-viewtopic_buttons_bottom_after
-===
-* Locations:
- + styles/prosilver/template/viewtopic_body.html
-* Since: 3.1.0-RC5
-* Purpose: Add buttons after Post Reply button on the bottom of the posts's list
-
-viewtopic_buttons_top_before
-===
-* Locations:
- + styles/prosilver/template/viewtopic_body.html
-* Since: 3.1.0-RC5
-* Purpose: Add buttons before Post Reply button on the top of the posts's list
-
-viewtopic_buttons_top_after
+viewforum_buttons_top_before
===
* Locations:
- + styles/prosilver/template/viewtopic_body.html
+ + styles/prosilver/template/viewforum_body.html
* Since: 3.1.0-RC5
-* Purpose: Add buttons after Post Reply button on the top of the posts's list
-
-viewtopic_dropdown_bottom_custom
-===
-* Locations:
- + styles/prosilver/template/viewtopic_body.html
-* Since: 3.1.6-RC1
-* Purpose: Create a custom dropdown menu
-
-viewtopic_dropdown_top_custom
-===
-* Locations:
- + styles/prosilver/template/viewtopic_body.html
-* Since: 3.1.6-RC1
-* Purpose: Create a custom dropdown menu
+* Purpose: Add buttons before New Topic button on the top of the topic's list
viewforum_forum_name_append
===
@@ -2420,19 +2816,19 @@ viewforum_forum_title_before
* Since: 3.1.5-RC1
* Purpose: Add content directly before the forum title on the View forum screen
-viewtopic_print_head_append
+viewonline_body_username_append
===
* Locations:
- + styles/prosilver/template/viewtopic_print.html
-* Since: 3.1.0-a1
-* Purpose: Add asset calls directly before the `</head>` tag of the Print Topic screen
+ + styles/prosilver/template/viewonline_body.html
+* Since: 3.2.4-RC1
+* Purpose: Append information to username of member
-viewtopic_body_pagination_top_after
+viewonline_body_username_prepend
===
* Locations:
- + styles/prosilver/template/viewtopic_body.html
-* Since: 3.1.4-RC1
-* Purpose: Add content after the pagination at top
+ + styles/prosilver/template/viewonline_body.html
+* Since: 3.2.4-RC1
+* Purpose: Prepend information to username of member
viewtopic_body_avatar_after
===
@@ -2472,6 +2868,13 @@ viewtopic_body_footer_before
* Purpose: Add content to the bottom of the View topic screen below the posts
and quick reply, directly before the jumpbox in Prosilver.
+viewtopic_body_pagination_top_after
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.1.4-RC1
+* Purpose: Add content after the pagination at top
+
viewtopic_body_poll_after
===
* Locations:
@@ -2574,28 +2977,35 @@ viewtopic_body_postrow_back2top_after
* Locations:
+ styles/prosilver/template/viewtopic_body.html
* Since: 3.1.8-RC1
-* Purpose: Add content to the post's bottom after the back to top link
+* Purpose: Add content to the post's bottom after the back to top link
viewtopic_body_postrow_back2top_append
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
* Since: 3.1.8-RC1
-* Purpose: Add content to the post's bottom directly after the back to top link
+* Purpose: Add content to the post's bottom directly after the back to top link
viewtopic_body_postrow_back2top_before
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
* Since: 3.1.8-RC1
-* Purpose: Add content to the post's bottom before the back to top link
+* Purpose: Add content to the post's bottom before the back to top link
viewtopic_body_postrow_back2top_prepend
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
* Since: 3.1.8-RC1
-* Purpose: Add content to the post's bottom directly before the back to top link
+* Purpose: Add content to the post's bottom directly before the back to top link
+
+viewtopic_body_postrow_content_after
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.2.4-RC1
+* Purpose: Add content after the message content in topics views
viewtopic_body_postrow_custom_fields_after
===
@@ -2685,19 +3095,61 @@ viewtopic_body_topic_actions_before
* Since: 3.1.0-a4
* Purpose: Add data before the topic actions buttons (after the posts sorting options)
-viewtopic_topic_title_after
+viewtopic_buttons_bottom_after
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
-* Since: 3.1.7-RC1
-* Purpose: Add content directly after the topic title link on the View topic screen (outside of the h2 HTML tag)
+* Since: 3.1.0-RC5
+* Purpose: Add buttons after Post Reply button on the bottom of the posts's list
-viewtopic_topic_title_before
+viewtopic_buttons_bottom_before
===
* Locations:
+ styles/prosilver/template/viewtopic_body.html
-* Since: 3.2.2-RC1
-* Purpose: Add content directly before the topic title link on the View topic screen (outside of the h2 HTML tag)
+* Since: 3.1.0-RC5
+* Purpose: Add buttons before Post Reply button on the bottom of the posts's list
+
+viewtopic_buttons_top_after
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.1.0-RC5
+* Purpose: Add buttons after Post Reply button on the top of the posts's list
+
+viewtopic_buttons_top_before
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.1.0-RC5
+* Purpose: Add buttons before Post Reply button on the top of the posts's list
+
+viewtopic_dropdown_bottom_custom
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.1.6-RC1
+* Purpose: Create a custom dropdown menu
+
+viewtopic_dropdown_top_custom
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.1.6-RC1
+* Purpose: Create a custom dropdown menu
+
+viewtopic_print_head_append
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_print.html
+* Since: 3.1.0-a1
+* Purpose: Add asset calls directly before the `</head>` tag of the Print Topic screen
+
+viewtopic_topic_title_after
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.1.7-RC1
+* Purpose: Add content directly after the topic title link on the View topic screen (outside of the h2 HTML tag)
viewtopic_topic_title_append
===
@@ -2706,6 +3158,13 @@ viewtopic_topic_title_append
* Since: 3.1.0-b3
* Purpose: Add content directly after the topic title link on the View topic screen
+viewtopic_topic_title_before
+===
+* Locations:
+ + styles/prosilver/template/viewtopic_body.html
+* Since: 3.2.2-RC1
+* Purpose: Add content directly before the topic title link on the View topic screen (outside of the h2 HTML tag)
+
viewtopic_topic_title_prepend
===
* Locations:
diff --git a/phpBB/docs/nginx.sample.conf b/phpBB/docs/nginx.sample.conf
index ce929b6e54..55c01a1fc9 100644
--- a/phpBB/docs/nginx.sample.conf
+++ b/phpBB/docs/nginx.sample.conf
@@ -18,11 +18,11 @@ http {
gzip_vary on;
gzip_http_version 1.1;
gzip_min_length 700;
-
+
# Compression levels over 6 do not give an appreciable improvement
# in compression ratio, but take more resources.
gzip_comp_level 6;
-
+
# IE 6 and lower do not support gzip with Vary correctly.
gzip_disable "msie6";
# Before nginx 0.7.63:
@@ -49,9 +49,7 @@ http {
server_name myforums.com;
# A trick from http://wiki.nginx.org/Pitfalls#Taxing_Rewrites:
- rewrite ^ http://www.myforums.com$request_uri permanent;
- # Equivalent to:
- #rewrite ^(.*)$ http://www.myforums.com$1 permanent;
+ return 301 http://www.myforums.com$request_uri;
}
# The actual board domain.
@@ -72,7 +70,7 @@ http {
}
# Deny access to internal phpbb files.
- location ~ /(config\.php|common\.php|cache|files|images/avatars/upload|includes|phpbb|store|vendor) {
+ location ~ /(config\.php|common\.php|cache|files|images/avatars/upload|includes|(?<!ext/)phpbb|store|vendor) {
deny all;
# deny was ignored before 0.8.40 for connections over IPv6.
# Use internal directive to prohibit access on older versions.
diff --git a/phpBB/docs/sphinx.sample.conf b/phpBB/docs/sphinx.sample.conf
index 0a210ecd1a..85cba190d7 100644
--- a/phpBB/docs/sphinx.sample.conf
+++ b/phpBB/docs/sphinx.sample.conf
@@ -29,7 +29,6 @@ source source_phpbb_{SPHINX_ID}_main
AND p.post_id >= $start AND p.post_id <= $end
sql_query_post =
sql_query_post_index = UPDATE phpbb_sphinx SET max_doc_id = $maxid WHERE counter_id = 1
- sql_query_info = SELECT * FROM phpbb_posts WHERE post_id = $id
sql_attr_uint = forum_id
sql_attr_uint = topic_id
sql_attr_uint = poster_id
@@ -72,7 +71,6 @@ index index_phpbb_{SPHINX_ID}_main
morphology = none
stopwords =
min_word_len = 2
- charset_type = utf-8
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF
min_prefix_len = 0
min_infix_len = 0
@@ -88,13 +86,11 @@ indexer
}
searchd
{
- compat_sphinxql_magics = 0
listen = localhost:9312
log = {DATA_PATH}/log/searchd.log
query_log = {DATA_PATH}/log/sphinx-query.log
read_timeout = 5
max_children = 30
pid_file = {DATA_PATH}/searchd.pid
- max_matches = 20000
binlog_path = {DATA_PATH}
}
diff --git a/phpBB/download/file.php b/phpBB/download/file.php
index a9cd4a3b3c..9ee489cef4 100644
--- a/phpBB/download/file.php
+++ b/phpBB/download/file.php
@@ -159,6 +159,8 @@ $user->session_begin(false);
$auth->acl($user->data);
$user->setup('viewtopic');
+$phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
if (!$config['allow_attachments'] && !$config['allow_pm_attach'])
{
send_status_line(404, 'Not Found');
@@ -225,7 +227,7 @@ else
$post_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- if (!$post_row || ($post_row['post_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $post_row['forum_id'])))
+ if (!$post_row || !$phpbb_content_visibility->is_visible('post', $post_row['forum_id'], $post_row))
{
// Attachment of a soft deleted post and the user is not allowed to see the post
send_status_line(404, 'Not Found');
diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php
index 3cfe5de293..94e3660de8 100644
--- a/phpBB/includes/acp/acp_attachments.php
+++ b/phpBB/includes/acp/acp_attachments.php
@@ -27,6 +27,9 @@ class acp_attachments
/** @var \phpbb\config\config */
protected $config;
+ /** @var \phpbb\language\language */
+ protected $language;
+
/** @var ContainerBuilder */
protected $phpbb_container;
@@ -54,6 +57,7 @@ class acp_attachments
$this->id = $id;
$this->db = $db;
$this->config = $config;
+ $this->language = $phpbb_container->get('language');
$this->template = $template;
$this->user = $user;
$this->phpbb_container = $phpbb_container;
@@ -128,7 +132,7 @@ class acp_attachments
$s_assigned_groups = array();
while ($row = $db->sql_fetchrow($result))
{
- $row['group_name'] = (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name'];
+ $row['group_name'] = $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) : $row['group_name'];
$s_assigned_groups[$row['cat_id']][] = $row['group_name'];
}
$db->sql_freeresult($result);
@@ -164,7 +168,6 @@ class acp_attachments
'img_create_thumbnail' => array('lang' => 'CREATE_THUMBNAIL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'img_max_thumb_width' => array('lang' => 'MAX_THUMB_WIDTH', 'validate' => 'int:0:999999999999999', 'type' => 'number:0:999999999999999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'img_min_thumb_filesize' => array('lang' => 'MIN_THUMB_FILESIZE', 'validate' => 'int:0:999999999999999', 'type' => 'number:0:999999999999999', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']),
- 'img_imagick' => array('lang' => 'IMAGICK_PATH', 'validate' => 'absolute_path', 'type' => 'text:20:200', 'explain' => true, 'append' => '&nbsp;&nbsp;<span>[ <a href="' . $this->u_action . '&amp;action=imgmagick">' . $user->lang['SEARCH_IMAGICK'] . '</a> ]</span>'),
'img_max' => array('lang' => 'MAX_IMAGE_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'img_link' => array('lang' => 'IMAGE_LINK_SIZE', 'validate' => 'int:0:9999', 'type' => 'dimension:0:9999', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
)
@@ -190,7 +193,7 @@ class acp_attachments
validate_config_vars($display_vars['vars'], $cfg_array, $error);
// Do not write values if there is an error
- if (sizeof($error))
+ if (count($error))
{
$submit = false;
}
@@ -226,7 +229,7 @@ class acp_attachments
// Check Settings
$this->test_upload($error, $this->new_config['upload_path'], false);
- if (!sizeof($error))
+ if (!count($error))
{
trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
}
@@ -234,38 +237,6 @@ class acp_attachments
$template->assign_var('S_ATTACHMENT_SETTINGS', true);
- if ($action == 'imgmagick')
- {
- $this->new_config['img_imagick'] = $this->search_imagemagick();
- }
-
- // We strip eventually manual added convert program, we only want the patch
- if ($this->new_config['img_imagick'])
- {
- // Change path separator
- $this->new_config['img_imagick'] = str_replace('\\', '/', $this->new_config['img_imagick']);
- $this->new_config['img_imagick'] = str_replace(array('convert', '.exe'), array('', ''), $this->new_config['img_imagick']);
-
- // Check for trailing slash
- if (substr($this->new_config['img_imagick'], -1) !== '/')
- {
- $this->new_config['img_imagick'] .= '/';
- }
- }
-
- $supported_types = get_supported_image_types();
-
- // Check Thumbnail Support
- if (!$this->new_config['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format'])))
- {
- $this->new_config['img_create_thumbnail'] = 0;
- }
-
- $template->assign_vars(array(
- 'U_SEARCH_IMAGICK' => $this->u_action . '&amp;action=imgmagick',
- 'S_THUMBNAIL_SUPPORT' => (!$this->new_config['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format']))) ? false : true)
- );
-
// Secure Download Options - Same procedure as with banning
$allow_deny = ($this->new_config['secure_allow_deny']) ? 'ALLOWED' : 'DISALLOWED';
@@ -290,7 +261,7 @@ class acp_attachments
$template->assign_vars(array(
'S_SECURE_DOWNLOADS' => $this->new_config['secure_downloads'],
'S_DEFINED_IPS' => ($defined_ips != '') ? true : false,
- 'S_WARNING' => (sizeof($error)) ? true : false,
+ 'S_WARNING' => (count($error)) ? true : false,
'WARNING_MSG' => implode('<br />', $error),
'DEFINED_IPS' => $defined_ips,
@@ -363,7 +334,7 @@ class acp_attachments
// Generate correct Change List
$extensions = array();
- for ($i = 0, $size = sizeof($extension_change_list); $i < $size; $i++)
+ for ($i = 0, $size = count($extension_change_list); $i < $size; $i++)
{
$extensions[$extension_change_list[$i]]['group_id'] = $group_select_list[$i];
}
@@ -390,7 +361,7 @@ class acp_attachments
// Delete Extension?
$extension_id_list = $request->variable('extension_id_list', array(0));
- if (sizeof($extension_id_list))
+ if (count($extension_id_list))
{
$sql = 'SELECT extension
FROM ' . EXTENSIONS_TABLE . '
@@ -420,7 +391,7 @@ class acp_attachments
if ($add_extension && $add)
{
- if (!sizeof($error))
+ if (!count($error))
{
$sql = 'SELECT extension_id
FROM ' . EXTENSIONS_TABLE . "
@@ -433,7 +404,7 @@ class acp_attachments
}
$db->sql_freeresult($result);
- if (!sizeof($error))
+ if (!count($error))
{
$sql_ary = array(
'group_id' => $add_extension_group,
@@ -447,7 +418,7 @@ class acp_attachments
}
}
- if (!sizeof($error))
+ if (!count($error))
{
$notify[] = $user->lang['EXTENSIONS_UPDATED'];
}
@@ -558,7 +529,7 @@ class acp_attachments
$db->sql_freeresult($result);
}
- if (!sizeof($error))
+ if (!count($error))
{
// Ok, build the update/insert array
$upload_icon = $request->variable('upload_icon', 'no_image');
@@ -575,7 +546,7 @@ class acp_attachments
$max_filesize = 0;
}
- if (!sizeof($allowed_forums))
+ if (!count($allowed_forums))
{
$forum_select = false;
}
@@ -606,13 +577,13 @@ class acp_attachments
$group_id = $db->sql_nextid();
}
- $group_name = (isset($user->lang['EXT_GROUP_' . $group_name])) ? $user->lang['EXT_GROUP_' . $group_name] : $group_name;
+ $group_name = $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($group_name)) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($group_name)) : $group_name;
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACH_EXTGROUP_' . strtoupper($action), false, array($group_name));
}
$extension_list = $request->variable('extensions', array(0));
- if ($action == 'edit' && sizeof($extension_list))
+ if ($action == 'edit' && count($extension_list))
{
$sql = 'UPDATE ' . EXTENSIONS_TABLE . "
SET group_id = 0
@@ -620,7 +591,7 @@ class acp_attachments
$db->sql_query($sql);
}
- if (sizeof($extension_list))
+ if (count($extension_list))
{
$sql = 'UPDATE ' . EXTENSIONS_TABLE . "
SET group_id = $group_id
@@ -630,7 +601,7 @@ class acp_attachments
$cache->destroy('_extensions');
- if (!sizeof($error))
+ if (!count($error))
{
$notify[] = $user->lang['SUCCESS_EXTENSION_GROUP_' . strtoupper($action)];
}
@@ -806,7 +777,7 @@ class acp_attachments
'S_FILENAME_LIST' => $filename_list,
'S_EDIT_GROUP' => true,
'S_NO_IMAGE' => $no_image_select,
- 'S_FORUM_IDS' => (sizeof($forum_ids)) ? true : false,
+ 'S_FORUM_IDS' => (count($forum_ids)) ? true : false,
'U_EXTENSIONS' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;mode=extensions"),
'U_BACK' => $this->u_action,
@@ -908,7 +879,7 @@ class acp_attachments
'U_EDIT' => $this->u_action . "&amp;action=edit&amp;g={$row['group_id']}",
'U_DELETE' => $this->u_action . "&amp;action=delete&amp;g={$row['group_id']}",
- 'GROUP_NAME' => (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name'],
+ 'GROUP_NAME' => $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) : $row['group_name'],
'CATEGORY' => $cat_lang[$row['cat_id']],
)
);
@@ -922,13 +893,16 @@ class acp_attachments
case 'orphan':
+ /* @var $pagination \phpbb\pagination */
+ $pagination = $this->phpbb_container->get('pagination');
+
if ($submit)
{
$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array();
$add_files = (isset($_POST['add'])) ? array_keys($request->variable('add', array('' => 0))) : array();
$post_ids = $request->variable('post_id', array('' => 0));
- if (sizeof($delete_files))
+ if (count($delete_files))
{
$sql = 'SELECT *
FROM ' . ATTACHMENTS_TABLE . '
@@ -951,7 +925,7 @@ class acp_attachments
$db->sql_freeresult($result);
}
- if (sizeof($delete_files))
+ if (count($delete_files))
{
$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
WHERE ' . $db->sql_in_set('attach_id', array_keys($delete_files));
@@ -971,7 +945,7 @@ class acp_attachments
}
unset($add_files);
- if (sizeof($upload_list))
+ if (count($upload_list))
{
$template->assign_var('S_UPLOADING_FILES', true);
@@ -1064,13 +1038,29 @@ class acp_attachments
'S_ORPHAN' => true)
);
+ $attachments_per_page = (int) $config['topics_per_page'];
+
+ // Get total number or orphans older than 3 hours
+ $sql = 'SELECT COUNT(attach_id) as num_files, SUM(filesize) as total_size
+ FROM ' . ATTACHMENTS_TABLE . '
+ WHERE is_orphan = 1
+ AND filetime < ' . (time() - 3*60*60);
+ $result = $this->db->sql_query($sql);
+ $row = $this->db->sql_fetchrow($result);
+ $num_files = (int) $row['num_files'];
+ $total_size = (int) $row['total_size'];
+ $this->db->sql_freeresult($result);
+
+ $start = $request->variable('start', 0);
+ $start = $pagination->validate_start($start, $attachments_per_page, $num_files);
+
// Just get the files with is_orphan set and older than 3 hours
$sql = 'SELECT *
FROM ' . ATTACHMENTS_TABLE . '
WHERE is_orphan = 1
AND filetime < ' . (time() - 3*60*60) . '
ORDER BY filetime DESC';
- $result = $db->sql_query($sql);
+ $result = $db->sql_query_limit($sql, $attachments_per_page, $start);
while ($row = $db->sql_fetchrow($result))
{
@@ -1086,6 +1076,20 @@ class acp_attachments
}
$db->sql_freeresult($result);
+ $pagination->generate_template_pagination(
+ $this->u_action,
+ 'pagination',
+ 'start',
+ $num_files,
+ $attachments_per_page,
+ $start
+ );
+
+ $template->assign_vars(array(
+ 'TOTAL_FILES' => $num_files,
+ 'TOTAL_SIZE' => get_formatted_filesize($total_size),
+ ));
+
break;
case 'manage':
@@ -1094,7 +1098,7 @@ class acp_attachments
{
$delete_files = (isset($_POST['delete'])) ? array_keys($request->variable('delete', array('' => 0))) : array();
- if (sizeof($delete_files))
+ if (count($delete_files))
{
// Select those attachments we want to delete...
$sql = 'SELECT real_filename
@@ -1110,7 +1114,7 @@ class acp_attachments
if ($num_deleted = $this->attachment_manager->delete('attach', $delete_files))
{
- if (sizeof($delete_files) != $num_deleted)
+ if (count($delete_files) != $num_deleted)
{
$error[] = $user->lang['FILES_GONE'];
}
@@ -1231,28 +1235,24 @@ class acp_attachments
// Grab extensions
$extensions = $cache->obtain_attach_extensions(true);
- for ($i = 0, $end = sizeof($attachments_list); $i < $end; ++$i)
+ for ($i = 0, $end = count($attachments_list); $i < $end; ++$i)
{
$row = $attachments_list[$i];
$row['extension'] = strtolower(trim((string) $row['extension']));
$comment = ($row['attach_comment'] && !$row['in_message']) ? str_replace(array("\n", "\r"), array('<br />', "\n"), $row['attach_comment']) : '';
- $display_cat = $extensions[$row['extension']]['display_cat'];
+ $display_cat = isset($extensions[$row['extension']]['display_cat']) ? $extensions[$row['extension']]['display_cat'] : ATTACHMENT_CATEGORY_NONE;
$l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNTS' : 'VIEWED_COUNTS';
$template->assign_block_vars('attachments', array(
'ATTACHMENT_POSTER' => get_username_string('full', (int) $row['poster_id'], (string) $row['username'], (string) $row['user_colour'], (string) $row['username']),
'FILESIZE' => get_formatted_filesize((int) $row['filesize']),
'FILETIME' => $user->format_date((int) $row['filetime']),
- 'REAL_FILENAME' => (!$row['in_message']) ? utf8_basename((string) $row['real_filename']) : '',
- 'PHYSICAL_FILENAME' => utf8_basename((string) $row['physical_filename']),
- 'EXT_GROUP_NAME' => (!empty($extensions[$row['extension']]['group_name'])) ? $user->lang['EXT_GROUP_' . $extensions[$row['extension']]['group_name']] : '',
+ 'REAL_FILENAME' => utf8_basename((string) $row['real_filename']),
+ 'EXT_GROUP_NAME' => $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($extensions[$row['extension']]['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($extensions[$row['extension']]['group_name'])) : $extensions[$row['extension']]['group_name'],
'COMMENT' => $comment,
'TOPIC_TITLE' => (!$row['in_message']) ? (string) $row['topic_title'] : '',
'ATTACH_ID' => (int) $row['attach_id'],
- 'POST_ID' => (int) $row['post_msg_id'],
- 'TOPIC_ID' => (int) $row['topic_id'],
- 'POST_IDS' => (!empty($post_ids[$row['attach_id']])) ? (int) $post_ids[$row['attach_id']] : '',
'L_DOWNLOAD_COUNT' => $user->lang($l_downloaded_viewed, (int) $row['download_count']),
@@ -1266,7 +1266,7 @@ class acp_attachments
break;
}
- if (sizeof($error))
+ if (count($error))
{
$template->assign_vars(array(
'S_WARNING' => true,
@@ -1274,7 +1274,7 @@ class acp_attachments
);
}
- if (sizeof($notify))
+ if (count($notify))
{
$template->assign_vars(array(
'S_NOTIFY' => true,
@@ -1434,7 +1434,7 @@ class acp_attachments
$group_name = array();
while ($row = $db->sql_fetchrow($result))
{
- $row['group_name'] = (isset($user->lang['EXT_GROUP_' . $row['group_name']])) ? $user->lang['EXT_GROUP_' . $row['group_name']] : $row['group_name'];
+ $row['group_name'] = $this->language->is_set('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) ? $this->language->lang('EXT_GROUP_' . utf8_strtoupper($row['group_name'])) : $row['group_name'];
$group_name[] = $row;
}
$db->sql_freeresult($result);
@@ -1443,7 +1443,7 @@ class acp_attachments
$row['group_name'] = $user->lang['NOT_ASSIGNED'];
$group_name[] = $row;
- for ($i = 0, $groups_size = sizeof($group_name); $i < $groups_size; $i++)
+ for ($i = 0, $groups_size = count($group_name); $i < $groups_size; $i++)
{
if ($default_group === false)
{
@@ -1463,47 +1463,6 @@ class acp_attachments
}
/**
- * Search Imagick
- */
- function search_imagemagick()
- {
- $imagick = '';
-
- $exe = ((defined('PHP_OS')) && (preg_match('#^win#i', PHP_OS))) ? '.exe' : '';
-
- $magic_home = getenv('MAGICK_HOME');
-
- if (empty($magic_home))
- {
- $locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/');
- $path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH'))));
-
- $locations = array_merge($path_locations, $locations);
-
- foreach ($locations as $location)
- {
- // The path might not end properly, fudge it
- if (substr($location, -1) !== '/')
- {
- $location .= '/';
- }
-
- if (@file_exists($location) && @is_readable($location . 'mogrify' . $exe) && @filesize($location . 'mogrify' . $exe) > 3000)
- {
- $imagick = str_replace('\\', '/', $location);
- continue;
- }
- }
- }
- else
- {
- $imagick = str_replace('\\', '/', $magic_home);
- }
-
- return $imagick;
- }
-
- /**
* Test Settings
*/
function test_upload(&$error, $upload_dir, $create_directory = false)
@@ -1676,7 +1635,7 @@ class acp_attachments
}
$db->sql_freeresult($result);
- if (sizeof($iplist))
+ if (count($iplist))
{
foreach ($iplist as $ip_entry)
{
@@ -1686,7 +1645,7 @@ class acp_attachments
}
}
- if (sizeof($hostlist))
+ if (count($hostlist))
{
foreach ($hostlist as $host_entry)
{
@@ -1709,7 +1668,7 @@ class acp_attachments
{
$unip_sql = $request->variable('unip', array(0));
- if (sizeof($unip_sql))
+ if (count($unip_sql))
{
$l_unip_list = '';
diff --git a/phpBB/includes/acp/acp_bbcodes.php b/phpBB/includes/acp/acp_bbcodes.php
index f958ae93c7..1f7374a07f 100644
--- a/phpBB/includes/acp/acp_bbcodes.php
+++ b/phpBB/includes/acp/acp_bbcodes.php
@@ -253,7 +253,7 @@ class acp_bbcodes
if ($row)
{
- $bbcode_id = $row['max_bbcode_id'] + 1;
+ $bbcode_id = (int) $row['max_bbcode_id'] + 1;
// Make sure it is greater than the core bbcode ids...
if ($bbcode_id <= NUM_CORE_BBCODES)
@@ -295,6 +295,22 @@ class acp_bbcodes
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, $log_action, false, array($data['bbcode_tag']));
+ /**
+ * Event after a BBCode has been added or updated
+ *
+ * @event core.acp_bbcodes_modify_create_after
+ * @var string action Type of the action: modify|create
+ * @var int bbcode_id The id of the added or updated bbcode
+ * @var array sql_ary Array with bbcode data (read only)
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'action',
+ 'bbcode_id',
+ 'sql_ary',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_modify_create_after', compact($vars)));
+
trigger_error($user->lang[$lang] . adm_back_link($this->u_action));
}
else
@@ -325,10 +341,28 @@ class acp_bbcodes
{
if (confirm_box(true))
{
+ $bbcode_tag = $row['bbcode_tag'];
+
$db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");
$cache->destroy('sql', BBCODES_TABLE);
$phpbb_container->get('text_formatter.cache')->invalidate();
- $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($row['bbcode_tag']));
+ $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_BBCODE_DELETE', false, array($bbcode_tag));
+
+ /**
+ * Event after a BBCode has been deleted
+ *
+ * @event core.acp_bbcodes_delete_after
+ * @var string action Type of the action: delete
+ * @var int bbcode_id The id of the deleted bbcode
+ * @var string bbcode_tag The tag of the deleted bbcode
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'action',
+ 'bbcode_id',
+ 'bbcode_tag',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.acp_bbcodes_delete_after', compact($vars)));
if ($request->is_ajax())
{
@@ -494,7 +528,7 @@ class acp_bbcodes
// Pad backreference numbers from tokens
if (preg_match_all('/(?<!\\\\)\$([0-9]+)/', $replace, $repad))
{
- $repad = $pad + sizeof(array_unique($repad[0]));
+ $repad = $pad + count(array_unique($repad[0]));
$replace = preg_replace_callback('/(?<!\\\\)\$([0-9]+)/', function ($match) use ($pad) {
return '${' . ($match[1] + $pad) . '}';
}, $replace);
@@ -553,10 +587,10 @@ class acp_bbcodes
}
// Lowercase tags
- $bbcode_tag = preg_replace('/.*?\[([a-z0-9_-]+=?).*/i', '$1', $bbcode_match);
- $bbcode_search = preg_replace('/.*?\[([a-z0-9_-]+)=?.*/i', '$1', $bbcode_match);
+ $bbcode_tag = preg_replace('/.*?\[([a-z0-9_-]+).*/i', '$1', $bbcode_match);
+ $bbcode_search = preg_replace('/.*?\[([a-z0-9_-]+).*/i', '$1', $bbcode_match);
- if (!preg_match('/^[a-zA-Z0-9_-]+=?$/', $bbcode_tag))
+ if (!preg_match('/^[a-zA-Z0-9_-]+$/', $bbcode_tag))
{
global $user;
trigger_error($user->lang['BBCODE_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php
index 77e6133fe6..0730b4e285 100644
--- a/phpBB/includes/acp/acp_board.php
+++ b/phpBB/includes/acp/acp_board.php
@@ -30,10 +30,13 @@ class acp_board
function main($id, $mode)
{
- global $user, $template, $request;
+ global $user, $template, $request, $language;
global $config, $phpbb_root_path, $phpEx;
global $cache, $phpbb_container, $phpbb_dispatcher, $phpbb_log;
+ /** @var \phpbb\language\language $language Language object */
+ $language = $phpbb_container->get('language');
+
$user->add_lang('acp/board');
$submit = (isset($_POST['submit']) || isset($_POST['allow_quick_reply_enable'])) ? true : false;
@@ -56,7 +59,7 @@ class acp_board
'legend1' => 'ACP_BOARD_SETTINGS',
'sitename' => array('lang' => 'SITE_NAME', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => false),
'site_desc' => array('lang' => 'SITE_DESC', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => false),
- 'site_home_url' => array('lang' => 'SITE_HOME_URL', 'validate' => 'string', 'type' => 'url:40:255', 'explain' => true),
+ 'site_home_url' => array('lang' => 'SITE_HOME_URL', 'validate' => 'url', 'type' => 'url:40:255', 'explain' => true),
'site_home_text' => array('lang' => 'SITE_HOME_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true),
'board_index_text' => array('lang' => 'BOARD_INDEX_TEXT', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true),
'board_disable' => array('lang' => 'DISABLE_BOARD', 'validate' => 'bool', 'type' => 'custom', 'method' => 'board_disable', 'explain' => true),
@@ -122,6 +125,7 @@ class acp_board
$avatar_vars = array();
foreach ($avatar_drivers as $current_driver)
{
+ /** @var \phpbb\avatar\driver\driver_interface $driver */
$driver = $phpbb_avatar_manager->get_driver($current_driver, false);
/*
@@ -356,6 +360,7 @@ class acp_board
'load_user_activity_limit' => array('lang' => 'LOAD_USER_ACTIVITY_LIMIT', 'validate' => 'int:0:99999999', 'type' => 'number:0:99999999', 'explain' => true),
'load_tplcompile' => array('lang' => 'RECOMPILE_STYLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_cdn' => array('lang' => 'ALLOW_CDN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
+ 'enable_accurate_pm_button' => array('lang' => 'YES_ACCURATE_PM_BUTTON', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_live_searches' => array('lang' => 'ALLOW_LIVE_SEARCHES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend3' => 'CUSTOM_PROFILE_FIELDS',
@@ -444,11 +449,12 @@ class acp_board
'legend1' => 'GENERAL_SETTINGS',
'email_enable' => array('lang' => 'ENABLE_EMAIL', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true),
'board_email_form' => array('lang' => 'BOARD_EMAIL_FORM', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true),
- 'email_function_name' => array('lang' => 'EMAIL_FUNCTION_NAME', 'validate' => 'string', 'type' => 'text:20:50', 'explain' => true),
'email_package_size' => array('lang' => 'EMAIL_PACKAGE_SIZE', 'validate' => 'int:0', 'type' => 'number:0:99999', 'explain' => true),
+ 'email_max_chunk_size' => array('lang' => 'EMAIL_MAX_CHUNK_SIZE', 'validate' => 'int:1:99999', 'type' => 'number:1:99999', 'explain' => true),
'board_contact' => array('lang' => 'CONTACT_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true),
'board_contact_name' => array('lang' => 'CONTACT_EMAIL_NAME', 'validate' => 'string', 'type' => 'text:25:50', 'explain' => true),
'board_email' => array('lang' => 'ADMIN_EMAIL', 'validate' => 'email', 'type' => 'email:25:100', 'explain' => true),
+ 'email_force_sender' => array('lang' => 'EMAIL_FORCE_SENDER', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'board_email_sig' => array('lang' => 'EMAIL_SIG', 'validate' => 'string', 'type' => 'textarea:5:30', 'explain' => true),
'board_hide_emails' => array('lang' => 'BOARD_HIDE_EMAILS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'send_test_email' => array('lang' => 'SEND_TEST_EMAIL', 'validate' => 'bool', 'type' => 'custom', 'method' => 'send_test_email', 'explain' => true),
@@ -503,7 +509,7 @@ class acp_board
$error[] = $user->lang['FORM_INVALID'];
}
// Do not write values if there is an error
- if (sizeof($error))
+ if (count($error))
{
$submit = false;
}
@@ -532,13 +538,6 @@ class acp_board
$this->new_config[$config_name] = $config_value = $cfg_array[$config_name];
- if ($config_name == 'email_function_name')
- {
- $this->new_config['email_function_name'] = trim(str_replace(array('(', ')'), array('', ''), $this->new_config['email_function_name']));
- $this->new_config['email_function_name'] = (empty($this->new_config['email_function_name']) || !function_exists($this->new_config['email_function_name'])) ? 'mail' : $this->new_config['email_function_name'];
- $config_value = $this->new_config['email_function_name'];
- }
-
if ($submit)
{
if (strpos($data['type'], 'password') === 0 && $config_value === '********')
@@ -690,7 +689,7 @@ class acp_board
'L_TITLE' => $user->lang[$display_vars['title']],
'L_TITLE_EXPLAIN' => $user->lang[$display_vars['title'] . '_EXPLAIN'],
- 'S_ERROR' => (sizeof($error)) ? true : false,
+ 'S_ERROR' => (count($error)) ? true : false,
'ERROR_MSG' => implode('<br />', $error),
'U_ACTION' => $this->u_action)
@@ -736,7 +735,7 @@ class acp_board
$template->assign_block_vars('options', array(
'KEY' => $config_key,
'TITLE' => (isset($user->lang[$vars['lang']])) ? $user->lang[$vars['lang']] : $vars['lang'],
- 'S_EXPLAIN' => $vars['explain'],
+ 'S_EXPLAIN' => $vars['explain'] && !empty($l_explain),
'TITLE_EXPLAIN' => $l_explain,
'CONTENT' => $content,
)
@@ -1110,7 +1109,7 @@ class acp_board
$db->sql_query($sql);
// Already emptied for all...
- if (sizeof($values))
+ if (count($values))
{
// Set for selected forums
$sql = 'UPDATE ' . FORUMS_TABLE . '
diff --git a/phpBB/includes/acp/acp_bots.php b/phpBB/includes/acp/acp_bots.php
index e89b16663c..8bd357bc91 100644
--- a/phpBB/includes/acp/acp_bots.php
+++ b/phpBB/includes/acp/acp_bots.php
@@ -55,7 +55,7 @@ class acp_bots
switch ($action)
{
case 'activate':
- if ($bot_id || sizeof($mark))
+ if ($bot_id || count($mark))
{
$sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')';
@@ -69,7 +69,7 @@ class acp_bots
break;
case 'deactivate':
- if ($bot_id || sizeof($mark))
+ if ($bot_id || count($mark))
{
$sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')';
@@ -83,7 +83,7 @@ class acp_bots
break;
case 'delete':
- if ($bot_id || sizeof($mark))
+ if ($bot_id || count($mark))
{
if (confirm_box(true))
{
@@ -109,7 +109,7 @@ class acp_bots
WHERE bot_id $sql_id";
$db->sql_query($sql);
- if (sizeof($user_id_ary))
+ if (count($user_id_ary))
{
$_tables = array(USERS_TABLE, USER_GROUP_TABLE);
foreach ($_tables as $table)
@@ -207,7 +207,7 @@ class acp_bots
$error[] = $user->lang['BOT_NAME_TAKEN'];
}
- if (!sizeof($error))
+ if (!count($error))
{
// New bot? Create a new user and group entry
if ($action == 'add')
@@ -338,7 +338,7 @@ class acp_bots
'L_TITLE' => $user->lang['BOT_' . $l_title],
'U_ACTION' => $this->u_action . "&amp;id=$bot_id&amp;action=$action",
'U_BACK' => $this->u_action,
- 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'BOT_NAME' => $bot_row['bot_name'],
'BOT_IP' => $bot_row['bot_ip'],
@@ -348,7 +348,7 @@ class acp_bots
'S_ACTIVE_OPTIONS' => $s_active_options,
'S_STYLE_OPTIONS' => $style_select,
'S_LANG_OPTIONS' => $lang_select,
- 'S_ERROR' => (sizeof($error)) ? true : false,
+ 'S_ERROR' => (count($error)) ? true : false,
)
);
diff --git a/phpBB/includes/acp/acp_database.php b/phpBB/includes/acp/acp_database.php
index 00c7ef40c0..677fce7217 100644
--- a/phpBB/includes/acp/acp_database.php
+++ b/phpBB/includes/acp/acp_database.php
@@ -23,6 +23,7 @@ class acp_database
{
var $db_tools;
var $u_action;
+ public $page_title;
function main($id, $mode)
{
@@ -57,9 +58,8 @@ class acp_database
$type = $request->variable('type', '');
$table = array_intersect($this->db_tools->sql_list_tables(), $request->variable('table', array('')));
$format = $request->variable('method', '');
- $where = $request->variable('where', '');
- if (!sizeof($table))
+ if (!count($table))
{
trigger_error($user->lang['TABLE_SELECT_ERROR'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -69,17 +69,9 @@ class acp_database
trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
}
- $store = $download = $structure = $schema_data = false;
-
- if ($where == 'store_and_download' || $where == 'store')
- {
- $store = true;
- }
-
- if ($where == 'store_and_download' || $where == 'download')
- {
- $download = true;
- }
+ $store = true;
+ $structure = false;
+ $schema_data = false;
if ($type == 'full' || $type == 'structure')
{
@@ -98,8 +90,9 @@ class acp_database
$filename = 'backup_' . $time . '_' . unique_id();
+ /** @var phpbb\db\extractor\extractor_interface $extractor Database extractor */
$extractor = $phpbb_container->get('dbal.extractor');
- $extractor->init_extractor($format, $filename, $time, $download, $store);
+ $extractor->init_extractor($format, $filename, $time, false, $store);
$extractor->write_start($table_prefix);
@@ -145,11 +138,6 @@ class acp_database
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_BACKUP');
- if ($download == true)
- {
- exit;
- }
-
trigger_error($user->lang['BACKUP_SUCCESS'] . adm_back_link($this->u_action));
break;
@@ -201,16 +189,10 @@ class acp_database
case 'submit':
$delete = $request->variable('delete', '');
$file = $request->variable('file', '');
- $download = $request->variable('download', '');
- if (!preg_match('#^backup_\d{10,}_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches))
- {
- trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
- }
-
- $file_name = $phpbb_root_path . 'store/' . $matches[0];
+ $backup_info = $this->get_backup_file($phpbb_root_path . 'store/', $file);
- if (!file_exists($file_name) || !is_readable($file_name))
+ if (empty($backup_info) || !is_readable($backup_info['file_name']))
{
trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -219,7 +201,7 @@ class acp_database
{
if (confirm_box(true))
{
- unlink($file_name);
+ unlink($backup_info['file_name']);
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_DB_DELETE');
trigger_error($user->lang['BACKUP_DELETE'] . adm_back_link($this->u_action));
}
@@ -228,50 +210,12 @@ class acp_database
confirm_box(false, $user->lang['DELETE_SELECTED_BACKUP'], build_hidden_fields(array('delete' => $delete, 'file' => $file)));
}
}
- else if ($download || confirm_box(true))
+ else if (confirm_box(true))
{
- if ($download)
- {
- $name = $matches[0];
-
- switch ($matches[1])
- {
- case 'sql':
- $mimetype = 'text/x-sql';
- break;
- case 'sql.bz2':
- $mimetype = 'application/x-bzip2';
- break;
- case 'sql.gz':
- $mimetype = 'application/x-gzip';
- break;
- }
-
- header('Cache-Control: private, no-cache');
- header("Content-Type: $mimetype; name=\"$name\"");
- header("Content-disposition: attachment; filename=$name");
-
- @set_time_limit(0);
-
- $fp = @fopen($file_name, 'rb');
-
- if ($fp !== false)
- {
- while (!feof($fp))
- {
- echo fread($fp, 8192);
- }
- fclose($fp);
- }
-
- flush();
- exit;
- }
-
- switch ($matches[1])
+ switch ($backup_info['extension'])
{
case 'sql':
- $fp = fopen($file_name, 'rb');
+ $fp = fopen($backup_info['file_name'], 'rb');
$read = 'fread';
$seek = 'fseek';
$eof = 'feof';
@@ -280,7 +224,7 @@ class acp_database
break;
case 'sql.bz2':
- $fp = bzopen($file_name, 'r');
+ $fp = bzopen($backup_info['file_name'], 'r');
$read = 'bzread';
$seek = '';
$eof = 'feof';
@@ -289,13 +233,17 @@ class acp_database
break;
case 'sql.gz':
- $fp = gzopen($file_name, 'rb');
+ $fp = gzopen($backup_info['file_name'], 'rb');
$read = 'gzread';
$seek = 'gzseek';
$eof = 'gzeof';
$close = 'gzclose';
$fgetd = 'fgetd';
break;
+
+ default:
+ trigger_error($user->lang['BACKUP_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
+ return;
}
switch ($db->get_sql_layer())
@@ -375,43 +323,13 @@ class acp_database
trigger_error($user->lang['RESTORE_SUCCESS'] . adm_back_link($this->u_action));
break;
}
- else if (!$download)
+ else
{
confirm_box(false, $user->lang['RESTORE_SELECTED_BACKUP'], build_hidden_fields(array('file' => $file)));
}
default:
- $methods = array('sql');
- $available_methods = array('sql.gz' => 'zlib', 'sql.bz2' => 'bz2');
-
- foreach ($available_methods as $type => $module)
- {
- if (!@extension_loaded($module))
- {
- continue;
- }
- $methods[] = $type;
- }
-
- $dir = $phpbb_root_path . 'store/';
- $dh = @opendir($dir);
-
- $backup_files = array();
-
- if ($dh)
- {
- while (($file = readdir($dh)) !== false)
- {
- if (preg_match('#^backup_(\d{10,})_[a-z\d]{16}\.(sql(?:\.(?:gz|bz2))?)$#', $file, $matches))
- {
- if (in_array($matches[2], $methods))
- {
- $backup_files[(int) $matches[1]] = $file;
- }
- }
- }
- closedir($dh);
- }
+ $backup_files = $this->get_file_list($phpbb_root_path . 'store/');
if (!empty($backup_files))
{
@@ -420,8 +338,8 @@ class acp_database
foreach ($backup_files as $name => $file)
{
$template->assign_block_vars('files', array(
- 'FILE' => $file,
- 'NAME' => $user->format_date($name, 'd-m-Y H:i:s', true),
+ 'FILE' => sha1($file),
+ 'NAME' => $user->format_date($name, 'd-m-Y H:i', true),
'SUPPORTED' => true,
));
}
@@ -435,6 +353,92 @@ class acp_database
break;
}
}
+
+ /**
+ * Get backup file from file hash
+ *
+ * @param string $directory Relative path to directory
+ * @param string $file_hash Hash of selected file
+ *
+ * @return array Backup file data or empty array if unable to find file
+ */
+ protected function get_backup_file($directory, $file_hash)
+ {
+ $backup_data = [];
+
+ $file_list = $this->get_file_list($directory);
+ $supported_extensions = $this->get_supported_extensions();
+
+ foreach ($file_list as $file)
+ {
+ preg_match('#^backup_(\d{10,})_(?:[a-z\d]{16}|[a-z\d]{32})\.(sql(?:\.(?:gz|bz2))?)$#i', $file, $matches);
+ if (sha1($file) === $file_hash && in_array($matches[2], $supported_extensions))
+ {
+ $backup_data = [
+ 'file_name' => $directory . $file,
+ 'extension' => $matches[2],
+ ];
+ break;
+ }
+ }
+
+ return $backup_data;
+ }
+
+ /**
+ * Get backup file list for directory
+ *
+ * @param string $directory Relative path to backup directory
+ *
+ * @return array List of backup files in specified directory
+ */
+ protected function get_file_list($directory)
+ {
+ $supported_extensions = $this->get_supported_extensions();
+
+ $dh = @opendir($directory);
+
+ $backup_files = [];
+
+ if ($dh)
+ {
+ while (($file = readdir($dh)) !== false)
+ {
+ if (preg_match('#^backup_(\d{10,})_(?:[a-z\d]{16}|[a-z\d]{32})\.(sql(?:\.(?:gz|bz2))?)$#i', $file, $matches))
+ {
+ if (in_array($matches[2], $supported_extensions))
+ {
+ $backup_files[(int) $matches[1]] = $file;
+ }
+ }
+ }
+ closedir($dh);
+ }
+
+ return $backup_files;
+ }
+
+ /**
+ * Get supported extensions for backup
+ *
+ * @return array List of supported extensions
+ */
+ protected function get_supported_extensions()
+ {
+ $extensions = ['sql'];
+ $available_methods = ['sql.gz' => 'zlib', 'sql.bz2' => 'bz2'];
+
+ foreach ($available_methods as $type => $module)
+ {
+ if (!@extension_loaded($module))
+ {
+ continue;
+ }
+ $extensions[] = $type;
+ }
+
+ return $extensions;
+ }
}
// get how much space we allow for a chunk of data, very similar to phpMyAdmin's way of doing things ;-) (hey, we only do this for MySQL anyway :P)
@@ -495,7 +499,7 @@ function sanitize_data_mssql($text)
{
$val[] = "'" . $value . "'";
}
- if (sizeof($matches[0]))
+ if (count($matches[0]))
{
$val[] = 'char(' . ord(array_shift($matches[0])) . ')';
}
@@ -519,7 +523,7 @@ function sanitize_data_oracle($text)
{
$val[] = "'" . $value . "'";
}
- if (sizeof($matches[0]))
+ if (count($matches[0]))
{
$val[] = 'chr(' . ord(array_shift($matches[0])) . ')';
}
@@ -541,7 +545,7 @@ function sanitize_data_generic($text)
{
$val[] = "'" . $value . "'";
}
- if (sizeof($matches[0]))
+ if (count($matches[0]))
{
$val[] = "'" . array_shift($matches[0]) . "'";
}
@@ -583,7 +587,7 @@ function fgetd_seekless(&$fp, $delim, $read, $seek, $eof, $buffer = 8192)
static $array = array();
static $record = '';
- if (!sizeof($array))
+ if (!count($array))
{
while (!$eof($fp))
{
@@ -605,7 +609,7 @@ function fgetd_seekless(&$fp, $delim, $read, $seek, $eof, $buffer = 8192)
}
}
- if (sizeof($array))
+ if (count($array))
{
return array_shift($array);
}
diff --git a/phpBB/includes/acp/acp_email.php b/phpBB/includes/acp/acp_email.php
index 57eefad02d..5a1fbac9f6 100644
--- a/phpBB/includes/acp/acp_email.php
+++ b/phpBB/includes/acp/acp_email.php
@@ -68,7 +68,7 @@ class acp_email
$error[] = $user->lang['NO_EMAIL_MESSAGE'];
}
- if (!sizeof($error))
+ if (!count($error))
{
if (!empty($usernames))
{
@@ -168,7 +168,7 @@ class acp_email
{
$i = 0;
- if (sizeof($email_list))
+ if (count($email_list))
{
$j++;
}
@@ -235,16 +235,16 @@ class acp_email
);
extract($phpbb_dispatcher->trigger_event('core.acp_email_send_before', compact($vars)));
- for ($i = 0, $size = sizeof($email_list); $i < $size; $i++)
+ for ($i = 0, $size = count($email_list); $i < $size; $i++)
{
$used_lang = $email_list[$i][0]['lang'];
$used_method = $email_list[$i][0]['method'];
- for ($j = 0, $list_size = sizeof($email_list[$i]); $j < $list_size; $j++)
+ for ($j = 0, $list_size = count($email_list[$i]); $j < $list_size; $j++)
{
$email_row = $email_list[$i][$j];
- $messenger->{((sizeof($email_list[$i]) == 1) ? 'to' : 'bcc')}($email_row['email'], $email_row['name']);
+ $messenger->{((count($email_list[$i]) == 1) ? 'to' : 'bcc')}($email_row['email'], $email_row['name']);
$messenger->im($email_row['jabber'], $email_row['name']);
}
@@ -322,8 +322,8 @@ class acp_email
$s_priority_options .= '<option value="' . MAIL_HIGH_PRIORITY . '">' . $user->lang['MAIL_HIGH_PRIORITY'] . '</option>';
$template_data = array(
- 'S_WARNING' => (sizeof($error)) ? true : false,
- 'WARNING_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'S_WARNING' => (count($error)) ? true : false,
+ 'WARNING_MSG' => (count($error)) ? implode('<br />', $error) : '',
'U_ACTION' => $this->u_action,
'S_GROUP_OPTIONS' => $select_list,
'USERNAMES' => implode("\n", $usernames),
diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php
index 6f65dc9fa0..a1cb2108e7 100644
--- a/phpBB/includes/acp/acp_extensions.php
+++ b/phpBB/includes/acp/acp_extensions.php
@@ -35,11 +35,13 @@ class acp_extensions
private $request;
private $phpbb_dispatcher;
private $ext_manager;
+ private $phpbb_container;
+ private $php_ini;
function main()
{
// Start the page
- global $config, $user, $template, $request, $phpbb_extension_manager, $phpbb_root_path, $phpbb_log, $phpbb_dispatcher;
+ global $config, $user, $template, $request, $phpbb_extension_manager, $phpbb_root_path, $phpbb_log, $phpbb_dispatcher, $phpbb_container;
$this->config = $config;
$this->template = $template;
@@ -48,6 +50,8 @@ class acp_extensions
$this->log = $phpbb_log;
$this->phpbb_dispatcher = $phpbb_dispatcher;
$this->ext_manager = $phpbb_extension_manager;
+ $this->phpbb_container = $phpbb_container;
+ $this->php_ini = $this->phpbb_container->get('php_ini');
$this->user->add_lang(array('install', 'acp/extensions', 'migrator'));
@@ -57,7 +61,7 @@ class acp_extensions
$ext_name = $this->request->variable('ext_name', '');
// What is a safe limit of execution time? Half the max execution time should be safe.
- $safe_time_limit = (ini_get('max_execution_time') / 2);
+ $safe_time_limit = ($this->php_ini->getNumeric('max_execution_time') / 2);
$start_time = time();
// Cancel action
diff --git a/phpBB/includes/acp/acp_forums.php b/phpBB/includes/acp/acp_forums.php
index 66bb630241..cb0593b14a 100644
--- a/phpBB/includes/acp/acp_forums.php
+++ b/phpBB/includes/acp/acp_forums.php
@@ -90,7 +90,7 @@ class acp_forums
$errors = $this->delete_forum($forum_id, $action_posts, $action_subforums, $posts_to_id, $subforums_to_id);
- if (sizeof($errors))
+ if (count($errors))
{
break;
}
@@ -198,7 +198,7 @@ class acp_forums
$errors = $this->update_forum_data($forum_data);
- if (!sizeof($errors))
+ if (!count($errors))
{
$forum_perm_from = $request->variable('forum_perm_from', 0);
$cache->destroy('sql', FORUMS_TABLE);
@@ -622,7 +622,7 @@ class acp_forums
$template_data = array(
'S_EDIT_FORUM' => true,
- 'S_ERROR' => (sizeof($errors)) ? true : false,
+ 'S_ERROR' => (count($errors)) ? true : false,
'S_PARENT_ID' => $this->parent_id,
'S_FORUM_PARENT_ID' => $forum_data['parent_id'],
'S_ADD_ACTION' => ($action == 'add') ? true : false,
@@ -632,7 +632,7 @@ class acp_forums
'L_COPY_PERMISSIONS_EXPLAIN' => $user->lang['COPY_PERMISSIONS_' . strtoupper($action) . '_EXPLAIN'],
'L_TITLE' => $user->lang[$this->page_title],
- 'ERROR_MSG' => (sizeof($errors)) ? implode('<br />', $errors) : '',
+ 'ERROR_MSG' => (count($errors)) ? implode('<br />', $errors) : '',
'FORUM_NAME' => $forum_data['forum_name'],
'FORUM_DATA_LINK' => $forum_data['forum_link'],
@@ -772,8 +772,8 @@ class acp_forums
'S_FORUM_LINK' => ($forum_data['forum_type'] == FORUM_LINK) ? true : false,
'S_HAS_SUBFORUMS' => ($forum_data['right_id'] - $forum_data['left_id'] > 1) ? true : false,
'S_FORUMS_LIST' => $forums_list,
- 'S_ERROR' => (sizeof($errors)) ? true : false,
- 'ERROR_MSG' => (sizeof($errors)) ? implode('<br />', $errors) : '')
+ 'S_ERROR' => (count($errors)) ? true : false,
+ 'ERROR_MSG' => (count($errors)) ? implode('<br />', $errors) : '')
);
return;
@@ -924,7 +924,7 @@ class acp_forums
unset($rowset);
$template->assign_vars(array(
- 'ERROR_MSG' => (sizeof($errors)) ? implode('<br />', $errors) : '',
+ 'ERROR_MSG' => (count($errors)) ? implode('<br />', $errors) : '',
'NAVIGATION' => $navigation,
'FORUM_BOX' => $forum_box,
'U_SEL_ACTION' => $this->u_action,
@@ -986,6 +986,13 @@ class acp_forums
$errors[] = $user->lang['FORUM_NAME_EMPTY'];
}
+ // No Emojis
+ if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $forum_data_ary['forum_name'], $matches))
+ {
+ $character_list = implode('<br>', $matches[0]);
+ $errors[] = $user->lang('FORUM_NAME_EMOJI', $character_list);
+ }
+
if (utf8_strlen($forum_data_ary['forum_desc']) > 4000)
{
$errors[] = $user->lang['FORUM_DESC_TOO_LONG'];
@@ -1012,7 +1019,7 @@ class acp_forums
}
$range_test_ary = array(
- array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'TINT:0'),
+ array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'USINT:0'),
);
if (!empty($forum_data_ary['forum_image']) && !file_exists($phpbb_root_path . $forum_data_ary['forum_image']))
@@ -1053,7 +1060,7 @@ class acp_forums
// What are we going to do tonight Brain? The same thing we do everynight,
// try to take over the world ... or decide whether to continue update
// and if so, whether it's a new forum/cat/link or an existing one
- if (sizeof($errors))
+ if (count($errors))
{
return $errors;
}
@@ -1217,12 +1224,12 @@ class acp_forums
$errors = array_merge($errors, $this->delete_forum_content($_row['forum_id']));
}
- if (sizeof($errors))
+ if (count($errors))
{
return $errors;
}
- if (sizeof($forum_ids))
+ if (count($forum_ids))
{
$sql = 'DELETE FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
@@ -1252,7 +1259,7 @@ class acp_forums
$allowed_forums = array_diff($allowed_forums, $forum_ids);
$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "
- SET allowed_forums = '" . ((sizeof($allowed_forums)) ? serialize($allowed_forums) : '') . "'
+ SET allowed_forums = '" . ((count($allowed_forums)) ? serialize($allowed_forums) : '') . "'
WHERE group_id = {$_row['group_id']}";
$db->sql_query($sql);
}
@@ -1321,7 +1328,7 @@ class acp_forums
$forum_data_sql['forum_last_poster_colour'] = '';
}
- if (sizeof($errors))
+ if (count($errors))
{
return $errors;
}
@@ -1338,7 +1345,7 @@ class acp_forums
}
}
- if (sizeof($errors))
+ if (count($errors))
{
return $errors;
}
@@ -1431,12 +1438,14 @@ class acp_forums
return $errors;
}
+ $db->sql_transaction('begin');
+
$moved_forums = get_forum_branch($from_id, 'children', 'descending');
$from_data = $moved_forums[0];
- $diff = sizeof($moved_forums) * 2;
+ $diff = count($moved_forums) * 2;
$moved_ids = array();
- for ($i = 0, $size = sizeof($moved_forums); $i < $size; ++$i)
+ for ($i = 0, $size = count($moved_forums); $i < $size; ++$i)
{
$moved_ids[] = $moved_forums[$i]['forum_id'];
}
@@ -1502,6 +1511,8 @@ class acp_forums
WHERE " . $db->sql_in_set('forum_id', $moved_ids);
$db->sql_query($sql);
+ $db->sql_transaction('commit');
+
return $errors;
}
@@ -1537,6 +1548,16 @@ class acp_forums
$table_ary = array(LOG_TABLE, POSTS_TABLE, TOPICS_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE);
+ /**
+ * Perform additional actions before move forum content
+ *
+ * @event core.acp_manage_forums_move_content_sql_before
+ * @var array table_ary Array of tables from which forum_id will be updated
+ * @since 3.2.4-RC1
+ */
+ $vars = array('table_ary');
+ extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_move_content_sql_before', compact($vars)));
+
foreach ($table_ary as $table)
{
$sql = "UPDATE $table
@@ -1612,7 +1633,7 @@ class acp_forums
}
}
- if (sizeof($errors))
+ if (count($errors))
{
return $errors;
}
@@ -1628,12 +1649,12 @@ class acp_forums
$errors = array_merge($errors, $this->delete_forum_content($row['forum_id']));
}
- if (sizeof($errors))
+ if (count($errors))
{
return $errors;
}
- $diff = sizeof($forum_ids) * 2;
+ $diff = count($forum_ids) * 2;
$sql = 'DELETE FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
@@ -1706,7 +1727,7 @@ class acp_forums
}
}
- if (sizeof($errors))
+ if (count($errors))
{
return $errors;
}
@@ -1754,7 +1775,7 @@ class acp_forums
$allowed_forums = array_diff($allowed_forums, $forum_ids);
$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "
- SET allowed_forums = '" . ((sizeof($allowed_forums)) ? serialize($allowed_forums) : '') . "'
+ SET allowed_forums = '" . ((count($allowed_forums)) ? serialize($allowed_forums) : '') . "'
WHERE group_id = {$row['group_id']}";
$db->sql_query($sql);
}
@@ -1927,9 +1948,9 @@ class acp_forums
}
$db->sql_freeresult($result);
- if (sizeof($ids))
+ if (count($ids))
{
- $start += sizeof($ids);
+ $start += count($ids);
foreach ($tables as $table)
{
@@ -1937,7 +1958,7 @@ class acp_forums
}
}
}
- while (sizeof($ids) == $batch_size);
+ while (count($ids) == $batch_size);
}
unset($ids);
@@ -1978,7 +1999,7 @@ class acp_forums
}
// Adjust users post counts
- if (sizeof($post_counts))
+ if (count($post_counts))
{
foreach ($post_counts as $poster_id => $substract)
{
@@ -2062,7 +2083,7 @@ class acp_forums
}
$db->sql_freeresult($result);
- if (!sizeof($target))
+ if (!count($target))
{
// The forum is already on top or bottom
return false;
diff --git a/phpBB/includes/acp/acp_groups.php b/phpBB/includes/acp/acp_groups.php
index 305296d013..7b1dc706db 100644
--- a/phpBB/includes/acp/acp_groups.php
+++ b/phpBB/includes/acp/acp_groups.php
@@ -29,6 +29,9 @@ class acp_groups
global $phpbb_root_path, $phpbb_admin_path, $phpEx;
global $request, $phpbb_container, $phpbb_dispatcher;
+ /** @var \phpbb\language\language $language Language object */
+ $language = $phpbb_container->get('language');
+
$user->add_lang('acp/groups');
$this->tpl_name = 'acp_groups';
$this->page_title = 'ACP_GROUPS_MANAGE';
@@ -187,7 +190,7 @@ class acp_groups
group_user_attributes('default', $group_id, $mark_ary, false, $group_name, $group_row);
- $start = (sizeof($mark_ary) < 200) ? 0 : $start + 200;
+ $start = (count($mark_ary) < 200) ? 0 : $start + 200;
}
else
{
@@ -293,7 +296,19 @@ class acp_groups
// Add user/s to group
if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, $leader, 0, $group_row))
{
- trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
+ $display_message = $language->lang($error);
+
+ if ($error == 'GROUP_USERS_INVALID')
+ {
+ // Find which users don't exist
+ $actual_name_ary = $name_ary;
+ $actual_user_id_ary = [];
+ user_get_id_name($actual_user_id_ary, $actual_name_ary, false, true);
+
+ $display_message = $language->lang('GROUP_USERS_INVALID', implode($language->lang('COMMA_SEPARATOR'), array_udiff($name_ary, $actual_name_ary, 'strcasecmp')));
+ }
+
+ trigger_error($display_message . adm_back_link($this->u_action . '&amp;action=list&amp;g=' . $group_id), E_USER_WARNING);
}
$message = ($leader) ? 'GROUP_MODS_ADDED' : 'GROUP_USERS_ADDED';
@@ -486,7 +501,7 @@ class acp_groups
$error = array_merge($error, $validation_error);
}
- if (!sizeof($error))
+ if (!count($error))
{
// Only set the rank, colour, etc. if it's changed or if we're adding a new
// group. This prevents existing group members being updated if no changes
@@ -614,7 +629,7 @@ class acp_groups
}
}
- if (sizeof($error))
+ if (count($error))
{
$error = array_map(array(&$user, 'lang'), $error);
$group_rank = $submit_ary['rank'];
@@ -732,12 +747,12 @@ class acp_groups
'S_ADD_GROUP' => ($action == 'add') ? true : false,
'S_GROUP_PERM' => ($action == 'add' && $auth->acl_get('a_authgroups') && $auth->acl_gets('a_aauth', 'a_fauth', 'a_mauth', 'a_uauth')) ? true : false,
'S_INCLUDE_SWATCH' => true,
- 'S_ERROR' => (sizeof($error)) ? true : false,
+ 'S_ERROR' => (count($error)) ? true : false,
'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false,
'S_USER_FOUNDER' => ($user->data['user_type'] == USER_FOUNDER) ? true : false,
'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
- 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'GROUP_NAME' => $group_helper->get_name($group_name),
'GROUP_INTERNAL_NAME' => $group_name,
'GROUP_DESC' => $group_desc_data['text'],
@@ -926,7 +941,7 @@ class acp_groups
);
// Get us all the groups
- $sql = 'SELECT g.group_id, g.group_name, g.group_type
+ $sql = 'SELECT g.group_id, g.group_name, g.group_type, g.group_colour
FROM ' . GROUPS_TABLE . ' g
ORDER BY g.group_type ASC, g.group_name';
$result = $db->sql_query($sql);
@@ -985,6 +1000,7 @@ class acp_groups
'S_GROUP_SPECIAL' => ($row['group_type'] == GROUP_SPECIAL) ? true : false,
'GROUP_NAME' => $group_name,
+ 'GROUP_COLOR' => $row['group_colour'],
'TOTAL_MEMBERS' => $row['total_members'],
'PENDING_MEMBERS' => $row['pending_members']
));
diff --git a/phpBB/includes/acp/acp_help_phpbb.php b/phpBB/includes/acp/acp_help_phpbb.php
index 7991a0dad6..a36b36eddc 100644
--- a/phpBB/includes/acp/acp_help_phpbb.php
+++ b/phpBB/includes/acp/acp_help_phpbb.php
@@ -48,7 +48,7 @@ class acp_help_phpbb
$error[] = $user->lang['FORM_INVALID'];
}
// Do not write values if there is an error
- if (sizeof($error))
+ if (count($error))
{
$submit = false;
}
diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php
index 6cd5386857..2c3948f644 100644
--- a/phpBB/includes/acp/acp_icons.php
+++ b/phpBB/includes/acp/acp_icons.php
@@ -166,7 +166,7 @@ class acp_icons
}
$db->sql_freeresult($result);
- if (sizeof($smilies))
+ if (count($smilies))
{
foreach ($smilies as $row)
{
@@ -301,7 +301,7 @@ class acp_icons
}
// Ok, another row for adding an addition code for a pre-existing image...
- if ($action == 'add' && $mode == 'smilies' && sizeof($smilies))
+ if ($action == 'add' && $mode == 'smilies' && count($smilies))
{
$template->assign_vars(array(
'S_ADD_CODE' => true,
@@ -378,7 +378,7 @@ class acp_icons
{
$smiley_count = $this->item_count($table);
- $addable_smileys_count = sizeof($images);
+ $addable_smileys_count = count($images);
foreach ($images as $image)
{
if (!isset($image_add[$image]))
@@ -546,8 +546,8 @@ class acp_icons
{
if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data))
{
- if ((sizeof($data[1]) != 4 && $mode == 'icons') ||
- ((sizeof($data[1]) != 6 || (empty($data[1][4]) || empty($data[1][5]))) && $mode == 'smilies' ))
+ if ((count($data[1]) != 4 && $mode == 'icons') ||
+ ((count($data[1]) != 6 || (empty($data[1][4]) || empty($data[1][5]))) && $mode == 'smilies' ))
{
trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -605,7 +605,7 @@ class acp_icons
if ($mode == 'smilies')
{
$smiley_count = $this->item_count($table);
- if ($smiley_count + sizeof($pak_ary) > SMILEY_LIMIT)
+ if ($smiley_count + count($pak_ary) > SMILEY_LIMIT)
{
trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -616,8 +616,8 @@ class acp_icons
$data = array();
if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data))
{
- if ((sizeof($data[1]) != 4 && $mode == 'icons') ||
- (sizeof($data[1]) != 6 && $mode == 'smilies'))
+ if ((count($data[1]) != 4 && $mode == 'icons') ||
+ (count($data[1]) != 6 && $mode == 'smilies'))
{
trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
diff --git a/phpBB/includes/acp/acp_inactive.php b/phpBB/includes/acp/acp_inactive.php
index ec256e93ef..4ee4cd4816 100644
--- a/phpBB/includes/acp/acp_inactive.php
+++ b/phpBB/includes/acp/acp_inactive.php
@@ -24,9 +24,9 @@ class acp_inactive
var $u_action;
var $p_master;
- function acp_inactive(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
@@ -70,7 +70,7 @@ class acp_inactive
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
- if ($submit && sizeof($mark))
+ if ($submit && count($mark))
{
if ($action !== 'delete' && !check_form_key($form_key))
{
diff --git a/phpBB/includes/acp/acp_language.php b/phpBB/includes/acp/acp_language.php
index 4baff921b6..8881f624e3 100644
--- a/phpBB/includes/acp/acp_language.php
+++ b/phpBB/includes/acp/acp_language.php
@@ -32,7 +32,7 @@ class acp_language
function main($id, $mode)
{
global $config, $db, $user, $template, $phpbb_log, $phpbb_container;
- global $phpbb_root_path, $phpEx, $request;
+ global $phpbb_root_path, $phpEx, $request, $phpbb_dispatcher;
if (!function_exists('validate_language_iso_name'))
{
@@ -229,7 +229,20 @@ class acp_language
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_LANGUAGE_PACK_DELETED', false, array($row['lang_english_name']));
- trigger_error(sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']) . adm_back_link($this->u_action));
+ $delete_message = sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']);
+ $lang_iso = $row['lang_iso'];
+ /**
+ * Run code after language deleted
+ *
+ * @event core.acp_language_after_delete
+ * @var string lang_iso Language ISO code
+ * @var string delete_message Delete message appear to user
+ * @since 3.2.2-RC1
+ */
+ $vars = array('lang_iso', 'delete_message');
+ extract($phpbb_dispatcher->trigger_event('core.acp_language_after_delete', compact($vars)));
+
+ trigger_error($delete_message . adm_back_link($this->u_action));
}
else
{
@@ -402,7 +415,7 @@ class acp_language
unset($installed);
- if (sizeof($new_ary))
+ if (count($new_ary))
{
foreach ($new_ary as $iso => $lang_ary)
{
diff --git a/phpBB/includes/acp/acp_logs.php b/phpBB/includes/acp/acp_logs.php
index c33ca8c4fc..f9bb35791c 100644
--- a/phpBB/includes/acp/acp_logs.php
+++ b/phpBB/includes/acp/acp_logs.php
@@ -57,7 +57,7 @@ class acp_logs
{
$conditions = array();
- if ($deletemark && sizeof($marked))
+ if ($deletemark && count($marked))
{
$conditions['log_id'] = array('IN' => $marked);
}
@@ -151,7 +151,7 @@ class acp_logs
{
$data = array();
- $checks = array('viewtopic', 'viewlogs', 'viewforum');
+ $checks = array('viewpost', 'viewtopic', 'viewlogs', 'viewforum');
foreach ($checks as $check)
{
if (isset($row[$check]) && $row[$check])
@@ -167,7 +167,7 @@ class acp_logs
'IP' => $row['ip'],
'DATE' => $user->format_date($row['time']),
'ACTION' => $row['action'],
- 'DATA' => (sizeof($data)) ? implode(' | ', $data) : '',
+ 'DATA' => (count($data)) ? implode(' | ', $data) : '',
'ID' => $row['id'],
)
);
diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php
index 9b1a248923..8f169d15a7 100644
--- a/phpBB/includes/acp/acp_main.php
+++ b/phpBB/includes/acp/acp_main.php
@@ -337,7 +337,7 @@ class acp_main
}
unset($posted);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary);
}
@@ -585,6 +585,7 @@ class acp_main
'U_INACTIVE_USERS' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=inactive&amp;mode=list'),
'U_VERSIONCHECK' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=update&amp;mode=version_check'),
'U_VERSIONCHECK_FORCE' => append_sid("{$phpbb_admin_path}index.$phpEx", 'versioncheck_force=1'),
+ 'U_ATTACH_ORPHAN' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=acp_attachments&mode=orphan'),
'S_VERSIONCHECK' => ($auth->acl_get('a_board')) ? true : false,
'S_ACTION_OPTIONS' => ($auth->acl_get('a_board')) ? true : false,
diff --git a/phpBB/includes/acp/acp_modules.php b/phpBB/includes/acp/acp_modules.php
index 4d90b2da8b..fb0c09055e 100644
--- a/phpBB/includes/acp/acp_modules.php
+++ b/phpBB/includes/acp/acp_modules.php
@@ -249,7 +249,7 @@ class acp_modules
trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
}
- if (!sizeof($errors))
+ if (!count($errors))
{
$module_manager->remove_cache_file($this->module_class);
@@ -364,7 +364,7 @@ class acp_modules
trigger_error($msg . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
}
- if (!sizeof($errors))
+ if (!count($errors))
{
$module_manager->remove_cache_file($this->module_class);
@@ -430,7 +430,7 @@ class acp_modules
array_change_key_case($module_data, CASE_UPPER))
);
- if (sizeof($errors))
+ if (count($errors))
{
$template->assign_vars(array(
'S_ERROR' => true,
@@ -444,7 +444,7 @@ class acp_modules
}
// Default management page
- if (sizeof($errors))
+ if (count($errors))
{
if ($request->is_ajax())
{
diff --git a/phpBB/includes/acp/acp_permission_roles.php b/phpBB/includes/acp/acp_permission_roles.php
index 0bfe67830f..80cad9915d 100644
--- a/phpBB/includes/acp/acp_permission_roles.php
+++ b/phpBB/includes/acp/acp_permission_roles.php
@@ -348,7 +348,7 @@ class acp_permission_roles
{
$hold_ary = $this->auth_admin->get_role_mask($role_id);
- if (sizeof($hold_ary))
+ if (count($hold_ary))
{
$role_name = (!empty($user->lang[$role_row['role_name']])) ? $user->lang[$role_row['role_name']] : $role_row['role_name'];
@@ -496,7 +496,7 @@ class acp_permission_roles
$content_array = $content_array[0];
- $template->assign_var('S_NUM_PERM_COLS', sizeof($categories));
+ $template->assign_var('S_NUM_PERM_COLS', count($categories));
// Assign to template
foreach ($content_array as $cat => $cat_array)
diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php
index 12c43bf94c..e683b1972e 100644
--- a/phpBB/includes/acp/acp_permissions.php
+++ b/phpBB/includes/acp/acp_permissions.php
@@ -131,11 +131,11 @@ class acp_permissions
}
unset($usernames);
- if (sizeof($username) && !sizeof($user_id))
+ if (count($username) && !count($user_id))
{
user_get_id_name($user_id, $username);
- if (!sizeof($user_id))
+ if (!count($user_id))
{
trigger_error($user->lang['SELECTED_USER_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -260,17 +260,17 @@ class acp_permissions
{
$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
- if ($all_users && sizeof($items['user_ids']))
+ if ($all_users && count($items['user_ids']))
{
$user_id = $items['user_ids'];
}
- else if ($all_groups && sizeof($items['group_ids']))
+ else if ($all_groups && count($items['group_ids']))
{
$group_id = $items['group_ids'];
}
}
- if (sizeof($user_id) || sizeof($group_id))
+ if (count($user_id) || count($group_id))
{
$this->remove_permissions($mode, $permission_type, $auth_admin, $user_id, $group_id, $forum_id);
}
@@ -349,7 +349,7 @@ class acp_permissions
{
case 'forum_dropdown':
- if (sizeof($forum_id))
+ if (count($forum_id))
{
$this->check_existence('forum', $forum_id);
continue 2;
@@ -364,7 +364,7 @@ class acp_permissions
case 'forums':
- if (sizeof($forum_id))
+ if (count($forum_id))
{
$this->check_existence('forum', $forum_id);
continue 2;
@@ -394,7 +394,7 @@ class acp_permissions
case 'user':
- if (sizeof($user_id))
+ if (count($user_id))
{
$this->check_existence('user', $user_id);
continue 2;
@@ -409,7 +409,7 @@ class acp_permissions
case 'group':
- if (sizeof($group_id))
+ if (count($group_id))
{
$this->check_existence('group', $group_id);
continue 2;
@@ -428,14 +428,14 @@ class acp_permissions
$all_users = (isset($_POST['all_users'])) ? true : false;
$all_groups = (isset($_POST['all_groups'])) ? true : false;
- if ((sizeof($user_id) && !$all_users) || (sizeof($group_id) && !$all_groups))
+ if ((count($user_id) && !$all_users) || (count($group_id) && !$all_groups))
{
- if (sizeof($user_id))
+ if (count($user_id))
{
$this->check_existence('user', $user_id);
}
- if (sizeof($group_id))
+ if (count($group_id))
{
$this->check_existence('group', $group_id);
}
@@ -446,13 +446,13 @@ class acp_permissions
// Now we check the users... because the "all"-selection is different here (all defined users/groups)
$items = $this->retrieve_defined_user_groups($permission_scope, $forum_id, $permission_type);
- if ($all_users && sizeof($items['user_ids']))
+ if ($all_users && count($items['user_ids']))
{
$user_id = $items['user_ids'];
continue 2;
}
- if ($all_groups && sizeof($items['group_ids']))
+ if ($all_groups && count($items['group_ids']))
{
$group_id = $items['group_ids'];
continue 2;
@@ -487,14 +487,14 @@ class acp_permissions
'ANONYMOUS_USER_ID' => ANONYMOUS,
'S_SELECT_VICTIM' => true,
- 'S_ALLOW_ALL_SELECT' => (sizeof($forum_id) > 5) ? false : true,
+ 'S_ALLOW_ALL_SELECT' => (count($forum_id) > 5) ? false : true,
'S_CAN_SELECT_USER' => ($auth->acl_get('a_authusers')) ? true : false,
'S_CAN_SELECT_GROUP' => ($auth->acl_get('a_authgroups')) ? true : false,
'S_HIDDEN_FIELDS' => $s_hidden_fields)
);
// Let the forum names being displayed
- if (sizeof($forum_id))
+ if (count($forum_id))
{
$sql = 'SELECT forum_name
FROM ' . FORUMS_TABLE . '
@@ -510,7 +510,7 @@ class acp_permissions
$db->sql_freeresult($result);
$template->assign_vars(array(
- 'S_FORUM_NAMES' => (sizeof($forum_names)) ? true : false,
+ 'S_FORUM_NAMES' => (count($forum_names)) ? true : false,
'FORUM_NAMES' => implode($user->lang['COMMA_SEPARATOR'], $forum_names))
);
}
@@ -527,13 +527,13 @@ class acp_permissions
));
// Do not allow forum_ids being set and no other setting defined (will bog down the server too much)
- if (sizeof($forum_id) && !sizeof($user_id) && !sizeof($group_id))
+ if (count($forum_id) && !count($user_id) && !count($group_id))
{
trigger_error($user->lang['ONLY_FORUM_DEFINED'] . adm_back_link($this->u_action), E_USER_WARNING);
}
$template->assign_vars(array(
- 'S_PERMISSION_DROPDOWN' => (sizeof($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
+ 'S_PERMISSION_DROPDOWN' => (count($this->permission_dropdown) > 1) ? $this->build_permission_dropdown($this->permission_dropdown, $permission_type, $permission_scope) : false,
'L_PERMISSION_TYPE' => $this->permissions->get_type_lang($permission_type),
'U_ACTION' => $this->u_action,
@@ -546,8 +546,8 @@ class acp_permissions
'S_SETTING_PERMISSIONS' => true)
);
- $hold_ary = $auth_admin->get_mask('set', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO);
- $auth_admin->display_mask('set', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
+ $hold_ary = $auth_admin->get_mask('set', (count($user_id)) ? $user_id : false, (count($group_id)) ? $group_id : false, (count($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NO);
+ $auth_admin->display_mask('set', $permission_type, $hold_ary, ((count($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
}
else
{
@@ -555,8 +555,8 @@ class acp_permissions
'S_VIEWING_PERMISSIONS' => true)
);
- $hold_ary = $auth_admin->get_mask('view', (sizeof($user_id)) ? $user_id : false, (sizeof($group_id)) ? $group_id : false, (sizeof($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NEVER);
- $auth_admin->display_mask('view', $permission_type, $hold_ary, ((sizeof($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
+ $hold_ary = $auth_admin->get_mask('view', (count($user_id)) ? $user_id : false, (count($group_id)) ? $group_id : false, (count($forum_id)) ? $forum_id : false, $permission_type, $permission_scope, ACL_NEVER);
+ $auth_admin->display_mask('view', $permission_type, $hold_ary, ((count($user_id)) ? 'user' : 'group'), (($permission_scope == 'local') ? true : false));
}
}
@@ -652,7 +652,7 @@ class acp_permissions
break;
}
- if (sizeof($ids))
+ if (count($ids))
{
$sql = "SELECT $sql_id
FROM $table
@@ -667,7 +667,7 @@ class acp_permissions
$db->sql_freeresult($result);
}
- if (!sizeof($ids))
+ if (!count($ids))
{
trigger_error($user->lang['SELECTED_' . strtoupper($mode) . '_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -676,7 +676,7 @@ class acp_permissions
/**
* Apply permissions
*/
- function set_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
+ function set_permissions($mode, $permission_type, $auth_admin, &$user_id, &$group_id)
{
global $db, $cache, $user, $auth;
global $request;
@@ -684,7 +684,7 @@ class acp_permissions
$psubmit = $request->variable('psubmit', array(0 => array(0 => 0)));
// User or group to be set?
- $ug_type = (sizeof($user_id)) ? 'user' : 'group';
+ $ug_type = (count($user_id)) ? 'user' : 'group';
// Check the permission setting again
if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
@@ -715,7 +715,7 @@ class acp_permissions
$ug_id = array($ug_id);
$forum_id = array($forum_id);
- if (sizeof($inherit))
+ if (count($inherit))
{
foreach ($inherit as $_ug_id => $forum_id_ary)
{
@@ -765,13 +765,13 @@ class acp_permissions
/**
* Apply all permissions
*/
- function set_all_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id)
+ function set_all_permissions($mode, $permission_type, $auth_admin, &$user_id, &$group_id)
{
global $db, $cache, $user, $auth;
global $request;
// User or group to be set?
- $ug_type = (sizeof($user_id)) ? 'user' : 'group';
+ $ug_type = (count($user_id)) ? 'user' : 'group';
// Check the permission setting again
if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
@@ -870,7 +870,7 @@ class acp_permissions
}
}
- if (sizeof(array_diff_assoc($auth_settings, $test_auth_settings)))
+ if (count(array_diff_assoc($auth_settings, $test_auth_settings)))
{
return false;
}
@@ -881,12 +881,12 @@ class acp_permissions
/**
* Remove permissions
*/
- function remove_permissions($mode, $permission_type, &$auth_admin, &$user_id, &$group_id, &$forum_id)
+ function remove_permissions($mode, $permission_type, $auth_admin, &$user_id, &$group_id, &$forum_id)
{
global $user, $db, $cache, $auth;
// User or group to be set?
- $ug_type = (sizeof($user_id)) ? 'user' : 'group';
+ $ug_type = (count($user_id)) ? 'user' : 'group';
// Check the permission setting again
if (!$auth->acl_get('a_' . str_replace('_', '', $permission_type) . 'auth') || !$auth->acl_get('a_auth' . $ug_type . 's'))
@@ -895,7 +895,7 @@ class acp_permissions
trigger_error($user->lang['NO_AUTH_OPERATION'] . adm_back_link($this->u_action), E_USER_WARNING);
}
- $auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : false), $permission_type);
+ $auth_admin->acl_delete($ug_type, (($ug_type == 'user') ? $user_id : $group_id), (count($forum_id) ? $forum_id : false), $permission_type);
// Do we need to recache the moderator lists?
if ($permission_type == 'm_')
@@ -903,7 +903,7 @@ class acp_permissions
phpbb_cache_moderators($db, $cache, $auth);
}
- $this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (sizeof($forum_id) ? $forum_id : array(0 => 0)));
+ $this->log_action($mode, 'del', $permission_type, $ug_type, (($ug_type == 'user') ? $user_id : $group_id), (count($forum_id) ? $forum_id : array(0 => 0)));
if ($mode == 'setting_forum_local' || $mode == 'setting_mod_local')
{
@@ -1053,7 +1053,7 @@ class acp_permissions
$total = ACL_NO;
$add_key = (($forum_id) ? '_LOCAL' : '');
- if (sizeof($groups))
+ if (count($groups))
{
// Get group auth settings
$hold_ary = $auth->acl_group_raw_data(array_keys($groups), $permission, $forum_id);
@@ -1099,7 +1099,7 @@ class acp_permissions
// Get user specific permission... globally or for this forum
$hold_ary = $auth->acl_user_raw_data($user_id, $permission, $forum_id);
- $auth_setting = (!sizeof($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];
+ $auth_setting = (!count($hold_ary)) ? ACL_NO : $hold_ary[$user_id][$forum_id][$permission];
switch ($auth_setting)
{
@@ -1258,7 +1258,7 @@ class acp_permissions
/** @var \phpbb\group\helper $group_helper */
$group_helper = $phpbb_container->get('group_helper');
- $sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
+ $sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((count($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
// Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles
$option_ids = $role_ids = array();
@@ -1274,7 +1274,7 @@ class acp_permissions
}
$db->sql_freeresult($result);
- if (sizeof($option_ids))
+ if (count($option_ids))
{
$sql = 'SELECT DISTINCT role_id
FROM ' . ACL_ROLES_DATA_TABLE . '
@@ -1288,15 +1288,15 @@ class acp_permissions
$db->sql_freeresult($result);
}
- if (sizeof($option_ids) && sizeof($role_ids))
+ if (count($option_ids) && count($role_ids))
{
$sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')';
}
- else if (sizeof($role_ids))
+ else if (count($role_ids))
{
$sql_where = 'AND ' . $db->sql_in_set('a.auth_role_id', $role_ids);
}
- else if (sizeof($option_ids))
+ else if (count($option_ids))
{
$sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids);
}
diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php
index 18dde382ca..49da7d84a4 100644
--- a/phpBB/includes/acp/acp_profile.php
+++ b/phpBB/includes/acp/acp_profile.php
@@ -446,7 +446,7 @@ class acp_profile
{
$exploded_options = (is_array($options)) ? $options : explode("\n", $options);
- if (sizeof($exploded_options) == sizeof($lang_options) || $action == 'create')
+ if (count($exploded_options) == count($lang_options) || $action == 'create')
{
// The number of options in the field is equal to the number of options already in the database
// Or we are creating a new dropdown list.
@@ -567,7 +567,7 @@ class acp_profile
}
}
- if (sizeof($error))
+ if (count($error))
{
$submit = false;
}
@@ -600,9 +600,9 @@ class acp_profile
$s_hidden_fields .= build_hidden_fields($_new_key_ary);
}
- if (!sizeof($error))
+ if (!count($error))
{
- if (($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))
+ if (($step == 3 && (count($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))
{
if (!check_form_key($form_key))
{
@@ -616,7 +616,7 @@ class acp_profile
$template->assign_vars(array(
'S_EDIT' => true,
'S_EDIT_MODE' => ($action == 'edit') ? true : false,
- 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'L_TITLE' => $user->lang['STEP_' . $step . '_TITLE_' . strtoupper($action)],
'L_EXPLAIN' => $user->lang['STEP_' . $step . '_EXPLAIN_' . strtoupper($action)],
@@ -664,7 +664,7 @@ class acp_profile
$template->assign_vars(array(
'S_STEP_TWO' => true,
- 'L_NEXT_STEP' => (sizeof($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
+ 'L_NEXT_STEP' => (count($this->lang_defs['iso']) == 1) ? $user->lang['SAVE'] : $user->lang['PROFILE_LANG_OPTIONS'])
);
// Build options based on profile type
@@ -738,6 +738,32 @@ class acp_profile
break;
}
+ $tpl_name = $this->tpl_name;
+ $page_title = $this->page_title;
+ $u_action = $this->u_action;
+
+ /**
+ * Event to handle actions on the ACP profile fields page
+ *
+ * @event core.acp_profile_action
+ * @var string action Action that is being performed
+ * @var string tpl_name Template file to load
+ * @var string page_title Page title
+ * @var string u_action The URL we are at, read only
+ * @since 3.2.2-RC1
+ */
+ $vars = array(
+ 'action',
+ 'tpl_name',
+ 'page_title',
+ 'u_action',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.acp_profile_action', compact($vars)));
+
+ $this->tpl_name = $tpl_name;
+ $this->page_title = $page_title;
+ unset($u_action);
+
$sql = 'SELECT *
FROM ' . PROFILE_FIELDS_TABLE . '
ORDER BY field_order';
@@ -750,7 +776,7 @@ class acp_profile
$active_value = (!$row['field_active']) ? 'activate' : 'deactivate';
$id = $row['field_id'];
- $s_need_edit = (sizeof($this->lang_defs['diff'][$row['field_id']])) ? true : false;
+ $s_need_edit = (count($this->lang_defs['diff'][$row['field_id']])) ? true : false;
if ($s_need_edit)
{
@@ -762,7 +788,8 @@ class acp_profile
continue;
}
$profile_field = $this->type_collection[$row['field_type']];
- $template->assign_block_vars('fields', array(
+
+ $field_block = array(
'FIELD_IDENT' => $row['field_ident'],
'FIELD_TYPE' => $profile_field->get_name(),
@@ -774,8 +801,26 @@ class acp_profile
'U_MOVE_UP' => $this->u_action . "&amp;action=move_up&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'),
'U_MOVE_DOWN' => $this->u_action . "&amp;action=move_down&amp;field_id=$id" . '&amp;hash=' . generate_link_hash('acp_profile'),
- 'S_NEED_EDIT' => $s_need_edit)
+ 'S_NEED_EDIT' => $s_need_edit,
);
+
+ /**
+ * Event to modify profile field data before it is assigned to the template
+ *
+ * @event core.acp_profile_modify_profile_row
+ * @var array row Array with data for the current profile field
+ * @var array field_block Template data that is being assigned to the 'fields' block
+ * @var object profile_field A profile field instance, implements \phpbb\profilefields\type\type_base
+ * @since 3.2.2-RC1
+ */
+ $vars = array(
+ 'row',
+ 'field_block',
+ 'profile_field',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.acp_profile_modify_profile_row', compact($vars)));
+
+ $template->assign_block_vars('fields', $field_block);
}
$db->sql_freeresult($result);
@@ -800,7 +845,7 @@ class acp_profile
/**
* Build all Language specific options
*/
- function build_language_options(&$cp, $field_type, $action = 'create')
+ function build_language_options($cp, $field_type, $action = 'create')
{
global $user, $config, $db, $request;
@@ -897,7 +942,7 @@ class acp_profile
/**
* Save Profile Field
*/
- function save_profile_field(&$cp, $field_type, $action = 'create')
+ function save_profile_field($cp, $field_type, $action = 'create')
{
global $db, $config, $user, $phpbb_container, $phpbb_log, $request, $phpbb_dispatcher;
@@ -1011,7 +1056,7 @@ class acp_profile
$this->update_insert(PROFILE_LANG_TABLE, $sql_ary, array('field_id' => $field_id, 'lang_id' => $default_lang_id));
}
- if (is_array($cp->vars['l_lang_name']) && sizeof($cp->vars['l_lang_name']))
+ if (is_array($cp->vars['l_lang_name']) && count($cp->vars['l_lang_name']))
{
foreach ($cp->vars['l_lang_name'] as $lang_id => $data)
{
@@ -1087,7 +1132,7 @@ class acp_profile
}
}
- if (is_array($cp->vars['l_lang_options']) && sizeof($cp->vars['l_lang_options']))
+ if (is_array($cp->vars['l_lang_options']) && count($cp->vars['l_lang_options']))
{
$empty_lang = array();
@@ -1098,7 +1143,7 @@ class acp_profile
$lang_ary = explode("\n", $lang_ary);
}
- if (sizeof($lang_ary) != sizeof($cp->vars['lang_options']))
+ if (count($lang_ary) != count($cp->vars['lang_options']))
{
$empty_lang[$lang_id] = true;
}
@@ -1150,7 +1195,7 @@ class acp_profile
}
}
- if (sizeof($profile_lang_fields))
+ if (count($profile_lang_fields))
{
foreach ($profile_lang_fields as $sql)
{
@@ -1213,7 +1258,7 @@ class acp_profile
$where_sql[] = $key . ' = ' . ((is_string($value)) ? "'" . $db->sql_escape($value) . "'" : (int) $value);
}
- if (!sizeof($where_sql))
+ if (!count($where_sql))
{
return;
}
@@ -1229,14 +1274,14 @@ class acp_profile
{
$sql_ary = array_merge($where_fields, $sql_ary);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql_ary));
}
}
else
{
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE ' . implode(' AND ', $where_sql);
diff --git a/phpBB/includes/acp/acp_prune.php b/phpBB/includes/acp/acp_prune.php
index d37050869a..3eee4f7922 100644
--- a/phpBB/includes/acp/acp_prune.php
+++ b/phpBB/includes/acp/acp_prune.php
@@ -55,7 +55,7 @@ class acp_prune
*/
function prune_forums($id, $mode)
{
- global $db, $user, $auth, $template, $phpbb_log, $request;
+ global $db, $user, $auth, $template, $phpbb_log, $request, $phpbb_dispatcher;
$all_forums = $request->variable('all_forums', 0);
$forum_id = $request->variable('f', array(0));
@@ -97,7 +97,7 @@ class acp_prune
'S_PRUNED' => true)
);
- $sql_forum = (sizeof($forum_id)) ? ' AND ' . $db->sql_in_set('forum_id', $forum_id) : '';
+ $sql_forum = (count($forum_id)) ? ' AND ' . $db->sql_in_set('forum_id', $forum_id) : '';
// Get a list of forum's or the data for the forum that we are pruning.
$sql = 'SELECT forum_id, forum_name
@@ -165,7 +165,7 @@ class acp_prune
}
else
{
- confirm_box(false, $user->lang['PRUNE_FORUM_CONFIRM'], build_hidden_fields(array(
+ $hidden_fields = array(
'i' => $id,
'mode' => $mode,
'submit' => 1,
@@ -177,13 +177,25 @@ class acp_prune
'prune_old_polls' => $request->variable('prune_old_polls', 0),
'prune_announce' => $request->variable('prune_announce', 0),
'prune_sticky' => $request->variable('prune_sticky', 0),
- )));
+ );
+
+ /**
+ * Use this event to pass data from the prune form to the confirmation screen
+ *
+ * @event core.prune_forums_settings_confirm
+ * @var array hidden_fields Hidden fields that are passed through the confirm screen
+ * @since 3.2.2-RC1
+ */
+ $vars = array('hidden_fields');
+ extract($phpbb_dispatcher->trigger_event('core.prune_forums_settings_confirm', compact($vars)));
+
+ confirm_box(false, $user->lang['PRUNE_FORUM_CONFIRM'], build_hidden_fields($hidden_fields));
}
}
// If they haven't selected a forum for pruning yet then
// display a select box to use for pruning.
- if (!sizeof($forum_id))
+ if (!count($forum_id))
{
$template->assign_vars(array(
'U_ACTION' => $this->u_action,
@@ -215,15 +227,27 @@ class acp_prune
$db->sql_freeresult($result);
- $l_selected_forums = (sizeof($forum_id) == 1) ? 'SELECTED_FORUM' : 'SELECTED_FORUMS';
+ $l_selected_forums = (count($forum_id) == 1) ? 'SELECTED_FORUM' : 'SELECTED_FORUMS';
- $template->assign_vars(array(
+ $template_data = array(
'L_SELECTED_FORUMS' => $user->lang[$l_selected_forums],
'U_ACTION' => $this->u_action,
'U_BACK' => $this->u_action,
'FORUM_LIST' => $forum_list,
- 'S_HIDDEN_FIELDS' => $s_hidden_fields)
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields,
);
+
+ /**
+ * Event to add/modify prune forums settings template data
+ *
+ * @event core.prune_forums_settings_template_data
+ * @var array template_data Array with form template data
+ * @since 3.2.2-RC1
+ */
+ $vars = array('template_data');
+ extract($phpbb_dispatcher->trigger_event('core.prune_forums_settings_template_data', compact($vars)));
+
+ $template->assign_vars($template_data);
}
}
@@ -252,7 +276,7 @@ class acp_prune
$user_ids = $usernames = array();
$this->get_prune_users($user_ids, $usernames);
- if (sizeof($user_ids))
+ if (count($user_ids))
{
if ($action == 'deactivate')
{
@@ -291,7 +315,7 @@ class acp_prune
$user_ids = $usernames = array();
$this->get_prune_users($user_ids, $usernames);
- if (!sizeof($user_ids))
+ if (!count($user_ids))
{
trigger_error($user->lang['USER_PRUNE_FAILURE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -434,7 +458,7 @@ class acp_prune
}
// implicit else when both arrays are empty do nothing
- if ((sizeof($active) && sizeof($active) != 3) || (sizeof($joined_before) && sizeof($joined_before) != 3) || (sizeof($joined_after) && sizeof($joined_after) != 3))
+ if ((count($active) && count($active) != 3) || (count($joined_before) && count($joined_before) != 3) || (count($joined_after) && count($joined_after) != 3))
{
trigger_error($user->lang['WRONG_ACTIVE_JOINED_DATE'] . adm_back_link($this->u_action), E_USER_WARNING);
}
@@ -448,15 +472,15 @@ class acp_prune
$where_sql .= ($count !== false) ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';
// First handle pruning of users who never logged in, last active date is 0000-00-00
- if (sizeof($active) && (int) $active[0] == 0 && (int) $active[1] == 0 && (int) $active[2] == 0)
+ if (count($active) && (int) $active[0] == 0 && (int) $active[1] == 0 && (int) $active[2] == 0)
{
$where_sql .= ' AND user_lastvisit = 0';
}
- else if (sizeof($active) && $active_select != 'lt')
+ else if (count($active) && $active_select != 'lt')
{
$where_sql .= ' AND user_lastvisit ' . $key_match[$active_select] . ' ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]);
}
- else if (sizeof($active))
+ else if (count($active))
{
$where_sql .= ' AND (user_lastvisit > 0 AND user_lastvisit < ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) . ')';
}
diff --git a/phpBB/includes/acp/acp_reasons.php b/phpBB/includes/acp/acp_reasons.php
index 51c398681d..dfb2ccbfd3 100644
--- a/phpBB/includes/acp/acp_reasons.php
+++ b/phpBB/includes/acp/acp_reasons.php
@@ -103,7 +103,7 @@ class acp_reasons
}
}
- if (!sizeof($error))
+ if (!count($error))
{
// New reason?
if ($action == 'add')
@@ -171,7 +171,7 @@ class acp_reasons
'L_TITLE' => $user->lang['REASON_' . $l_title],
'U_ACTION' => $this->u_action . "&amp;id=$reason_id&amp;action=$action",
'U_BACK' => $this->u_action,
- 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'REASON_TITLE' => $reason_row['reason_title'],
'REASON_DESCRIPTION' => $reason_row['reason_description'],
@@ -182,7 +182,7 @@ class acp_reasons
'S_AVAILABLE_TITLES' => implode($user->lang['COMMA_SEPARATOR'], array_map('htmlspecialchars', array_keys($user->lang['report_reasons']['TITLE']))),
'S_EDIT_REASON' => true,
'S_TRANSLATED' => $translated,
- 'S_ERROR' => (sizeof($error)) ? true : false,
+ 'S_ERROR' => (count($error)) ? true : false,
)
);
diff --git a/phpBB/includes/acp/acp_search.php b/phpBB/includes/acp/acp_search.php
index a792ee6b79..538a28a926 100644
--- a/phpBB/includes/acp/acp_search.php
+++ b/phpBB/includes/acp/acp_search.php
@@ -332,9 +332,9 @@ class acp_search
$forum_ids[] = $row['forum_id'];
}
$db->sql_freeresult($result);
- $row_count += sizeof($ids);
+ $row_count += count($ids);
- if (sizeof($ids))
+ if (count($ids))
{
$this->search->index_remove($ids, $posters, $forum_ids);
}
@@ -349,7 +349,7 @@ class acp_search
$totaltime = microtime(true) - $starttime;
$rows_per_second = $row_count / $totaltime;
meta_refresh(1, append_sid($this->u_action . '&amp;action=delete&amp;skip_rows=' . $post_counter . '&amp;hash=' . generate_link_hash('acp_search')));
- trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter, $rows_per_second));
+ trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter) . $user->lang('SEARCH_INDEX_DELETE_REDIRECT_RATE', $rows_per_second));
}
}
@@ -474,8 +474,8 @@ class acp_search
$statistics = array();
foreach ($data as $statistic => $value)
{
- $n = sizeof($statistics);
- if ($n && sizeof($statistics[$n - 1]) < 3)
+ $n = count($statistics);
+ if ($n && count($statistics[$n - 1]) < 3)
{
$statistics[$n - 1] += array('statistic_2' => $statistic, 'value_2' => $value);
}
@@ -492,7 +492,7 @@ class acp_search
'S_ACTIVE' => ($type == $config['search_type']) ? true : false,
'S_HIDDEN_FIELDS' => build_hidden_fields(array('search_type' => $type)),
'S_INDEXED' => (bool) $search->index_created(),
- 'S_STATS' => (bool) sizeof($statistics))
+ 'S_STATS' => (bool) count($statistics))
);
foreach ($statistics as $statistic)
diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php
index b954f90451..87c8d88f52 100644
--- a/phpBB/includes/acp/acp_styles.php
+++ b/phpBB/includes/acp/acp_styles.php
@@ -259,6 +259,19 @@ class acp_styles
// Get list of styles to uninstall
$ids = $this->request_vars('id', 0, true);
+ // Don't remove prosilver, you can still deactivate it.
+ $sql = 'SELECT style_id
+ FROM ' . STYLES_TABLE . "
+ WHERE style_name = '" . $this->db->sql_escape('prosilver') . "'";
+ $result = $this->db->sql_query($sql);
+ $prosilver_id = (int) $this->db->sql_fetchfield('style_id');
+ $this->db->sql_freeresult($result);
+
+ if ($prosilver_id && in_array($prosilver_id, $ids))
+ {
+ trigger_error($this->user->lang('UNINSTALL_PROSILVER') . adm_back_link($this->u_action), E_USER_WARNING);
+ }
+
// Check if confirmation box was submitted
if (confirm_box(true))
{
@@ -398,7 +411,7 @@ class acp_styles
// Reset default style for users who use selected styles
$sql = 'UPDATE ' . USERS_TABLE . '
- SET user_style = 0
+ SET user_style = ' . (int) $this->default_style . '
WHERE user_style IN (' . implode(', ', $ids) . ')';
$this->db->sql_query($sql);
@@ -952,6 +965,7 @@ class acp_styles
// Style data
'STYLE_ID' => $style['style_id'],
'STYLE_NAME' => htmlspecialchars($style['style_name']),
+ 'STYLE_PHPBB_VERSION' => $this->read_style_cfg($style['style_path'])['phpbb_version'],
'STYLE_PATH' => htmlspecialchars($style['style_path']),
'STYLE_COPYRIGHT' => strip_tags($style['style_copyright']),
'STYLE_ACTIVE' => $style['style_active'],
@@ -997,11 +1011,14 @@ class acp_styles
'L_ACTION' => $this->user->lang['EXPORT']
); */
- // Uninstall
- $actions[] = array(
- 'U_ACTION' => $this->u_action . '&amp;action=uninstall&amp;hash=' . generate_link_hash('uninstall') . '&amp;id=' . $style['style_id'],
- 'L_ACTION' => $this->user->lang['STYLE_UNINSTALL']
- );
+ if ($style['style_name'] !== 'prosilver')
+ {
+ // Uninstall
+ $actions[] = array(
+ 'U_ACTION' => $this->u_action . '&amp;action=uninstall&amp;hash=' . generate_link_hash('uninstall') . '&amp;id=' . $style['style_id'],
+ 'L_ACTION' => $this->user->lang['STYLE_UNINSTALL']
+ );
+ }
// Preview
$actions[] = array(
@@ -1122,7 +1139,14 @@ class acp_styles
*/
protected function read_style_cfg($dir)
{
+ // This should never happen, we give them a red warning because of its relevance.
+ if (!file_exists($this->styles_path . $dir . '/style.cfg'))
+ {
+ trigger_error($this->user->lang('NO_STYLE_CFG', $dir), E_USER_WARNING);
+ }
+
static $required = array('name', 'phpbb_version', 'copyright');
+
$cfg = parse_cfg_file($this->styles_path . $dir . '/style.cfg');
// Check if it is a valid file
@@ -1249,7 +1273,7 @@ class acp_styles
// Change default style for users
$sql = 'UPDATE ' . USERS_TABLE . '
- SET user_style = 0
+ SET user_style = ' . (int) $this->default_style . '
WHERE user_style = ' . $id;
$this->db->sql_query($sql);
@@ -1355,18 +1379,18 @@ class acp_styles
}
// Hardcoded template bitfield to add for new templates
+ $default_bitfield = '1111111111111';
+
$bitfield = new bitfield();
- $bitfield->set(0);
- $bitfield->set(1);
- $bitfield->set(2);
- $bitfield->set(3);
- $bitfield->set(4);
- $bitfield->set(8);
- $bitfield->set(9);
- $bitfield->set(11);
- $bitfield->set(12);
- $value = $bitfield->get_base64();
- return $value;
+ for ($i = 0; $i < strlen($default_bitfield); $i++)
+ {
+ if ($default_bitfield[$i] == '1')
+ {
+ $bitfield->set($i);
+ }
+ }
+
+ return $bitfield->get_base64();
}
}
diff --git a/phpBB/includes/acp/acp_update.php b/phpBB/includes/acp/acp_update.php
index 9124a59ef2..fa3afa6ce3 100644
--- a/phpBB/includes/acp/acp_update.php
+++ b/phpBB/includes/acp/acp_update.php
@@ -59,17 +59,19 @@ class acp_update
$update_link = $phpbb_root_path . 'install/app.' . $phpEx;
- $template->assign_vars(array(
- 'S_UP_TO_DATE' => empty($updates_available),
- 'U_ACTION' => $this->u_action,
- 'U_VERSIONCHECK_FORCE' => append_sid($this->u_action . '&amp;versioncheck_force=1'),
+ $template_ary = [
+ 'S_UP_TO_DATE' => empty($updates_available),
+ 'U_ACTION' => $this->u_action,
+ 'U_VERSIONCHECK_FORCE' => append_sid($this->u_action . '&amp;versioncheck_force=1'),
- 'CURRENT_VERSION' => $config['version'],
+ 'CURRENT_VERSION' => $config['version'],
- 'UPDATE_INSTRUCTIONS' => sprintf($user->lang['UPDATE_INSTRUCTIONS'], $update_link),
+ 'UPDATE_INSTRUCTIONS' => $user->lang('UPDATE_INSTRUCTIONS', $update_link),
'S_VERSION_UPGRADEABLE' => !empty($upgrades_available),
'UPGRADE_INSTRUCTIONS' => !empty($upgrades_available) ? $user->lang('UPGRADE_INSTRUCTIONS', $upgrades_available['current'], $upgrades_available['announcement']) : false,
- ));
+ ];
+
+ $template->assign_vars($template_ary);
// Incomplete update?
if (phpbb_version_compare($config['version'], PHPBB_VERSION, '<'))
diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php
index 090cb32ebb..fd4b5e8c24 100644
--- a/phpBB/includes/acp/acp_users.php
+++ b/phpBB/includes/acp/acp_users.php
@@ -24,9 +24,9 @@ class acp_users
var $u_action;
var $p_master;
- function acp_users(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
@@ -690,7 +690,7 @@ class acp_users
}
$db->sql_freeresult($result);
- if (sizeof($topic_id_ary))
+ if (count($topic_id_ary))
{
$sql = 'SELECT topic_id, forum_id, topic_title, topic_posts_approved, topic_posts_unapproved, topic_posts_softdeleted, topic_attachment
FROM ' . TOPICS_TABLE . '
@@ -718,12 +718,12 @@ class acp_users
}
// Entire topic comprises posts by this user, move these topics
- if (sizeof($move_topic_ary))
+ if (count($move_topic_ary))
{
move_topics($move_topic_ary, $new_forum_id, false);
}
- if (sizeof($move_post_ary))
+ if (count($move_post_ary))
{
// Create new topic
// Update post_ids, report_ids, attachment_ids
@@ -769,13 +769,13 @@ class acp_users
$forum_id_ary = array_unique($forum_id_ary);
$topic_id_ary = array_unique(array_merge(array_keys($topic_id_ary), $new_topic_id_ary));
- if (sizeof($topic_id_ary))
+ if (count($topic_id_ary))
{
sync('topic_reported', 'topic_id', $topic_id_ary);
sync('topic', 'topic_id', $topic_id_ary);
}
- if (sizeof($forum_id_ary))
+ if (count($forum_id_ary))
{
sync('forum', 'forum_id', $forum_id_ary, false, true);
}
@@ -855,7 +855,7 @@ class acp_users
$check_ary += array(
'username' => array(
array('string', false, $config['min_name_chars'], $config['max_name_chars']),
- array('username', $user_row['username'])
+ array('username', $user_row['username'], true)
),
);
}
@@ -892,7 +892,7 @@ class acp_users
$update_password = $data['new_password'] && !$passwords_manager->check($data['new_password'], $user_row['user_password']);
$update_email = ($data['email'] != $user_row['user_email']) ? $data['email'] : false;
- if (!sizeof($error))
+ if (!count($error))
{
$sql_ary = array();
@@ -994,7 +994,7 @@ class acp_users
));
}
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
@@ -1347,7 +1347,7 @@ class acp_users
{
$s_hidden_fields['delall'] = 1;
}
- if (isset($_POST['delall']) || (isset($_POST['delmarked']) && sizeof($marked)))
+ if (isset($_POST['delall']) || (isset($_POST['delmarked']) && count($marked)))
{
confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields));
}
@@ -1383,9 +1383,9 @@ class acp_users
{
// Check if there are more occurrences of % than arguments, if there are we fill out the arguments array
// It doesn't matter if we add more arguments than placeholders
- if ((substr_count($row['action'], '%') - sizeof($log_data_ary)) > 0)
+ if ((substr_count($row['action'], '%') - count($log_data_ary)) > 0)
{
- $log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($row['action'], '%') - sizeof($log_data_ary), ''));
+ $log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($row['action'], '%') - count($log_data_ary), ''));
}
$row['action'] = vsprintf($row['action'], $log_data_ary);
$row['action'] = bbcode_nl2br(censor_text($row['action']));
@@ -1478,7 +1478,7 @@ class acp_users
// validate custom profile fields
$cp->submit_cp_field('profile', $user_row['iso_lang_id'], $cp_data, $cp_error);
- if (sizeof($cp_error))
+ if (count($cp_error))
{
$error = array_merge($error, $cp_error);
}
@@ -1501,7 +1501,7 @@ class acp_users
$vars = array('data', 'user_id', 'user_row', 'error');
extract($phpbb_dispatcher->trigger_event('core.acp_users_profile_validate', compact($vars)));
- if (!sizeof($error))
+ if (!count($error))
{
$sql_ary = array(
'user_jabber' => $data['jabber'],
@@ -1645,7 +1645,7 @@ class acp_users
$error[] = 'FORM_INVALID';
}
- if (!sizeof($error))
+ if (!count($error))
{
$this->optionset($user_row, 'viewimg', $data['view_images']);
$this->optionset($user_row, 'viewflash', $data['view_flash']);
@@ -1696,7 +1696,7 @@ class acp_users
$vars = array('data', 'user_row', 'sql_ary', 'error');
extract($phpbb_dispatcher->trigger_event('core.acp_users_prefs_modify_sql', compact($vars)));
- if (!sizeof($error))
+ if (!count($error))
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
@@ -1883,6 +1883,17 @@ class acp_users
'user_avatar_height' => $result['avatar_height'],
);
+ /**
+ * Modify users preferences data before assigning it to the template
+ *
+ * @event core.acp_users_avatar_sql
+ * @var array user_row Array with user data
+ * @var array result Array with user avatar data to be updated in the DB
+ * @since 3.2.4-RC1
+ */
+ $vars = array('user_row', 'result');
+ extract($phpbb_dispatcher->trigger_event('core.acp_users_avatar_sql', compact($vars)));
+
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $result) . '
WHERE user_id = ' . (int) $user_id;
@@ -2060,7 +2071,7 @@ class acp_users
'sig'
);
- if (sizeof($warn_msg))
+ if (count($warn_msg))
{
$error += $warn_msg;
}
@@ -2072,7 +2083,7 @@ class acp_users
}
else
{
- if (!sizeof($error))
+ if (!count($error))
{
$this->optionset($user_row, 'sig_bbcode', $enable_bbcode);
$this->optionset($user_row, 'sig_smilies', $enable_smilies);
@@ -2085,6 +2096,17 @@ class acp_users
'user_sig_bbcode_bitfield' => $bbcode_bitfield,
);
+ /**
+ * Modify user signature before it is stored in the DB
+ *
+ * @event core.acp_users_modify_signature_sql_ary
+ * @var array user_row Array with user data
+ * @var array sql_ary Array with user signature data to be updated in the DB
+ * @since 3.2.4-RC1
+ */
+ $vars = array('user_row', 'sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.acp_users_modify_signature_sql_ary', compact($vars)));
+
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user_id;
@@ -2099,7 +2121,7 @@ class acp_users
if ($request->is_set_post('preview'))
{
- $decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_bitfield);
+ $decoded_message = generate_text_for_edit($signature, $bbcode_uid, $bbcode_flags);
}
/** @var \phpbb\controller\helper $controller_helper */
@@ -2147,7 +2169,7 @@ class acp_users
$sort_key = $request->variable('sk', 'a');
$sort_dir = $request->variable('sd', 'd');
- if ($deletemark && sizeof($marked))
+ if ($deletemark && count($marked))
{
$sql = 'SELECT attach_id
FROM ' . ATTACHMENTS_TABLE . '
@@ -2164,7 +2186,7 @@ class acp_users
$db->sql_freeresult($result);
}
- if ($deletemark && sizeof($marked))
+ if ($deletemark && count($marked))
{
if (confirm_box(true))
{
@@ -2185,7 +2207,7 @@ class acp_users
$attachment_manager->delete('attach', $marked);
unset($attachment_manager);
- $message = (sizeof($log_attachments) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED'];
+ $message = (count($log_attachments) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED'];
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTACHMENTS_DELETED', false, array(implode($user->lang['COMMA_SEPARATOR'], $log_attachments)));
trigger_error($message . adm_back_link($this->u_action . '&amp;u=' . $user_id));
@@ -2455,7 +2477,7 @@ class acp_users
// Select box for other groups
$sql = 'SELECT group_id, group_name, group_type, group_founder_manage
FROM ' . GROUPS_TABLE . '
- ' . ((sizeof($id_ary)) ? 'WHERE ' . $db->sql_in_set('group_id', $id_ary, true) : '') . '
+ ' . ((count($id_ary)) ? 'WHERE ' . $db->sql_in_set('group_id', $id_ary, true) : '') . '
ORDER BY group_type DESC, group_name ASC';
$result = $db->sql_query($sql);
@@ -2497,7 +2519,7 @@ class acp_users
'U_DELETE' => $this->u_action . "&amp;action=delete&amp;u=$user_id&amp;g=" . $data['group_id'],
'U_APPROVE' => ($group_type == 'pending') ? $this->u_action . "&amp;action=approve&amp;u=$user_id&amp;g=" . $data['group_id'] : '',
- 'GROUP_NAME' => ($group_type == 'special') ? $user->lang['G_' . $data['group_name']] : $data['group_name'],
+ 'GROUP_NAME' => $group_helper->get_name($data['group_name']),
'L_DEMOTE_PROMOTE' => ($data['group_leader']) ? $user->lang['GROUP_DEMOTE'] : $user->lang['GROUP_PROMOTE'],
'S_IS_MEMBER' => ($group_type != 'pending') ? true : false,
@@ -2604,8 +2626,8 @@ class acp_users
// Assign general variables
$template->assign_vars(array(
- 'S_ERROR' => (sizeof($error)) ? true : false,
- 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '')
+ 'S_ERROR' => (count($error)) ? true : false,
+ 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '')
);
}
diff --git a/phpBB/includes/acp/auth.php b/phpBB/includes/acp/auth.php
index b36b900396..b414a3121a 100644
--- a/phpBB/includes/acp/auth.php
+++ b/phpBB/includes/acp/auth.php
@@ -27,7 +27,7 @@ class auth_admin extends \phpbb\auth\auth
/**
* Init auth settings
*/
- function auth_admin()
+ function __construct()
{
global $db, $cache;
@@ -107,7 +107,7 @@ class auth_admin extends \phpbb\auth\auth
$compare_options = array_diff(preg_replace('/^((?!' . $auth_option . ').+)|(' . $auth_option . ')$/', '', array_keys($this->acl_options[$scope])), array(''));
// If forum_ids is false and the scope is local we actually want to have all forums within the array
- if ($scope == 'local' && !sizeof($forum_ids))
+ if ($scope == 'local' && !count($forum_ids))
{
$sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE;
@@ -177,9 +177,9 @@ class auth_admin extends \phpbb\auth\auth
// Now, we need to fill the gaps with $acl_fill. ;)
// Now switch back to keys
- if (sizeof($compare_options))
+ if (count($compare_options))
{
- $compare_options = array_combine($compare_options, array_fill(1, sizeof($compare_options), $acl_fill));
+ $compare_options = array_combine($compare_options, array_fill(1, count($compare_options), $acl_fill));
}
// Defining the user-function here to save some memory
@@ -189,7 +189,7 @@ class auth_admin extends \phpbb\auth\auth
};
// Actually fill the gaps
- if (sizeof($hold_ary))
+ if (count($hold_ary))
{
foreach ($hold_ary as $ug_id => $row)
{
@@ -356,7 +356,7 @@ class auth_admin extends \phpbb\auth\auth
// Build js roles array (role data assignments)
$s_role_js_array = '';
- if (sizeof($roles))
+ if (count($roles))
{
$s_role_js_array = array();
@@ -422,7 +422,7 @@ class auth_admin extends \phpbb\auth\auth
// If we only have one forum id to display or being in local mode and more than one user/group to display,
// we switch the complete interface to group by user/usergroup instead of grouping by forum
// To achieve this, we need to switch the array a bit
- if (sizeof($forum_ids) == 1 || ($local && sizeof($ug_names_ary) > 1))
+ if (count($forum_ids) == 1 || ($local && count($ug_names_ary) > 1))
{
$hold_ary_temp = $hold_ary;
$hold_ary = array();
@@ -453,9 +453,9 @@ class auth_admin extends \phpbb\auth\auth
'S_LOCAL' => ($local) ? true : false,
'S_GLOBAL' => (!$local) ? true : false,
- 'S_NUM_CATS' => sizeof($categories),
+ 'S_NUM_CATS' => count($categories),
'S_VIEW' => ($mode == 'view') ? true : false,
- 'S_NUM_OBJECTS' => sizeof($content_array),
+ 'S_NUM_OBJECTS' => count($content_array),
'S_USER_MODE' => ($user_mode == 'user') ? true : false,
'S_GROUP_MODE' => ($user_mode == 'group') ? true : false)
);
@@ -546,15 +546,15 @@ class auth_admin extends \phpbb\auth\auth
'NAME' => $ug_name,
'CATEGORIES' => implode('</th><th>', $categories),
- 'USER_GROUPS_DEFAULT' => ($user_mode == 'user' && isset($user_groups_default[$ug_id]) && sizeof($user_groups_default[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_default[$ug_id]) : '',
- 'USER_GROUPS_CUSTOM' => ($user_mode == 'user' && isset($user_groups_custom[$ug_id]) && sizeof($user_groups_custom[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_custom[$ug_id]) : '',
+ 'USER_GROUPS_DEFAULT' => ($user_mode == 'user' && isset($user_groups_default[$ug_id]) && count($user_groups_default[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_default[$ug_id]) : '',
+ 'USER_GROUPS_CUSTOM' => ($user_mode == 'user' && isset($user_groups_custom[$ug_id]) && count($user_groups_custom[$ug_id])) ? implode($user->lang['COMMA_SEPARATOR'], $user_groups_custom[$ug_id]) : '',
'L_ACL_TYPE' => $l_acl_type,
'S_LOCAL' => ($local) ? true : false,
'S_GLOBAL' => (!$local) ? true : false,
- 'S_NUM_CATS' => sizeof($categories),
+ 'S_NUM_CATS' => count($categories),
'S_VIEW' => ($mode == 'view') ? true : false,
- 'S_NUM_OBJECTS' => sizeof($content_array),
+ 'S_NUM_OBJECTS' => count($content_array),
'S_USER_MODE' => ($user_mode == 'user') ? true : false,
'S_GROUP_MODE' => ($user_mode == 'group') ? true : false)
);
@@ -637,7 +637,7 @@ class auth_admin extends \phpbb\auth\auth
global $db, $template, $user, $phpbb_root_path, $phpEx;
global $phpbb_container;
- if (!sizeof($hold_ary))
+ if (!count($hold_ary))
{
return;
}
@@ -669,7 +669,7 @@ class auth_admin extends \phpbb\auth\auth
'FORUM_ID' => $forum_id)
);
- if (isset($auth_ary['users']) && sizeof($auth_ary['users']))
+ if (isset($auth_ary['users']) && count($auth_ary['users']))
{
$sql = 'SELECT user_id, username
FROM ' . USERS_TABLE . '
@@ -688,7 +688,7 @@ class auth_admin extends \phpbb\auth\auth
$db->sql_freeresult($result);
}
- if (isset($auth_ary['groups']) && sizeof($auth_ary['groups']))
+ if (isset($auth_ary['groups']) && count($auth_ary['groups']))
{
$sql = 'SELECT group_id, group_name, group_type
FROM ' . GROUPS_TABLE . '
@@ -819,7 +819,7 @@ class auth_admin extends \phpbb\auth\auth
// Because we just changed the options and also purged the options cache, we instantly update/regenerate it for later calls to succeed.
$this->acl_options = array();
- $this->auth_admin();
+ $this->__construct();
return true;
}
@@ -890,7 +890,7 @@ class auth_admin extends \phpbb\auth\auth
}
$db->sql_freeresult($result);
- if (sizeof($role_ids))
+ if (count($role_ids))
{
$sql = "DELETE FROM $table
WHERE $forum_sql
@@ -1000,7 +1000,7 @@ class auth_admin extends \phpbb\auth\auth
}
// If no data is there, we set the any-flag to ACL_NEVER...
- if (!sizeof($sql_ary))
+ if (!count($sql_ary))
{
$sql_ary[] = array(
'role_id' => (int) $role_id,
@@ -1083,7 +1083,7 @@ class auth_admin extends \phpbb\auth\auth
$db->sql_freeresult($result);
// Get role data for resetting data
- if (sizeof($cur_role_auth))
+ if (count($cur_role_auth))
{
$sql = 'SELECT ao.auth_option, rd.role_id, rd.auth_setting
FROM ' . ACL_OPTIONS_TABLE . ' ao, ' . ACL_ROLES_DATA_TABLE . ' rd
diff --git a/phpBB/includes/bbcode.php b/phpBB/includes/bbcode.php
index 6572c0ad2c..c31b63a403 100644
--- a/phpBB/includes/bbcode.php
+++ b/phpBB/includes/bbcode.php
@@ -35,9 +35,18 @@ class bbcode
/**
* Constructor
+ */
+ function __construct($bitfield = '')
+ {
+ $this->bbcode_set_bitfield($bitfield);
+ }
+
+ /**
* Init bbcode cache entries if bitfield is specified
+ *
+ * @param string $bbcode_bitfield The bbcode bitfield
*/
- function bbcode($bitfield = '')
+ function bbcode_set_bitfield($bitfield = '')
{
if ($bitfield)
{
@@ -94,13 +103,13 @@ class bbcode
${$type}['replace'][] = $replace;
}
- if (sizeof($str['search']))
+ if (count($str['search']))
{
$message = str_replace($str['search'], $str['replace'], $message);
$str = array('search' => array(), 'replace' => array());
}
- if (sizeof($preg['search']))
+ if (count($preg['search']))
{
// we need to turn the entities back into their original form to allow the
// search patterns to work properly
@@ -191,7 +200,7 @@ class bbcode
}
}
- if (sizeof($sql))
+ if (count($sql))
{
global $db;
diff --git a/phpBB/includes/compatibility_globals.php b/phpBB/includes/compatibility_globals.php
index 0f403896a7..ad394e3782 100644
--- a/phpBB/includes/compatibility_globals.php
+++ b/phpBB/includes/compatibility_globals.php
@@ -29,7 +29,7 @@ function register_compatibility_globals()
{
global $phpbb_container;
- global $cache, $phpbb_dispatcher, $request, $user, $auth, $db, $config, $phpbb_log;
+ global $cache, $phpbb_dispatcher, $request, $user, $auth, $db, $config, $language, $phpbb_log;
global $symfony_request, $phpbb_filesystem, $phpbb_path_helper, $phpbb_extension_manager, $template;
// set up caching
@@ -48,6 +48,9 @@ function register_compatibility_globals()
/* @var $user \phpbb\user */
$user = $phpbb_container->get('user');
+ /* @var \phpbb\language\language $language */
+ $language = $phpbb_container->get('language');
+
/* @var $auth \phpbb\auth\auth */
$auth = $phpbb_container->get('auth');
diff --git a/phpBB/includes/constants.php b/phpBB/includes/constants.php
index 07f9f27555..a2e7d92f7d 100644
--- a/phpBB/includes/constants.php
+++ b/phpBB/includes/constants.php
@@ -28,7 +28,7 @@ if (!defined('IN_PHPBB'))
*/
// phpBB Version
-@define('PHPBB_VERSION', '3.2.2-dev');
+@define('PHPBB_VERSION', '3.2.9-dev');
// QA-related
// define('PHPBB_QA', 1);
diff --git a/phpBB/includes/diff/diff.php b/phpBB/includes/diff/diff.php
index d307880c4b..d8ae9d77ac 100644
--- a/phpBB/includes/diff/diff.php
+++ b/phpBB/includes/diff/diff.php
@@ -50,7 +50,7 @@ class diff
* @param array &$to_content An array of strings.
* @param bool $preserve_cr If true, \r is replaced by a new line in the diff output
*/
- function diff(&$from_content, &$to_content, $preserve_cr = true)
+ function __construct(&$from_content, &$to_content, $preserve_cr = true)
{
$diff_engine = new diff_engine();
$this->_edits = $diff_engine->diff($from_content, $to_content, $preserve_cr);
@@ -75,7 +75,7 @@ class diff
{
$count = 0;
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -98,7 +98,7 @@ class diff
{
$count = 0;
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -136,7 +136,7 @@ class diff
$rev->_edits = array();
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
$rev->_edits[] = $edit->reverse();
@@ -152,7 +152,7 @@ class diff
*/
function is_empty()
{
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -168,8 +168,8 @@ class diff
$final = $edit->final;
// We can simplify one case where the array is usually supposed to be empty...
- if (sizeof($orig) == 1 && trim($orig[0]) === '') $orig = array();
- if (sizeof($final) == 1 && trim($final[0]) === '') $final = array();
+ if (count($orig) == 1 && trim($orig[0]) === '') $orig = array();
+ if (count($final) == 1 && trim($final[0]) === '') $final = array();
if (!$orig && !$final)
{
@@ -196,13 +196,13 @@ class diff
{
$lcs = 0;
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
if (is_a($edit, 'diff_op_copy'))
{
- $lcs += sizeof($edit->orig);
+ $lcs += count($edit->orig);
}
}
return $lcs;
@@ -219,13 +219,13 @@ class diff
{
$lines = array();
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
if ($edit->orig)
{
- array_splice($lines, sizeof($lines), 0, $edit->orig);
+ array_splice($lines, count($lines), 0, $edit->orig);
}
}
return $lines;
@@ -242,13 +242,13 @@ class diff
{
$lines = array();
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
if ($edit->final)
{
- array_splice($lines, sizeof($lines), 0, $edit->final);
+ array_splice($lines, count($lines), 0, $edit->final);
}
}
return $lines;
@@ -296,7 +296,7 @@ class diff
$prevtype = null;
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -330,30 +330,30 @@ class mapped_diff extends diff
* compared when computing the diff.
* @param array $mapped_to_lines This array should have the same number of elements as $to_lines.
*/
- function mapped_diff(&$from_lines, &$to_lines, &$mapped_from_lines, &$mapped_to_lines)
+ function __construct(&$from_lines, &$to_lines, &$mapped_from_lines, &$mapped_to_lines)
{
- if (sizeof($from_lines) != sizeof($mapped_from_lines) || sizeof($to_lines) != sizeof($mapped_to_lines))
+ if (count($from_lines) != count($mapped_from_lines) || count($to_lines) != count($mapped_to_lines))
{
return false;
}
- parent::diff($mapped_from_lines, $mapped_to_lines);
+ parent::__construct($mapped_from_lines, $mapped_to_lines);
$xi = $yi = 0;
- for ($i = 0; $i < sizeof($this->_edits); $i++)
+ for ($i = 0; $i < count($this->_edits); $i++)
{
$orig = &$this->_edits[$i]->orig;
if (is_array($orig))
{
- $orig = array_slice($from_lines, $xi, sizeof($orig));
- $xi += sizeof($orig);
+ $orig = array_slice($from_lines, $xi, count($orig));
+ $xi += count($orig);
}
$final = &$this->_edits[$i]->final;
if (is_array($final))
{
- $final = array_slice($to_lines, $yi, sizeof($final));
- $yi += sizeof($final);
+ $final = array_slice($to_lines, $yi, count($final));
+ $yi += count($final);
}
}
}
@@ -377,12 +377,12 @@ class diff_op
function norig()
{
- return ($this->orig) ? sizeof($this->orig) : 0;
+ return ($this->orig) ? count($this->orig) : 0;
}
function nfinal()
{
- return ($this->final) ? sizeof($this->final) : 0;
+ return ($this->final) ? count($this->final) : 0;
}
}
@@ -394,7 +394,7 @@ class diff_op
*/
class diff_op_copy extends diff_op
{
- function diff_op_copy($orig, $final = false)
+ function __construct($orig, $final = false)
{
if (!is_array($final))
{
@@ -419,7 +419,7 @@ class diff_op_copy extends diff_op
*/
class diff_op_delete extends diff_op
{
- function diff_op_delete($lines)
+ function __construct($lines)
{
$this->orig = $lines;
$this->final = false;
@@ -440,7 +440,7 @@ class diff_op_delete extends diff_op
*/
class diff_op_add extends diff_op
{
- function diff_op_add($lines)
+ function __construct($lines)
{
$this->final = $lines;
$this->orig = false;
@@ -461,7 +461,7 @@ class diff_op_add extends diff_op
*/
class diff_op_change extends diff_op
{
- function diff_op_change($orig, $final)
+ function __construct($orig, $final)
{
$this->orig = $orig;
$this->final = $final;
@@ -498,7 +498,7 @@ class diff3 extends diff
* @param bool $preserve_cr If true, \r\n and bare \r are replaced by a new line
* in the diff output
*/
- function diff3(&$orig, &$final1, &$final2, $preserve_cr = true)
+ function __construct(&$orig, &$final1, &$final2, $preserve_cr = true)
{
$diff_engine = new diff_engine();
@@ -517,7 +517,7 @@ class diff3 extends diff
{
$conflicts = 0;
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -550,7 +550,7 @@ class diff3 extends diff
$lines = array();
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -590,7 +590,7 @@ class diff3 extends diff
{
$lines = array();
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -614,7 +614,7 @@ class diff3 extends diff
{
$lines = array();
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -638,7 +638,7 @@ class diff3 extends diff
{
$conflicts = array();
- for ($i = 0, $size = sizeof($this->_edits); $i < $size; $i++)
+ for ($i = 0, $size = count($this->_edits); $i < $size; $i++)
{
$edit = $this->_edits[$i];
@@ -754,7 +754,7 @@ class diff3 extends diff
*/
class diff3_op
{
- function diff3_op($orig = false, $final1 = false, $final2 = false)
+ function __construct($orig = false, $final1 = false, $final2 = false)
{
$this->orig = $orig ? $orig : array();
$this->final1 = $final1 ? $final1 : array();
@@ -803,9 +803,9 @@ class diff3_op
function solve_prepare()
{
// We can simplify one case where the array is usually supposed to be empty...
- if (sizeof($this->orig) == 1 && trim($this->orig[0]) === '') $this->orig = array();
- if (sizeof($this->final1) == 1 && trim($this->final1[0]) === '') $this->final1 = array();
- if (sizeof($this->final2) == 1 && trim($this->final2[0]) === '') $this->final2 = array();
+ if (count($this->orig) == 1 && trim($this->orig[0]) === '') $this->orig = array();
+ if (count($this->final1) == 1 && trim($this->final1[0]) === '') $this->final1 = array();
+ if (count($this->final2) == 1 && trim($this->final2[0]) === '') $this->final2 = array();
// Now we only can have the case where the only difference between arrays are newlines, so compare all cases
@@ -848,10 +848,10 @@ class diff3_op
$_final1 = &$this->$final1;
// Ok, we basically search for $orig in $final1
- $compare_seq = sizeof($_orig);
+ $compare_seq = count($_orig);
// Go through the conflict code
- for ($i = 0, $j = 0, $size = sizeof($_final1); $i < $size; $i++, $j = $i)
+ for ($i = 0, $j = 0, $size = count($_final1); $i < $size; $i++, $j = $i)
{
$line = $_final1[$i];
$skip = 0;
@@ -895,7 +895,7 @@ class diff3_op
// CASE ONE: orig changed into final2, but modified/unknown code in final1.
// IF orig is found "as is" in final1 we replace the code directly in final1 and populate this as final2/merge
- if (sizeof($this->orig) && sizeof($this->final2))
+ if (count($this->orig) && count($this->final2))
{
$result = $this->_compare_conflict_seq('orig', 'final1', 'final2');
@@ -915,7 +915,7 @@ class diff3_op
}
// Try to solve $Id$ issues. ;)
- if (sizeof($this->orig) == 1 && sizeof($this->final1) == 1 && sizeof($this->final2) == 1)
+ if (count($this->orig) == 1 && count($this->final1) == 1 && count($this->final2) == 1)
{
$match = '#^' . preg_quote('* @version $Id: ', '#') . '[a-z\._\- ]+[0-9]+ [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9\:Z]+ [a-z0-9_\- ]+\$$#';
@@ -939,9 +939,9 @@ class diff3_op
}
// The same is true for a line at the end. ;)
- if (sizeof($this->orig) && sizeof($this->final2) && sizeof($this->orig) === sizeof($this->final2) && trim($this->orig[sizeof($this->orig)-1]) === '' && trim($this->final2[sizeof($this->final2)-1]) === '')
+ if (count($this->orig) && count($this->final2) && count($this->orig) === count($this->final2) && trim($this->orig[count($this->orig)-1]) === '' && trim($this->final2[count($this->final2)-1]) === '')
{
- unset($this->orig[sizeof($this->orig)-1], $this->final2[sizeof($this->final2)-1]);
+ unset($this->orig[count($this->orig)-1], $this->final2[count($this->final2)-1]);
$this->orig = array_values($this->orig);
$this->final2 = array_values($this->final2);
@@ -972,7 +972,7 @@ class diff3_op
}
// CASE TWO: Added lines from orig to final2 but final1 had added lines too. Just merge them.
- if (!sizeof($this->orig) && $this->final1 !== $this->final2 && sizeof($this->final1) && sizeof($this->final2))
+ if (!count($this->orig) && $this->final1 !== $this->final2 && count($this->final1) && count($this->final2))
{
$result = $this->_compare_conflict_seq('final2', 'final1');
@@ -1001,7 +1001,7 @@ class diff3_op
}
// CASE THREE: Removed lines (orig has the to-remove line(s), but final1 has additional lines which does not need to be removed). Just remove orig from final1 and then use final1 as final2/merge
- if (!sizeof($this->final2) && sizeof($this->orig) && sizeof($this->final1) && $this->orig !== $this->final1)
+ if (!count($this->final2) && count($this->orig) && count($this->final1) && $this->orig !== $this->final1)
{
$result = $this->_compare_conflict_seq('orig', 'final1');
@@ -1011,11 +1011,11 @@ class diff3_op
}
// First of all, try to find the code in orig in final1. ;)
- $compare_seq = sizeof($this->orig);
+ $compare_seq = count($this->orig);
$begin = $end = -1;
$j = 0;
- for ($i = 0, $size = sizeof($this->final1); $i < $size; $i++)
+ for ($i = 0, $size = count($this->final1); $i < $size; $i++)
{
$line = $this->final1[$i];
@@ -1066,7 +1066,7 @@ class diff3_op
*/
class diff3_op_copy extends diff3_op
{
- function diff3_op_copy($lines = false)
+ function __construct($lines = false)
{
$this->orig = $lines ? $lines : array();
$this->final1 = &$this->orig;
@@ -1092,7 +1092,7 @@ class diff3_op_copy extends diff3_op
*/
class diff3_block_builder
{
- function diff3_block_builder()
+ function __construct()
{
$this->_init();
}
@@ -1147,6 +1147,6 @@ class diff3_block_builder
function _append(&$array, $lines)
{
- array_splice($array, sizeof($array), 0, $lines);
+ array_splice($array, count($array), 0, $lines);
}
}
diff --git a/phpBB/includes/diff/engine.php b/phpBB/includes/diff/engine.php
index bc21b3b9ba..757fdadde9 100644
--- a/phpBB/includes/diff/engine.php
+++ b/phpBB/includes/diff/engine.php
@@ -84,8 +84,8 @@ class diff_engine
$to_lines = explode("\n", preg_replace('#[\n\r]+#', "\n", $to_lines));
}
- $n_from = sizeof($from_lines);
- $n_to = sizeof($to_lines);
+ $n_from = count($from_lines);
+ $n_to = count($to_lines);
$this->xchanged = $this->ychanged = $this->xv = $this->yv = $this->xind = $this->yind = array();
unset($this->seq, $this->in_seq, $this->lcs);
@@ -145,7 +145,7 @@ class diff_engine
}
// Find the LCS.
- $this->_compareseq(0, sizeof($this->xv), 0, sizeof($this->yv));
+ $this->_compareseq(0, count($this->xv), 0, count($this->yv));
// Merge edits when possible.
if ($this->skip_whitespace_changes)
@@ -444,8 +444,8 @@ class diff_engine
$i = 0;
$j = 0;
- $len = sizeof($lines);
- $other_len = sizeof($other_changed);
+ $len = count($lines);
+ $other_len = count($other_changed);
while (1)
{
diff --git a/phpBB/includes/diff/renderer.php b/phpBB/includes/diff/renderer.php
index 6b7f07cf9c..8a8b0c295e 100644
--- a/phpBB/includes/diff/renderer.php
+++ b/phpBB/includes/diff/renderer.php
@@ -56,7 +56,7 @@ class diff_renderer
/**
* Constructor.
*/
- function diff_renderer($params = array())
+ function __construct($params = array())
{
foreach ($params as $param => $value)
{
@@ -128,8 +128,8 @@ class diff_renderer
if (is_array($block))
{
// How many lines to keep as context from the copy block.
- $keep = ($i == sizeof($diffs) - 1) ? $ntrail : $nlead + $ntrail;
- if (sizeof($edit->orig) <= $keep)
+ $keep = ($i == count($diffs) - 1) ? $ntrail : $nlead + $ntrail;
+ if (count($edit->orig) <= $keep)
{
// We have less lines in the block than we want for context => keep the whole block.
$block[] = $edit;
@@ -156,9 +156,9 @@ class diff_renderer
if (!is_array($block))
{
// Extract context lines from the preceding copy block.
- $context = array_slice($context, sizeof($context) - $nlead);
- $x0 = $xi - sizeof($context);
- $y0 = $yi - sizeof($context);
+ $context = array_slice($context, count($context) - $nlead);
+ $x0 = $xi - count($context);
+ $y0 = $yi - count($context);
$block = array();
if ($context)
@@ -169,8 +169,8 @@ class diff_renderer
$block[] = $edit;
}
- $xi += ($edit->orig) ? sizeof($edit->orig) : 0;
- $yi += ($edit->final) ? sizeof($edit->final) : 0;
+ $xi += ($edit->orig) ? count($edit->orig) : 0;
+ $yi += ($edit->final) ? count($edit->final) : 0;
}
if (is_array($block))
@@ -433,7 +433,7 @@ class diff_renderer_inline extends diff_renderer
{
array_walk($lines, array(&$this, '_encode'));
$lines[0] = $this->_ins_prefix . $lines[0];
- $lines[sizeof($lines) - 1] .= $this->_ins_suffix;
+ $lines[count($lines) - 1] .= $this->_ins_suffix;
return $this->_lines($lines, ' ', false);
}
@@ -441,7 +441,7 @@ class diff_renderer_inline extends diff_renderer
{
array_walk($lines, array(&$this, '_encode'));
$lines[0] = $this->_del_prefix . $lines[0];
- $lines[sizeof($lines) - 1] .= $this->_del_suffix;
+ $lines[count($lines) - 1] .= $this->_del_suffix;
return $this->_lines($lines, ' ', false);
}
@@ -617,7 +617,7 @@ class diff_renderer_side_by_side extends diff_renderer
$this->render($diff);
// Is the diff empty?
- if (!sizeof($this->lines))
+ if (!count($this->lines))
{
$output .= '<tr><th colspan="2">' . $user->lang['NO_VISIBLE_CHANGES'] . '</th></tr>';
}
@@ -672,8 +672,8 @@ class diff_renderer_side_by_side extends diff_renderer
case 'change':
// Pop the old/new stacks one by one, until both are empty.
- $oldsize = sizeof($change['old']);
- $newsize = sizeof($change['new']);
+ $oldsize = count($change['old']);
+ $newsize = count($change['new']);
$left = $right = '';
for ($row = 0, $row_max = max($oldsize, $newsize); $row < $row_max; ++$row)
diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php
index 2cd62d7bac..c9f589c174 100644
--- a/phpBB/includes/functions.php
+++ b/phpBB/includes/functions.php
@@ -66,29 +66,48 @@ function set_var(&$result, $var, $type, $multibyte = false)
/**
* Generates an alphanumeric random string of given length
*
+* @param int $num_chars Length of random string, defaults to 8.
+* This number should be less or equal than 64.
+*
* @return string
*/
function gen_rand_string($num_chars = 8)
{
- // [a, z] + [0, 9] = 36
- return substr(strtoupper(base_convert(unique_id(), 16, 36)), 0, $num_chars);
+ $range = array_merge(range('A', 'Z'), range(0, 9));
+ $size = count($range);
+
+ $output = '';
+ for ($i = 0; $i < $num_chars; $i++)
+ {
+ $rand = random_int(0, $size-1);
+ $output .= $range[$rand];
+ }
+
+ return $output;
}
/**
* Generates a user-friendly alphanumeric random string of given length
* We remove 0 and O so users cannot confuse those in passwords etc.
*
+* @param int $num_chars Length of random string, defaults to 8.
+* This number should be less or equal than 64.
+*
* @return string
*/
function gen_rand_string_friendly($num_chars = 8)
{
- $rand_str = unique_id();
+ $range = array_merge(range('A', 'N'), range('P', 'Z'), range(1, 9));
+ $size = count($range);
- // Remove Z and Y from the base_convert(), replace 0 with Z and O with Y
- // [a, z] + [0, 9] - {z, y} = [a, z] + [0, 9] - {0, o} = 34
- $rand_str = str_replace(array('0', 'O'), array('Z', 'Y'), strtoupper(base_convert($rand_str, 16, 34)));
+ $output = '';
+ for ($i = 0; $i < $num_chars; $i++)
+ {
+ $rand = random_int(0, $size-1);
+ $output .= $range[$rand];
+ }
- return substr($rand_str, 0, $num_chars);
+ return $output;
}
/**
@@ -96,7 +115,7 @@ function gen_rand_string_friendly($num_chars = 8)
*/
function unique_id()
{
- return bin2hex(random_bytes(8));
+ return strtolower(gen_rand_string(16));
}
/**
@@ -602,7 +621,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
if ($mode == 'all')
{
- if ($forum_id === false || !sizeof($forum_id))
+ if (empty($forum_id))
{
// Mark all forums read (index page)
/* @var $phpbb_notifications \phpbb\notification\manager */
@@ -661,8 +680,6 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
}
}
}
-
- return;
}
else if ($mode == 'topics')
{
@@ -727,7 +744,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
}
$db->sql_freeresult($result);
- if (sizeof($sql_update))
+ if (count($sql_update))
{
$sql = 'UPDATE ' . FORUMS_TRACK_TABLE . "
SET mark_time = $post_time
@@ -789,8 +806,6 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
unset($tracking);
}
-
- return;
}
else if ($mode == 'topic')
{
@@ -863,7 +878,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
// We get the ten most minimum stored time offsets and its associated topic ids
$time_keys = array();
- for ($i = 0; $i < 10 && sizeof($tracking['t']); $i++)
+ for ($i = 0; $i < 10 && count($tracking['t']); $i++)
{
$min_value = min($tracking['t']);
$m_tkey = array_search($min_value, $tracking['t']);
@@ -904,8 +919,6 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$user->set_cookie('track', tracking_serialize($tracking), $post_time + 31536000);
$request->overwrite($config['cookie_name'] . '_track', tracking_serialize($tracking), \phpbb\request\request_interface::COOKIE);
}
-
- return;
}
else if ($mode == 'post')
{
@@ -930,9 +943,28 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
$db->sql_return_on_error(false);
}
-
- return;
}
+
+ /**
+ * This event is used for performing actions directly after forums,
+ * topics or posts have been marked as read.
+ *
+ * @event core.markread_after
+ * @var string mode Variable containing marking mode value
+ * @var mixed forum_id Variable containing forum id, or false
+ * @var mixed topic_id Variable containing topic id, or false
+ * @var int post_time Variable containing post time
+ * @var int user_id Variable containing the user id
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'mode',
+ 'forum_id',
+ 'topic_id',
+ 'post_time',
+ 'user_id',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.markread_after', compact($vars)));
}
/**
@@ -959,7 +991,7 @@ function get_topic_tracking($forum_id, $topic_ids, &$rowset, $forum_mark_time, $
$topic_ids = array_diff($topic_ids, array_keys($last_read));
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$mark_time = array();
@@ -1011,7 +1043,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis
$topic_ids = array_diff($topic_ids, array_keys($last_read));
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$sql = 'SELECT forum_id, mark_time
FROM ' . FORUMS_TRACK_TABLE . "
@@ -1038,7 +1070,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis
{
global $tracking_topics;
- if (!isset($tracking_topics) || !sizeof($tracking_topics))
+ if (!isset($tracking_topics) || !count($tracking_topics))
{
$tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE);
$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
@@ -1065,7 +1097,7 @@ function get_complete_topic_tracking($forum_id, $topic_ids, $global_announce_lis
$topic_ids = array_diff($topic_ids, array_keys($last_read));
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$mark_time = array();
@@ -1407,7 +1439,7 @@ function tracking_unserialize($string, $max_depth = 3)
switch ($string[$i])
{
case '(':
- if (sizeof($stack) >= $max_depth)
+ if (count($stack) >= $max_depth)
{
die('Invalid data supplied');
}
@@ -1461,7 +1493,7 @@ function tracking_unserialize($string, $max_depth = 3)
}
}
- if (sizeof($stack) != 0 || ($mode != 0 && $mode != 3))
+ if (count($stack) != 0 || ($mode != 0 && $mode != 3))
{
die('Invalid data supplied');
}
@@ -1725,14 +1757,14 @@ function redirect($url, $return = false, $disable_cd_check = false)
if ($url_parts === false)
{
// Malformed url
- trigger_error('INSECURE_REDIRECT', E_USER_ERROR);
+ trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
}
else if (!empty($url_parts['scheme']) && !empty($url_parts['host']))
{
// Attention: only able to redirect within the same domain if $disable_cd_check is false (yourdomain.com -> www.yourdomain.com will not work)
if (!$disable_cd_check && $url_parts['host'] !== $user->host)
{
- trigger_error('INSECURE_REDIRECT', E_USER_ERROR);
+ trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
}
}
else if ($url[0] == '/')
@@ -1772,13 +1804,13 @@ function redirect($url, $return = false, $disable_cd_check = false)
if (!$disable_cd_check && strpos($url, generate_board_url(true) . '/') !== 0)
{
- trigger_error('INSECURE_REDIRECT', E_USER_ERROR);
+ trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
}
// Make sure no linebreaks are there... to prevent http response splitting for PHP < 4.4.2
if (strpos(urldecode($url), "\n") !== false || strpos(urldecode($url), "\r") !== false || strpos($url, ';') !== false)
{
- trigger_error('INSECURE_REDIRECT', E_USER_ERROR);
+ trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
}
// Now, also check the protocol and for a valid url the last time...
@@ -1787,7 +1819,7 @@ function redirect($url, $return = false, $disable_cd_check = false)
if ($url_parts === false || empty($url_parts['scheme']) || !in_array($url_parts['scheme'], $allowed_protocols))
{
- trigger_error('INSECURE_REDIRECT', E_USER_ERROR);
+ trigger_error('INSECURE_REDIRECT', E_USER_WARNING);
}
/**
@@ -1811,27 +1843,6 @@ function redirect($url, $return = false, $disable_cd_check = false)
garbage_collection();
}
- // Redirect via an HTML form for PITA webservers
- if (@preg_match('#WebSTAR|Xitami#', getenv('SERVER_SOFTWARE')))
- {
- header('Refresh: 0; URL=' . $url);
-
- echo '<!DOCTYPE html>';
- echo '<html dir="' . $user->lang['DIRECTION'] . '" lang="' . $user->lang['USER_LANG'] . '">';
- echo '<head>';
- echo '<meta charset="utf-8">';
- echo '<meta http-equiv="X-UA-Compatible" content="IE=edge">';
- echo '<meta http-equiv="refresh" content="0; url=' . str_replace('&', '&amp;', $url) . '" />';
- echo '<title>' . $user->lang['REDIRECT'] . '</title>';
- echo '</head>';
- echo '<body>';
- echo '<div style="text-align: center;">' . sprintf($user->lang['URL_REDIRECT'], '<a href="' . str_replace('&', '&amp;', $url) . '">', '</a>') . '</div>';
- echo '</body>';
- echo '</html>';
-
- exit;
- }
-
// Behave as per HTTP/1.1 spec for others
header('Location: ' . $url);
exit;
@@ -2111,25 +2122,29 @@ function check_form_key($form_name, $timespan = false)
/**
* Build Confirm box
* @param boolean $check True for checking if confirmed (without any additional parameters) and false for displaying the confirm box
-* @param string $title Title/Message used for confirm box.
+* @param string|array $title Title/Message used for confirm box.
* message text is _CONFIRM appended to title.
* If title cannot be found in user->lang a default one is displayed
* If title_CONFIRM cannot be found in user->lang the text given is used.
+* If title is an array, the first array value is used as explained per above,
+* all other array values are sent as parameters to the language function.
* @param string $hidden Hidden variables
* @param string $html_body Template used for confirm box
* @param string $u_action Custom form action
+*
+* @return bool True if confirmation was successful, false if not
*/
function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_body.html', $u_action = '')
{
global $user, $template, $db, $request;
- global $config, $phpbb_path_helper;
+ global $config, $language, $phpbb_path_helper, $phpbb_dispatcher;
if (isset($_POST['cancel']))
{
return false;
}
- $confirm = ($user->lang['YES'] === $request->variable('confirm', '', true, \phpbb\request\request_interface::POST));
+ $confirm = ($language->lang('YES') === $request->variable('confirm', '', true, \phpbb\request\request_interface::POST));
if ($check && $confirm)
{
@@ -2163,13 +2178,27 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
// generate activation key
$confirm_key = gen_rand_string(10);
+ // generate language strings
+ if (is_array($title))
+ {
+ $key = array_shift($title);
+ $count = array_shift($title);
+ $confirm_title = $language->is_set($key) ? $language->lang($key, $count, $title) : $language->lang('CONFIRM');
+ $confirm_text = $language->is_set($key . '_CONFIRM') ? $language->lang($key . '_CONFIRM', $count, $title) : $key;
+ }
+ else
+ {
+ $confirm_title = $language->is_set($title) ? $language->lang($title) : $language->lang('CONFIRM');
+ $confirm_text = $language->is_set($title . '_CONFIRM') ? $language->lang($title . '_CONFIRM') : $title;
+ }
+
if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
{
- adm_page_header((!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title]);
+ adm_page_header($confirm_title);
}
else
{
- page_header((!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title]);
+ page_header($confirm_title);
}
$template->set_filenames(array(
@@ -2185,14 +2214,14 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
// re-add sid / transform & to &amp; for user->page (user->page is always using &)
$use_page = ($u_action) ? $u_action : str_replace('&', '&amp;', $user->page['page']);
- $u_action = reapply_sid($phpbb_path_helper->get_valid_page($use_page, $config['enable_mod_rewrite']), $phpbb_path_helper->is_router_used());
+ $u_action = reapply_sid($phpbb_path_helper->get_valid_page($use_page, $config['enable_mod_rewrite']));
$u_action .= ((strpos($u_action, '?') === false) ? '?' : '&amp;') . 'confirm_key=' . $confirm_key;
$template->assign_vars(array(
- 'MESSAGE_TITLE' => (!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang($title, 1),
- 'MESSAGE_TEXT' => (!isset($user->lang[$title . '_CONFIRM'])) ? $title : $user->lang[$title . '_CONFIRM'],
+ 'MESSAGE_TITLE' => $confirm_title,
+ 'MESSAGE_TEXT' => $confirm_text,
- 'YES_VALUE' => $user->lang['YES'],
+ 'YES_VALUE' => $language->lang('YES'),
'S_CONFIRM_ACTION' => $u_action,
'S_HIDDEN_FIELDS' => $hidden . $s_hidden_fields,
'S_AJAX_REQUEST' => $request->is_ajax(),
@@ -2205,16 +2234,36 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
if ($request->is_ajax())
{
$u_action .= '&confirm_uid=' . $user->data['user_id'] . '&sess=' . $user->session_id . '&sid=' . $user->session_id;
- $json_response = new \phpbb\json_response;
- $json_response->send(array(
+ $data = array(
'MESSAGE_BODY' => $template->assign_display('body'),
- 'MESSAGE_TITLE' => (!isset($user->lang[$title])) ? $user->lang['CONFIRM'] : $user->lang[$title],
- 'MESSAGE_TEXT' => (!isset($user->lang[$title . '_CONFIRM'])) ? $title : $user->lang[$title . '_CONFIRM'],
+ 'MESSAGE_TITLE' => $confirm_title,
+ 'MESSAGE_TEXT' => $confirm_text,
- 'YES_VALUE' => $user->lang['YES'],
+ 'YES_VALUE' => $language->lang('YES'),
'S_CONFIRM_ACTION' => str_replace('&amp;', '&', $u_action), //inefficient, rewrite whole function
'S_HIDDEN_FIELDS' => $hidden . $s_hidden_fields
- ));
+ );
+
+ /**
+ * This event allows an extension to modify the ajax output of confirm box.
+ *
+ * @event core.confirm_box_ajax_before
+ * @var string u_action Action of the form
+ * @var array data Data to be sent
+ * @var string hidden Hidden fields generated by caller
+ * @var string s_hidden_fields Hidden fields generated by this function
+ * @since 3.2.8-RC1
+ */
+ $vars = array(
+ 'u_action',
+ 'data',
+ 'hidden',
+ 's_hidden_fields',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.confirm_box_ajax_before', compact($vars)));
+
+ $json_response = new \phpbb\json_response;
+ $json_response->send($data);
}
if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin'])
@@ -2225,6 +2274,8 @@ function confirm_box($check, $title = '', $hidden = '', $html_body = 'confirm_bo
{
page_footer();
}
+
+ exit; // unreachable, page_footer() above will call exit()
}
/**
@@ -2236,6 +2287,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
global $request, $phpbb_container, $phpbb_dispatcher, $phpbb_log;
$err = '';
+ $form_name = 'login';
// Make sure user->setup() has been called
if (!$user->is_setup())
@@ -2311,8 +2363,19 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
trigger_error('NO_AUTH_ADMIN_USER_DIFFER');
}
- // If authentication is successful we redirect user to previous page
- $result = $auth->login($username, $password, $autologin, $viewonline, $admin);
+ // Check form key
+ if ($password && !defined('IN_CHECK_BAN') && !check_form_key($form_name))
+ {
+ $result = array(
+ 'status' => false,
+ 'error_msg' => 'FORM_INVALID',
+ );
+ }
+ else
+ {
+ // If authentication is successful we redirect user to previous page
+ $result = $auth->login($username, $password, $autologin, $viewonline, $admin);
+ }
// If admin authentication and login, we will log if it was a success or not...
// We also break the operation on the first non-success login - it could be argued that the user already knows
@@ -2344,10 +2407,12 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
* @event core.login_box_redirect
* @var string redirect Redirect string
* @var bool admin Is admin?
+ * @var array result Result from auth provider
* @since 3.1.0-RC5
* @changed 3.1.9-RC1 Removed undefined return variable
+ * @changed 3.2.4-RC1 Added result
*/
- $vars = array('redirect', 'admin');
+ $vars = array('redirect', 'admin', 'result');
extract($phpbb_dispatcher->trigger_event('core.login_box_redirect', compact($vars)));
// append/replace SID (may change during the session for AOL users)
@@ -2463,7 +2528,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
$s_hidden_fields = build_hidden_fields($s_hidden_fields);
- $template->assign_vars(array(
+ $login_box_template_data = array(
'LOGIN_ERROR' => $err,
'LOGIN_EXPLAIN' => $l_explain,
@@ -2471,6 +2536,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
'U_RESEND_ACTIVATION' => ($config['require_activation'] == USER_ACTIVATION_SELF && $config['email_enable']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=resend_act') : '',
'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'),
'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'),
+ 'UA_PRIVACY' => addslashes(append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy')),
'S_DISPLAY_FULL_LOGIN' => ($s_display) ? true : false,
'S_HIDDEN_FIELDS' => $s_hidden_fields,
@@ -2480,7 +2546,29 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
'USERNAME_CREDENTIAL' => 'username',
'PASSWORD_CREDENTIAL' => ($admin) ? 'password_' . $credential : 'password',
- ));
+ );
+
+ /**
+ * Event to add/modify login box template data
+ *
+ * @event core.login_box_modify_template_data
+ * @var int admin Flag whether user is admin
+ * @var string username User name
+ * @var int autologin Flag whether autologin is enabled
+ * @var string redirect Redirect URL
+ * @var array login_box_template_data Array with the login box template data
+ * @since 3.2.3-RC2
+ */
+ $vars = array(
+ 'admin',
+ 'username',
+ 'autologin',
+ 'redirect',
+ 'login_box_template_data',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.login_box_modify_template_data', compact($vars)));
+
+ $template->assign_vars($login_box_template_data);
page_header($user->lang['LOGIN']);
@@ -2497,7 +2585,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa
*/
function login_forum_box($forum_data)
{
- global $db, $phpbb_container, $request, $template, $user, $phpbb_dispatcher;
+ global $db, $phpbb_container, $request, $template, $user, $phpbb_dispatcher, $phpbb_root_path, $phpEx;
$password = $request->variable('password', '', true);
@@ -2582,6 +2670,8 @@ function login_forum_box($forum_data)
'body' => 'login_forum.html')
);
+ make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_data['forum_id']);
+
page_footer();
}
@@ -2676,9 +2766,9 @@ function parse_cfg_file($filename, $lines = false)
{
$value = '';
}
- else if (($value[0] == "'" && $value[sizeof($value) - 1] == "'") || ($value[0] == '"' && $value[sizeof($value) - 1] == '"'))
+ else if (($value[0] == "'" && $value[strlen($value) - 1] == "'") || ($value[0] == '"' && $value[strlen($value) - 1] == '"'))
{
- $value = htmlspecialchars(substr($value, 1, sizeof($value)-2));
+ $value = htmlspecialchars(substr($value, 1, strlen($value)-2));
}
else
{
@@ -2780,12 +2870,17 @@ function get_preg_expression($mode)
case 'url':
// generated with regex_idn.php file in the develop folder
- return "[a-z][a-z\d+\-.]*:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?";
+ return "[a-z][a-z\d+\-.]*(?<!javascript):/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?";
+ break;
+
+ case 'url_http':
+ // generated with regex_idn.php file in the develop folder
+ return "http[s]?:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'()*+,;=:@/?|]+|%[\dA-F]{2})*)?";
break;
case 'url_inline':
// generated with regex_idn.php file in the develop folder
- return "[a-z][a-z\d+]*:/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?";
+ return "[a-z][a-z\d+]*(?<!javascript):/{2}(?:(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})+|[0-9.]+|\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\])(?::\d*)?(?:/(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@|]+|%[\dA-F]{2})*)*(?:\?(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?(?:\#(?:[^\p{C}\p{Z}\p{S}\p{P}\p{Nl}\p{No}\p{Me}\x{1100}-\x{115F}\x{A960}-\x{A97C}\x{1160}-\x{11A7}\x{D7B0}-\x{D7C6}\x{20D0}-\x{20FF}\x{1D100}-\x{1D1FF}\x{1D200}-\x{1D24F}\x{0640}\x{07FA}\x{302E}\x{302F}\x{3031}-\x{3035}\x{303B}]*[\x{00B7}\x{0375}\x{05F3}\x{05F4}\x{30FB}\x{002D}\x{06FD}\x{06FE}\x{0F0B}\x{3007}\x{00DF}\x{03C2}\x{200C}\x{200D}\pL0-9\-._~!$&'(*+,;=:@/?|]+|%[\dA-F]{2})*)?";
break;
case 'www_url':
@@ -3007,7 +3102,7 @@ function phpbb_inet_pton($address)
if (preg_match(get_preg_expression('ipv6'), $address))
{
$parts = explode(':', $address);
- $missing_parts = 8 - sizeof($parts) + 1;
+ $missing_parts = 8 - count($parts) + 1;
if (substr($address, 0, 2) === '::')
{
@@ -3024,7 +3119,7 @@ function phpbb_inet_pton($address)
if (preg_match(get_preg_expression('ipv4'), $last_part))
{
- $parts[sizeof($parts) - 1] = '';
+ $parts[count($parts) - 1] = '';
$last_part = phpbb_inet_pton($last_part);
$embedded_ipv4 = true;
--$missing_parts;
@@ -3036,7 +3131,7 @@ function phpbb_inet_pton($address)
{
$ret .= str_pad($part, 4, '0', STR_PAD_LEFT);
}
- else if ($i && $i < sizeof($parts) - 1)
+ else if ($i && $i < count($parts) - 1)
{
$ret .= str_repeat('0000', $missing_parts);
}
@@ -3632,7 +3727,7 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum'
// Need caps version of $item for language-strings
$item_caps = strtoupper($item);
- if (sizeof($online_users['online_users']))
+ if (count($online_users['online_users']))
{
$sql_ary = array(
'SELECT' => 'u.username, u.username_clean, u.user_id, u.user_type, u.user_allow_viewonline, u.user_colour',
@@ -4030,9 +4125,9 @@ function phpbb_get_user_avatar($user_row, $alt = 'USER_AVATAR', $ignore_config =
*
* @return string Avatar html
*/
-function phpbb_get_group_avatar($user_row, $alt = 'GROUP_AVATAR', $ignore_config = false, $lazy = false)
+function phpbb_get_group_avatar($group_row, $alt = 'GROUP_AVATAR', $ignore_config = false, $lazy = false)
{
- $row = \phpbb\avatar\manager::clean_row($user_row, 'group');
+ $row = \phpbb\avatar\manager::clean_row($group_row, 'group');
return phpbb_get_avatar($row, $alt, $ignore_config, $lazy);
}
@@ -4337,6 +4432,23 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
$controller_helper = $phpbb_container->get('controller.helper');
$notification_mark_hash = generate_link_hash('mark_all_notifications_read');
+ $s_login_redirect = build_hidden_fields(array('redirect' => $phpbb_path_helper->remove_web_root_path(build_url())));
+
+ // Add form token for login box, in case page is presenting a login form.
+ add_form_key('login', '_LOGIN');
+
+ /**
+ * Workaround for missing template variable in pre phpBB 3.2.6 styles.
+ * @deprecated 3.2.7 (To be removed: 3.3.0-a1)
+ */
+ $form_token_login = $template->retrieve_var('S_FORM_TOKEN_LOGIN');
+ if (!empty($form_token_login))
+ {
+ $s_login_redirect .= $form_token_login;
+ // Remove S_FORM_TOKEN_LOGIN as it's already appended to S_LOGIN_REDIRECT
+ $template->assign_var('S_FORM_TOKEN_LOGIN', '');
+ }
+
// The following assigns all _common_ variables that may be used at any point in a template.
$template->assign_vars(array(
'SITENAME' => $config['sitename'],
@@ -4396,9 +4508,10 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'U_SEARCH_ACTIVE_TOPICS'=> append_sid("{$phpbb_root_path}search.$phpEx", 'search_id=active_topics'),
'U_DELETE_COOKIES' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=delete_cookies'),
'U_CONTACT_US' => ($config['contact_admin_form_enable'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=contactadmin') : '',
- 'U_TEAM' => ($user->data['user_id'] != ANONYMOUS && !$auth->acl_get('u_viewprofile')) ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=team'),
+ 'U_TEAM' => (!$auth->acl_get('u_viewprofile')) ? '' : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=team'),
'U_TERMS_USE' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=terms'),
'U_PRIVACY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy'),
+ 'UA_PRIVACY' => addslashes(append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=privacy')),
'U_RESTORE_PERMISSIONS' => ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=restore_perm') : '',
'U_FEED' => $controller_helper->route('phpbb_feed_index'),
@@ -4425,7 +4538,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'S_TOPIC_ID' => $topic_id,
'S_LOGIN_ACTION' => ((!defined('ADMIN_START')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login') : append_sid("{$phpbb_admin_path}index.$phpEx", false, true, $user->session_id)),
- 'S_LOGIN_REDIRECT' => build_hidden_fields(array('redirect' => $phpbb_path_helper->remove_web_root_path(build_url()))),
+ 'S_LOGIN_REDIRECT' => $s_login_redirect,
'S_ENABLE_FEEDS' => ($config['feed_enable']) ? true : false,
'S_ENABLE_FEEDS_OVERALL' => ($config['feed_overall']) ? true : false,
@@ -4458,7 +4571,7 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
'S_COOKIE_NOTICE' => !empty($config['cookie_notice']),
'T_THEME_NAME' => rawurlencode($user->style['style_path']),
- 'T_THEME_LANG_NAME' => $user->data['user_lang'],
+ 'T_THEME_LANG_NAME' => $user->lang_name,
'T_TEMPLATE_NAME' => $user->style['style_path'],
'T_SUPER_TEMPLATE_NAME' => rawurlencode((isset($user->style['style_parent_tree']) && $user->style['style_parent_tree']) ? $user->style['style_parent_tree'] : $user->style['style_path']),
'T_IMAGES' => 'images',
@@ -4476,12 +4589,13 @@ function page_header($page_title = '', $display_online_list = false, $item_id =
if ($send_headers)
{
- // An array of http headers that phpbb will set. The following event may override these.
+ // An array of http headers that phpBB will set. The following event may override these.
$http_headers += array(
// application/xhtml+xml not used because of IE
'Content-type' => 'text/html; charset=UTF-8',
'Cache-Control' => 'private, no-cache="set-cookie"',
'Expires' => gmdate('D, d M Y H:i:s', time()) . ' GMT',
+ 'Referrer-Policy' => 'strict-origin-when-cross-origin',
);
if (!empty($user->data['is_bot']))
{
diff --git a/phpBB/includes/functions_acp.php b/phpBB/includes/functions_acp.php
index 8bf42aa36e..a2014a7d5b 100644
--- a/phpBB/includes/functions_acp.php
+++ b/phpBB/includes/functions_acp.php
@@ -112,12 +112,13 @@ function adm_page_header($page_title)
'CONTAINER_EXCEPTION' => $phpbb_container->hasParameter('container_exception') ? $phpbb_container->getParameter('container_exception') : false,
));
- // An array of http headers that phpbb will set. The following event may override these.
+ // An array of http headers that phpBB will set. The following event may override these.
$http_headers = array(
// application/xhtml+xml not used because of IE
'Content-type' => 'text/html; charset=UTF-8',
'Cache-Control' => 'private, no-cache="set-cookie"',
'Expires' => gmdate('D, d M Y H:i:s', time()) . ' GMT',
+ 'Referrer-Policy' => 'strict-origin-when-cross-origin',
);
/**
@@ -419,7 +420,7 @@ function build_cfg_template($tpl_type, $key, &$new_ary, $config_key, $vars)
*/
function validate_config_vars($config_vars, &$cfg_array, &$error)
{
- global $phpbb_root_path, $user, $phpbb_dispatcher, $phpbb_filesystem;
+ global $phpbb_root_path, $user, $phpbb_dispatcher, $phpbb_filesystem, $language;
$type = 0;
$min = 1;
@@ -442,6 +443,16 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
// Validate a bit. ;) (0 = type, 1 = min, 2= max)
switch ($validator[$type])
{
+ case 'url':
+ $cfg_array[$config_name] = trim($cfg_array[$config_name]);
+
+ if (!empty($cfg_array[$config_name]) && !preg_match('#^' . get_preg_expression('url') . '$#iu', $cfg_array[$config_name]))
+ {
+ $error[] = $language->lang('URL_INVALID', $language->lang($config_definition['lang']));
+ }
+
+ // no break here
+
case 'string':
$length = utf8_strlen($cfg_array[$config_name]);
@@ -564,9 +575,6 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
$cfg_array[$config_name] = trim($destination);
- // Absolute file path
- case 'absolute_path':
- case 'absolute_path_writable':
// Path being relative (still prefixed by phpbb_root_path), but with the ability to escape the root dir...
case 'path':
case 'wpath':
@@ -585,7 +593,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
break;
}
- $path = in_array($config_definition['validate'], array('wpath', 'path', 'rpath', 'rwpath')) ? $phpbb_root_path . $cfg_array[$config_name] : $cfg_array[$config_name];
+ $path = $phpbb_root_path . $cfg_array[$config_name];
if (!file_exists($path))
{
@@ -598,7 +606,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
}
// Check if the path is writable
- if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath' || $config_definition['validate'] === 'absolute_path_writable')
+ if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath')
{
if (file_exists($path) && !$phpbb_filesystem->is_writable($path))
{
diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php
index 1ad41156f9..c19d48b0be 100644
--- a/phpBB/includes/functions_admin.php
+++ b/phpBB/includes/functions_admin.php
@@ -167,7 +167,7 @@ function size_select_options($size_compare)
$s_size_options = '';
- for ($i = 0, $size = sizeof($size_types_text); $i < $size; $i++)
+ for ($i = 0, $size = count($size_types_text); $i < $size; $i++)
{
$selected = ($size_compare == $size_types[$i]) ? ' selected="selected"' : '';
$s_size_options .= '<option value="' . $size_types[$i] . '"' . $selected . '>' . $size_types_text[$i] . '</option>';
@@ -192,7 +192,7 @@ function group_select_options($group_id, $exclude_ids = false, $manage_founder =
/** @var \phpbb\group\helper $group_helper */
$group_helper = $phpbb_container->get('group_helper');
- $exclude_sql = ($exclude_ids !== false && sizeof($exclude_ids)) ? 'WHERE ' . $db->sql_in_set('group_id', array_map('intval', $exclude_ids), true) : '';
+ $exclude_sql = ($exclude_ids !== false && count($exclude_ids)) ? 'WHERE ' . $db->sql_in_set('group_id', array_map('intval', $exclude_ids), true) : '';
$sql_and = (!$config['coppa_enable']) ? (($exclude_sql) ? ' AND ' : ' WHERE ') . "group_name <> 'REGISTERED_COPPA'" : '';
$sql_founder = ($manage_founder !== false) ? (($exclude_sql || $sql_and) ? ' AND ' : ' WHERE ') . 'group_founder_manage = ' . (int) $manage_founder : '';
@@ -747,7 +747,7 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
{
$where_ids = (is_array($where_ids)) ? array_unique($where_ids) : array($where_ids);
- if (!sizeof($where_ids))
+ if (!count($where_ids))
{
return array('topics' => 0, 'posts' => 0);
}
@@ -777,9 +777,9 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
}
$db->sql_freeresult($result);
- $return['topics'] = sizeof($topic_ids);
+ $return['topics'] = count($topic_ids);
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
return $return;
}
@@ -837,7 +837,7 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
}
$db->sql_freeresult($result);
- if (sizeof($moved_topic_ids))
+ if (count($moved_topic_ids))
{
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE ' . $db->sql_in_set('topic_id', $moved_topic_ids);
@@ -923,7 +923,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$where_ids = array($where_ids);
}
- if (!sizeof($where_ids))
+ if (!count($where_ids))
{
return false;
}
@@ -931,7 +931,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$where_ids = array_map('intval', $where_ids);
/* Possible code for splitting post deletion
- if (sizeof($where_ids) >= 1001)
+ if (count($where_ids) >= 1001)
{
// Split into chunks of 1000
$chunks = array_chunk($where_ids, 1000);
@@ -974,7 +974,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
}
$db->sql_freeresult($result);
- if (!sizeof($post_ids))
+ if (!count($post_ids))
{
return false;
}
@@ -1018,7 +1018,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
unset($table_ary);
// Adjust users post counts
- if (sizeof($post_counts) && $post_count_sync)
+ if (count($post_counts) && $post_count_sync)
{
foreach ($post_counts as $poster_id => $substract)
{
@@ -1037,7 +1037,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
}
// Remove topics now having no posts?
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$sql = 'SELECT topic_id
FROM ' . POSTS_TABLE . '
@@ -1147,7 +1147,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
}
// We actually remove topics now to not be inconsistent (the delete_topics function calls this function too)
- if (sizeof($remove_topics) && $call_delete_topics)
+ if (count($remove_topics) && $call_delete_topics)
{
delete_topics('topic_id', $remove_topics, $auto_sync, $post_count_sync, false);
}
@@ -1157,7 +1157,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$phpbb_notifications->delete_notifications($delete_notifications_types, $post_ids);
- return sizeof($post_ids);
+ return count($post_ids);
}
/**
@@ -1232,7 +1232,7 @@ function delete_topic_shadows($forum_id, $sql_more = '', $auto_sync = true)
$db->sql_query($sql);
}
}
- while (sizeof($topic_ids) == $batch_size);
+ while (count($topic_ids) == $batch_size);
if ($auto_sync)
{
@@ -1363,7 +1363,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// Do not sync the "global forum"
$where_ids = array_diff($where_ids, array(0));
- if (!sizeof($where_ids))
+ if (!count($where_ids))
{
// Empty array with IDs. This means that we don't have any work to do. Just return.
return;
@@ -1377,7 +1377,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
else
{
- if (!sizeof($where_ids))
+ if (!count($where_ids))
{
return;
}
@@ -1416,7 +1416,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
$db->sql_freeresult($result);
- if (!sizeof($topic_id_ary))
+ if (!count($topic_id_ary))
{
return;
}
@@ -1533,7 +1533,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$post_ids[] = $post_id;
}
- if (sizeof($post_ids))
+ if (count($post_ids))
{
$sql = 'UPDATE ' . POSTS_TABLE . '
SET post_reported = 1 - post_reported
@@ -1579,7 +1579,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
$db->sql_freeresult($result);
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_reported = 1 - topic_reported
@@ -1638,7 +1638,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$post_ids[] = $post_id;
}
- if (sizeof($post_ids))
+ if (count($post_ids))
{
$sql = 'UPDATE ' . POSTS_TABLE . '
SET post_attachment = 1 - post_attachment
@@ -1684,7 +1684,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
$db->sql_freeresult($result);
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_attachment = 1 - topic_attachment
@@ -1736,7 +1736,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
$db->sql_freeresult($result);
- if (!sizeof($forum_ids))
+ if (!count($forum_ids))
{
break;
}
@@ -1775,7 +1775,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// 3: Get post count for each forum (optional)
if ($sync_extra)
{
- if (sizeof($forum_ids) == 1)
+ if (count($forum_ids) == 1)
{
$sql = 'SELECT SUM(t.topic_posts_approved) AS forum_posts_approved, SUM(t.topic_posts_unapproved) AS forum_posts_unapproved, SUM(t.topic_posts_softdeleted) AS forum_posts_softdeleted
FROM ' . TOPICS_TABLE . ' t
@@ -1795,7 +1795,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
while ($row = $db->sql_fetchrow($result))
{
- $forum_id = (sizeof($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
+ $forum_id = (count($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
$forum_data[$forum_id]['posts_approved'] = (int) $row['forum_posts_approved'];
$forum_data[$forum_id]['posts_unapproved'] = (int) $row['forum_posts_unapproved'];
@@ -1805,7 +1805,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
// 4: Get last_post_id for each forum
- if (sizeof($forum_ids) == 1)
+ if (count($forum_ids) == 1)
{
$sql = 'SELECT MAX(t.topic_last_post_id) as last_post_id
FROM ' . TOPICS_TABLE . ' t
@@ -1825,7 +1825,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
while ($row = $db->sql_fetchrow($result))
{
- $forum_id = (sizeof($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
+ $forum_id = (count($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
$forum_data[$forum_id]['last_post_id'] = (int) $row['last_post_id'];
@@ -1834,7 +1834,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_freeresult($result);
// 5: Retrieve last_post infos
- if (sizeof($post_ids))
+ if (count($post_ids))
{
$sql = 'SELECT p.post_id, p.poster_id, p.post_subject, p.post_time, p.post_username, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
@@ -1902,7 +1902,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
}
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$sql = 'UPDATE ' . FORUMS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
@@ -2025,20 +2025,20 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
// Now we delete empty topics and orphan posts
- if (sizeof($delete_posts))
+ if (count($delete_posts))
{
delete_posts('topic_id', array_keys($delete_posts), false);
unset($delete_posts);
}
- if (!sizeof($topic_data))
+ if (!count($topic_data))
{
// If we get there, topic ids were invalid or topics did not contain any posts
delete_topics($where_type, $where_ids, true);
return;
}
- if (sizeof($delete_topics))
+ if (count($delete_topics))
{
$delete_topic_ids = array();
foreach ($delete_topics as $topic_id => $void)
@@ -2081,7 +2081,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_freeresult($result);
// Make sure shadow topics do link to existing topics
- if (sizeof($moved_topics))
+ if (count($moved_topics))
{
$delete_topics = array();
@@ -2098,7 +2098,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
$db->sql_freeresult($result);
- if (sizeof($delete_topics))
+ if (count($delete_topics))
{
delete_topics('topic_id', $delete_topics, false);
}
@@ -2121,7 +2121,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_freeresult($result);
$sync_shadow_topics = array();
- if (sizeof($post_ids))
+ if (count($post_ids))
{
$sql = 'SELECT p.post_id, p.topic_id, p.post_visibility, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
@@ -2174,7 +2174,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$shadow_topic_data = array();
// Update the information we collected
- if (sizeof($sync_shadow_topics))
+ if (count($sync_shadow_topics))
{
foreach ($sync_shadow_topics as $sync_topic_id => $sql_ary)
{
@@ -2239,7 +2239,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
}
}
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
@@ -2256,7 +2256,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// if some topics have been resync'ed then resync parent forums
// except when we're only syncing a range, we don't want to sync forums during
// batch processing.
- if ($resync_parents && sizeof($resync_forums) && $where_type != 'range')
+ if ($resync_parents && count($resync_forums) && $where_type != 'range')
{
sync('forum', 'forum_id', array_values($resync_forums), true, true);
}
@@ -2278,7 +2278,7 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync
$forum_id = array($forum_id);
}
- if (!sizeof($forum_id))
+ if (!count($forum_id))
{
return;
}
@@ -2369,6 +2369,16 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync
$topic_list = array_unique($topic_list);
}
+ /**
+ * Perform additional actions before topic deletion via pruning
+ *
+ * @event core.prune_delete_before
+ * @var int[] topic_list The IDs of the topics to be deleted
+ * @since 3.2.2-RC1
+ */
+ $vars = array('topic_list');
+ extract($phpbb_dispatcher->trigger_event('core.prune_delete_before', compact($vars)));
+
return delete_topics('topic_id', $topic_list, $auto_sync, false);
}
@@ -2441,7 +2451,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
$hold_ary = $auth->acl_user_raw_data(false, 'm_%', false);
// Add users?
- if (sizeof($hold_ary))
+ if (!empty($hold_ary))
{
// At least one moderative option warrants a display
$ug_id_ary = array_keys($hold_ary);
@@ -2486,7 +2496,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
}
$db->sql_freeresult($result);
- if (sizeof($hold_ary))
+ if (count($hold_ary))
{
// Get usernames...
$sql = 'SELECT user_id, username
@@ -2526,7 +2536,7 @@ function phpbb_cache_moderators($db, $cache, $auth)
// Now to the groups...
$hold_ary = $auth->acl_group_raw_data(false, 'm_%', false);
- if (sizeof($hold_ary))
+ if (!empty($hold_ary))
{
$ug_id_ary = array_keys($hold_ary);
@@ -2630,7 +2640,7 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id
function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
{
// update foes for some user
- if (is_array($user_id) && sizeof($user_id))
+ if (is_array($user_id) && count($user_id))
{
$sql = 'DELETE FROM ' . ZEBRA_TABLE . '
WHERE ' . $db->sql_in_set('zebra_id', $user_id) . '
@@ -2640,7 +2650,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
}
// update foes for some group
- if (is_array($group_id) && sizeof($group_id))
+ if (is_array($group_id) && count($group_id))
{
// Grab group settings...
$sql_ary = array(
@@ -2674,7 +2684,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
}
$db->sql_freeresult($result);
- if (!sizeof($groups))
+ if (!count($groups))
{
return;
}
@@ -2704,7 +2714,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
}
$db->sql_freeresult($result);
- if (sizeof($users))
+ if (count($users))
{
$sql = 'DELETE FROM ' . ZEBRA_TABLE . '
WHERE ' . $db->sql_in_set('zebra_id', $users) . '
@@ -2727,7 +2737,7 @@ function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
}
}
- if (sizeof($perms))
+ if (count($perms))
{
$sql = 'DELETE FROM ' . ZEBRA_TABLE . '
WHERE ' . $db->sql_in_set('zebra_id', array_unique($perms)) . '
@@ -2990,7 +3000,7 @@ function tidy_warnings()
}
$db->sql_freeresult($result);
- if (sizeof($warning_list))
+ if (count($warning_list))
{
$db->sql_transaction('begin');
@@ -3032,6 +3042,8 @@ function tidy_database()
}
$db->sql_freeresult($result);
+ $db->sql_transaction('begin');
+
// Delete those rows from the acl tables not having listed the forums above
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
@@ -3041,6 +3053,8 @@ function tidy_database()
WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
$db->sql_query($sql);
+ $db->sql_transaction('commit');
+
$config->set('database_last_gc', time(), false);
}
diff --git a/phpBB/includes/functions_compatibility.php b/phpBB/includes/functions_compatibility.php
index 4fe7e71117..e95fa40a58 100644
--- a/phpBB/includes/functions_compatibility.php
+++ b/phpBB/includes/functions_compatibility.php
@@ -391,7 +391,7 @@ function request_var($var_name, $default, $multibyte = false, $cookie = false, $
*
* @deprecated 3.1.0 (To be removed: 3.3.0)
*/
-function get_tables(&$db)
+function get_tables($db)
{
$db_tools_factory = new \phpbb\db\tools\factory();
$db_tools = $db_tools_factory->get($db);
diff --git a/phpBB/includes/functions_compress.php b/phpBB/includes/functions_compress.php
index 910708f502..e86da77b38 100644
--- a/phpBB/includes/functions_compress.php
+++ b/phpBB/includes/functions_compress.php
@@ -210,7 +210,7 @@ class compress_zip extends compress
/**
* Constructor
*/
- function compress_zip($mode, $file)
+ function __construct($mode, $file)
{
global $phpbb_filesystem;
@@ -409,7 +409,7 @@ class compress_zip extends compress
function close()
{
// Write out central file directory and footer ... if it exists
- if (sizeof($this->ctrl_dir))
+ if (count($this->ctrl_dir))
{
fwrite($this->fp, $this->file());
}
@@ -511,8 +511,8 @@ class compress_zip extends compress
$ctrldir = implode('', $this->ctrl_dir);
return $ctrldir . $this->eof_cdh .
- pack('v', sizeof($this->ctrl_dir)) . // total # of entries "on this disk"
- pack('v', sizeof($this->ctrl_dir)) . // total # of entries overall
+ pack('v', count($this->ctrl_dir)) . // total # of entries "on this disk"
+ pack('v', count($this->ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
pack('V', $this->datasec_len) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
@@ -569,7 +569,7 @@ class compress_tar extends compress
/**
* Constructor
*/
- function compress_tar($mode, $file, $type = '')
+ function __construct($mode, $file, $type = '')
{
global $phpbb_filesystem;
diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php
index 06223027d8..2542be5e02 100644
--- a/phpBB/includes/functions_content.php
+++ b/phpBB/includes/functions_content.php
@@ -336,7 +336,7 @@ function get_context($text, $words, $length = 400)
$text = str_replace($entities, $characters, $text);
$word_indizes = array();
- if (sizeof($words))
+ if (count($words))
{
$match = '';
// find the starting indizes of all words
@@ -361,12 +361,12 @@ function get_context($text, $words, $length = 400)
}
unset($match);
- if (sizeof($word_indizes))
+ if (count($word_indizes))
{
$word_indizes = array_unique($word_indizes);
sort($word_indizes);
- $wordnum = sizeof($word_indizes);
+ $wordnum = count($word_indizes);
// number of characters on the right and left side of each word
$sequence_length = (int) ($length / (2 * $wordnum)) - 2;
$final_text = '';
@@ -434,7 +434,7 @@ function get_context($text, $words, $length = 400)
}
}
- if (!sizeof($words) || !sizeof($word_indizes))
+ if (!count($words) || !count($word_indizes))
{
return str_replace($characters, $entities, ((utf8_strlen($text) >= $length + 3) ? utf8_substr($text, 0, $length) . '...' : $text));
}
@@ -627,7 +627,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text
}
else
{
- $bbcode->bbcode($bitfield);
+ $bbcode->bbcode_set_bitfield($bitfield);
}
$bbcode->bbcode_second_pass($text, $uid);
@@ -1021,7 +1021,7 @@ function censor_text($text)
}
}
- if (sizeof($censors))
+ if (count($censors))
{
return preg_replace($censors['match'], $censors['replace'], $text);
}
@@ -1079,7 +1079,7 @@ function smiley_text($text, $force_option = false)
*/
function parse_attachments($forum_id, &$message, &$attachments, &$update_count_ary, $preview = false)
{
- if (!sizeof($attachments))
+ if (!count($attachments))
{
return;
}
@@ -1114,7 +1114,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count_a
}
// Grab attachments (security precaution)
- if (sizeof($attach_ids))
+ if (count($attach_ids))
{
global $db;
@@ -1151,7 +1151,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count_a
foreach ($attachments as $attachment)
{
- if (!sizeof($attachment))
+ if (!count($attachment))
{
continue;
}
@@ -1443,7 +1443,7 @@ function truncate_string($string, $max_length = 60, $max_store_length = 255, $al
$chars = array_map('utf8_htmlspecialchars', $_chars);
// Now check the length ;)
- if (sizeof($chars) > $max_length)
+ if (count($chars) > $max_length)
{
// Cut off the last elements from the array
$string = implode('', array_slice($chars, 0, $max_length - utf8_strlen($append)));
@@ -1482,6 +1482,8 @@ function truncate_string($string, $max_length = 60, $max_store_length = 255, $al
* Get username details for placing into templates.
* This function caches all modes on first call, except for no_profile and anonymous user - determined by $user_id.
*
+* @html Username spans and links
+*
* @param string $mode Can be profile (for getting an url to the profile), username (for obtaining the username), colour (for obtaining the user colour), full (for obtaining a html string representing a coloured link to the users profile) or no_profile (the same as full but forcing no profile link)
* @param int $user_id The users id
* @param string $username The users name
@@ -1501,6 +1503,7 @@ function get_username_string($mode, $user_id, $username, $username_colour = '',
{
global $phpbb_root_path, $phpEx;
+ /** @html Username spans and links for usage in the template */
$_profile_cache['base_url'] = append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile&amp;u={USER_ID}');
$_profile_cache['tpl_noprofile'] = '<span class="username">{USERNAME}</span>';
$_profile_cache['tpl_noprofile_colour'] = '<span style="color: {USERNAME_COLOUR};" class="username-coloured">{USERNAME}</span>';
@@ -1651,7 +1654,7 @@ function phpbb_generate_string_list($items, $user)
return '';
}
- $count = sizeof($items);
+ $count = count($items);
$last_item = array_pop($items);
$lang_key = 'STRING_LIST_MULTI';
@@ -1672,7 +1675,7 @@ class bitfield
{
var $data;
- function bitfield($bitfield = '')
+ function __construct($bitfield = '')
{
$this->data = base64_decode($bitfield);
}
@@ -1758,3 +1761,48 @@ class bitfield
$this->data = $this->data | $bitfield->get_blob();
}
}
+
+/**
+ * Formats the quote according to the given BBCode status setting
+ *
+ * @param phpbb\language\language $language Language class
+ * @param parse_message $message_parser Message parser class
+ * @param phpbb\textformatter\utils_interface $text_formatter_utils Text formatter utilities
+ * @param bool $bbcode_status The status of the BBCode setting
+ * @param array $quote_attributes The attributes of the quoted post
+ * @param string $message_link Link of the original quoted post
+ */
+function phpbb_format_quote($language, $message_parser, $text_formatter_utils, $bbcode_status, $quote_attributes, $message_link = '')
+{
+ if ($bbcode_status)
+ {
+ $quote_text = $text_formatter_utils->generate_quote(
+ censor_text($message_parser->message),
+ $quote_attributes
+ );
+
+ $message_parser->message = $quote_text . "\n\n";
+ }
+ else
+ {
+ $offset = 0;
+ $quote_string = "&gt; ";
+ $message = censor_text(trim($message_parser->message));
+ // see if we are nesting. It's easily tricked but should work for one level of nesting
+ if (strpos($message, "&gt;") !== false)
+ {
+ $offset = 10;
+ }
+ $message = utf8_wordwrap($message, 75 + $offset, "\n");
+
+ $message = $quote_string . $message;
+ $message = str_replace("\n", "\n" . $quote_string, $message);
+
+ $message_parser->message = $quote_attributes['author'] . " " . $language->lang('WROTE') . ":\n" . $message . "\n";
+ }
+
+ if ($message_link)
+ {
+ $message_parser->message = $message_link . $message_parser->message;
+ }
+}
diff --git a/phpBB/includes/functions_convert.php b/phpBB/includes/functions_convert.php
index 176e3dd6de..2cfbe9541d 100644
--- a/phpBB/includes/functions_convert.php
+++ b/phpBB/includes/functions_convert.php
@@ -192,7 +192,7 @@ function get_group_id($group_name)
$db->sql_freeresult($result);
}
- if (!sizeof($group_mapping))
+ if (!count($group_mapping))
{
add_default_groups();
return get_group_id($group_name);
@@ -249,7 +249,7 @@ function validate_website($url)
{
return '';
}
- else if (!preg_match('#^[a-z0-9]+://#i', $url) && strlen($url) > 0)
+ else if (!preg_match('#^http[s]?://#i', $url) && strlen($url) > 0)
{
return 'http://' . $url;
}
@@ -307,7 +307,7 @@ function decode_ip($int_ip)
$hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
// Any mod changing the way ips are stored? Then we are not able to convert and enter the ip "as is" to not "destroy" anything...
- if (sizeof($hexipbang) < 4)
+ if (count($hexipbang) < 4)
{
return $int_ip;
}
@@ -479,7 +479,7 @@ function import_avatar_gallery($gallery_name = '', $subdirs_as_galleries = false
$dir->close();
}
- for ($i = 0, $end = sizeof($dirlist); $i < $end; ++$i)
+ for ($i = 0, $end = count($dirlist); $i < $end; ++$i)
{
$dir = $dirlist[$i];
@@ -1261,7 +1261,7 @@ function get_config()
}
}
- if (!sizeof($convert_config))
+ if (!count($convert_config))
{
$convert->p_master->error($user->lang['CONV_ERROR_CONFIG_EMPTY'], __LINE__, __FILE__);
}
@@ -1406,9 +1406,9 @@ function get_path($src_path, $src_url, $test_file)
$url_parts = explode('/', $m[2]);
if (substr($src_url, -1) != '/')
{
- if (preg_match('/.*\.([a-z0-9]{3,4})$/i', $url_parts[sizeof($url_parts) - 1]))
+ if (preg_match('/.*\.([a-z0-9]{3,4})$/i', $url_parts[count($url_parts) - 1]))
{
- $url_parts[sizeof($url_parts) - 1] = '';
+ $url_parts[count($url_parts) - 1] = '';
}
else
{
@@ -1425,9 +1425,9 @@ function get_path($src_path, $src_url, $test_file)
$path_array = array();
$phpbb_parts = explode('/', $script_path);
- for ($i = 0, $end = sizeof($url_parts); $i < $end; ++$i)
+ for ($i = 0, $end = count($url_parts); $i < $end; ++$i)
{
- if ($i < sizeof($phpbb_parts[$i]) && $url_parts[$i] == $phpbb_parts[$i])
+ if ($i < count($phpbb_parts[$i]) && $url_parts[$i] == $phpbb_parts[$i])
{
$path_array[] = $url_parts[$i];
unset($url_parts[$i]);
@@ -1435,7 +1435,7 @@ function get_path($src_path, $src_url, $test_file)
else
{
$path = '';
- for ($j = $i, $end2 = sizeof($phpbb_parts); $j < $end2; ++$j)
+ for ($j = $i, $end2 = count($phpbb_parts); $j < $end2; ++$j)
{
$path .= '../';
}
@@ -1458,7 +1458,7 @@ function get_path($src_path, $src_url, $test_file)
function compare_table($tables, $tablename, &$prefixes)
{
- for ($i = 0, $table_size = sizeof($tables); $i < $table_size; ++$i)
+ for ($i = 0, $table_size = count($tables); $i < $table_size; ++$i)
{
if (preg_match('/(.*)' . $tables[$i] . '$/', $tablename, $m))
{
@@ -1754,7 +1754,7 @@ function add_default_groups()
);
}
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(GROUPS_TABLE, $sql_ary);
}
@@ -1786,7 +1786,7 @@ function add_groups_to_teampage()
}
$db->sql_freeresult($result);
- if (sizeof($teampage_ary))
+ if (count($teampage_ary))
{
$db->sql_multi_insert(TEAMPAGE_TABLE, $teampage_ary);
}
@@ -2101,7 +2101,7 @@ function update_topics_posted()
}
unset($posted);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary);
}
@@ -2136,7 +2136,7 @@ function fix_empty_primary_groups()
}
$db->sql_freeresult($result);
- if (sizeof($user_ids))
+ if (count($user_ids))
{
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('administrators') . '
WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
@@ -2152,7 +2152,7 @@ function fix_empty_primary_groups()
}
$db->sql_freeresult($result);
- if (sizeof($user_ids))
+ if (count($user_ids))
{
$db->sql_query('UPDATE ' . USERS_TABLE . ' SET group_id = ' . get_group_id('global_moderators') . '
WHERE group_id = 0 AND ' . $db->sql_in_set('user_id', $user_ids));
@@ -2264,7 +2264,7 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
"\n\n"
);
- for ($i = 0, $end = sizeof($str_from); $i < $end; ++$i)
+ for ($i = 0, $end = count($str_from); $i < $end; ++$i)
{
$origx[] = '#\\' . str_replace(']', '\\]', $str_from[$i]) . '#is';
$replx[] = $str_to[$i];
@@ -2273,7 +2273,7 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
if (preg_match_all('#\[email=([^\]]+)\](.*?)\[/email\]#i', $message, $m))
{
- for ($i = 0, $end = sizeof($m[1]); $i < $end; ++$i)
+ for ($i = 0, $end = count($m[1]); $i < $end; ++$i)
{
if ($m[1][$i] == $m[2][$i])
{
@@ -2292,7 +2292,7 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
$message = preg_replace('#\[size=([0-9]+)\](.*?)\[/size\]#i', '[size=\1]\2[/size]', $message);
$message = preg_replace('#\[size=[0-9]{2,}\](.*?)\[/size\]#i', '[size=29]\1[/size]', $message);
- for ($i = sizeof($size); $i;)
+ for ($i = count($size); $i;)
{
$i--;
$message = str_replace('[size=' . $i . ']', '[size=' . $size[$i] . ']', $message);
@@ -2335,9 +2335,9 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour
$path = $phpbb_root_path;
$parts = explode('/', $trg);
- unset($parts[sizeof($parts) - 1]);
+ unset($parts[count($parts) - 1]);
- for ($i = 0, $end = sizeof($parts); $i < $end; ++$i)
+ for ($i = 0, $end = count($parts); $i < $end; ++$i)
{
$path .= $parts[$i] . '/';
@@ -2437,7 +2437,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
if ($copy_subdirs)
{
- for ($i = 0, $end = sizeof($dirlist); $i < $end; ++$i)
+ for ($i = 0, $end = count($dirlist); $i < $end; ++$i)
{
$dir = $dirlist[$i];
@@ -2458,21 +2458,21 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
$bad_dirs[] = $trg_path . $dir;
}
- if (!sizeof($bad_dirs))
+ if (!count($bad_dirs))
{
copy_dir($src . $dir, $trg . $dir, true, $overwrite, $die_on_failure, $source_relative_path);
}
}
}
- if (sizeof($bad_dirs))
+ if (count($bad_dirs))
{
- $str = (sizeof($bad_dirs) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE'];
+ $str = (count($bad_dirs) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE'];
sort($bad_dirs);
$convert->p_master->error(sprintf($str, implode('<br />', $bad_dirs)), __LINE__, __FILE__);
}
- for ($i = 0, $end = sizeof($filelist); $i < $end; ++$i)
+ for ($i = 0, $end = count($filelist); $i < $end; ++$i)
{
copy_file($src . $filelist[$i], $trg . $filelist[$i], $overwrite, $die_on_failure, $source_relative_path);
}
diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
index e5d6d683fe..d0a0c97c4e 100644
--- a/phpBB/includes/functions_display.php
+++ b/phpBB/includes/functions_display.php
@@ -506,7 +506,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
}
}
- $l_subforums = (sizeof($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'];
+ $l_subforums = (count($subforums[$forum_id]) == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'];
$folder_image = ($forum_unread) ? 'forum_unread_subforum' : 'forum_read_subforum';
}
else
@@ -537,7 +537,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
// Create last post link information, if appropriate
if ($row['forum_last_post_id'])
{
- if ($row['forum_password_last_post'] === '' && $auth->acl_get('f_read', $row['forum_id_last_post']))
+ if ($row['forum_password_last_post'] === '' && $auth->acl_gets('f_read', 'f_list_topics', $row['forum_id_last_post']))
{
$last_post_subject = censor_text($row['forum_last_post_subject']);
$last_post_subject_truncated = truncate_string($last_post_subject, 30, 255, false, $user->lang['ELLIPSIS']);
@@ -559,7 +559,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$l_moderator = $moderators_list = '';
if ($display_moderators && !empty($forum_moderators[$forum_id]))
{
- $l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
+ $l_moderator = (count($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
$moderators_list = implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]);
}
@@ -606,7 +606,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'S_AUTH_READ' => $auth->acl_get('f_read', $row['forum_id']),
'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false,
- 'S_SUBFORUMS' => (sizeof($subforums_list)) ? true : false,
+ 'S_SUBFORUMS' => (count($subforums_list)) ? true : false,
'S_DISPLAY_SUBJECT' => ($last_post_subject !== '' && $config['display_last_subject']) ? true : false,
'S_FEED_ENABLED' => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false,
@@ -1243,6 +1243,7 @@ function display_user_activity(&$userdata_ary)
}
$userdata = $userdata_ary;
+ $show_user_activity = true;
/**
* Alter list of forums and topics to display as active
*
@@ -1250,9 +1251,11 @@ function display_user_activity(&$userdata_ary)
* @var array userdata User's data
* @var array active_f_row List of active forums
* @var array active_t_row List of active posts
+ * @var bool show_user_activity Show user forum and topic activity
* @since 3.1.0-RC3
+ * @changed 3.2.5-RC1 Added show_user_activity into event
*/
- $vars = array('userdata', 'active_f_row', 'active_t_row');
+ $vars = array('userdata', 'active_f_row', 'active_t_row', 'show_user_activity');
extract($phpbb_dispatcher->trigger_event('core.display_user_activity_modify_actives', compact($vars)));
$userdata_ary = $userdata;
unset($userdata);
@@ -1289,7 +1292,7 @@ function display_user_activity(&$userdata_ary)
'ACTIVE_TOPIC_PCT' => sprintf($l_active_pct, $active_t_pct),
'U_ACTIVE_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id),
'U_ACTIVE_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id),
- 'S_SHOW_ACTIVITY' => true)
+ 'S_SHOW_ACTIVITY' => $show_user_activity)
);
}
@@ -1648,10 +1651,10 @@ function phpbb_show_profile($data, $user_notes_enabled = false, $warn_user_enabl
($data['user_type'] != USER_INACTIVE || $data['user_inactive_reason'] != INACTIVE_MANUAL) &&
// They must be able to read PMs
- sizeof($auth->acl_get_list($user_id, 'u_readpm')) &&
+ count($auth->acl_get_list($user_id, 'u_readpm')) &&
// They must not be permanently banned
- !sizeof(phpbb_get_banned_user_ids($user_id, false)) &&
+ !count(phpbb_get_banned_user_ids($user_id, false)) &&
// They must allow users to contact via PM
(($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_')) || $data['user_allow_pm'])
diff --git a/phpBB/includes/functions_download.php b/phpBB/includes/functions_download.php
index e00be1e01a..1f409be58c 100644
--- a/phpBB/includes/functions_download.php
+++ b/phpBB/includes/functions_download.php
@@ -196,7 +196,7 @@ function send_file_to_browser($attachment, $upload_dir, $category)
}
// Now the tricky part... let's dance
- header('Cache-Control: public');
+ header('Cache-Control: private');
// Send out the Headers. Do not set Content-Disposition to inline please, it is a security measure for users using the Internet Explorer.
header('Content-Type: ' . $attachment['mimetype']);
@@ -451,7 +451,7 @@ function set_modified_headers($stamp, $browser)
{
send_status_line(304, 'Not Modified');
// seems that we need those too ... browsers
- header('Cache-Control: public');
+ header('Cache-Control: private');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 31536000) . ' GMT');
return true;
}
@@ -568,7 +568,7 @@ function phpbb_parse_range_request($request_array, $filesize)
$range = explode('-', trim($range_string));
// "-" is invalid, "0-0" however is valid and means the very first byte.
- if (sizeof($range) != 2 || $range[0] === '' && $range[1] === '')
+ if (count($range) != 2 || $range[0] === '' && $range[1] === '')
{
continue;
}
@@ -662,6 +662,8 @@ function phpbb_increment_downloads($db, $ids)
*/
function phpbb_download_handle_forum_auth($db, $auth, $topic_id)
{
+ global $phpbb_container;
+
$sql_array = array(
'SELECT' => 't.topic_visibility, t.forum_id, f.forum_name, f.forum_password, f.parent_id',
'FROM' => array(
@@ -677,7 +679,9 @@ function phpbb_download_handle_forum_auth($db, $auth, $topic_id)
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- if ($row && $row['topic_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id']))
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
+ if ($row && !$phpbb_content_visibility->is_visible('topic', $row['forum_id'], $row))
{
send_status_line(404, 'Not Found');
trigger_error('ERROR_NO_ATTACHMENT');
diff --git a/phpBB/includes/functions_jabber.php b/phpBB/includes/functions_jabber.php
index cfe8c2a90e..cf0865e608 100644
--- a/phpBB/includes/functions_jabber.php
+++ b/phpBB/includes/functions_jabber.php
@@ -207,7 +207,7 @@ class jabber
*/
function login()
{
- if (!sizeof($this->features))
+ if (!count($this->features))
{
$this->add_to_log('Error: No feature information from server available.');
return false;
@@ -293,7 +293,7 @@ class jabber
*/
function get_log()
{
- if ($this->enable_logging && sizeof($this->log_array))
+ if ($this->enable_logging && count($this->log_array))
{
return implode("<br /><br />", $this->log_array);
}
@@ -400,14 +400,14 @@ class jabber
*/
function response($xml)
{
- if (!is_array($xml) || !sizeof($xml))
+ if (!is_array($xml) || !count($xml))
{
return false;
}
// did we get multiple elements? do one after another
// array('message' => ..., 'presence' => ...)
- if (sizeof($xml) > 1)
+ if (count($xml) > 1)
{
foreach ($xml as $key => $value)
{
@@ -419,7 +419,7 @@ class jabber
{
// or even multiple elements of the same type?
// array('message' => array(0 => ..., 1 => ...))
- if (sizeof(reset($xml)) > 1)
+ if (count(reset($xml)) > 1)
{
foreach (reset($xml) as $value)
{
@@ -858,14 +858,14 @@ class jabber
array_push($children, $vals[$i]['value']);
}
- while (++$i < sizeof($vals))
+ while (++$i < count($vals))
{
switch ($vals[$i]['type'])
{
case 'open':
$tagname = (isset($vals[$i]['tag'])) ? $vals[$i]['tag'] : '';
- $size = (isset($children[$tagname])) ? sizeof($children[$tagname]) : 0;
+ $size = (isset($children[$tagname])) ? count($children[$tagname]) : 0;
if (isset($vals[$i]['attributes']))
{
@@ -883,7 +883,7 @@ class jabber
case 'complete':
$tagname = $vals[$i]['tag'];
- $size = (isset($children[$tagname])) ? sizeof($children[$tagname]) : 0;
+ $size = (isset($children[$tagname])) ? count($children[$tagname]) : 0;
$children[$tagname][$size]['#'] = (isset($vals[$i]['value'])) ? $vals[$i]['value'] : array();
if (isset($vals[$i]['attributes']))
diff --git a/phpBB/includes/functions_mcp.php b/phpBB/includes/functions_mcp.php
index dfe3fefbd0..75e24618de 100644
--- a/phpBB/includes/functions_mcp.php
+++ b/phpBB/includes/functions_mcp.php
@@ -22,12 +22,12 @@ if (!defined('IN_PHPBB'))
/**
* Functions used to generate additional URL paramters
*/
-function phpbb_module__url($mode, &$module_row)
+function phpbb_module__url($mode, $module_row)
{
return phpbb_extra_url();
}
-function phpbb_module_notes_url($mode, &$module_row)
+function phpbb_module_notes_url($mode, $module_row)
{
if ($mode == 'front')
{
@@ -38,7 +38,7 @@ function phpbb_module_notes_url($mode, &$module_row)
return ($user_id) ? "&amp;u=$user_id" : '';
}
-function phpbb_module_warn_url($mode, &$module_row)
+function phpbb_module_warn_url($mode, $module_row)
{
if ($mode == 'front' || $mode == 'list')
{
@@ -64,27 +64,27 @@ function phpbb_module_warn_url($mode, &$module_row)
}
}
-function phpbb_module_main_url($mode, &$module_row)
+function phpbb_module_main_url($mode, $module_row)
{
return phpbb_extra_url();
}
-function phpbb_module_logs_url($mode, &$module_row)
+function phpbb_module_logs_url($mode, $module_row)
{
return phpbb_extra_url();
}
-function phpbb_module_ban_url($mode, &$module_row)
+function phpbb_module_ban_url($mode, $module_row)
{
return phpbb_extra_url();
}
-function phpbb_module_queue_url($mode, &$module_row)
+function phpbb_module_queue_url($mode, $module_row)
{
return phpbb_extra_url();
}
-function phpbb_module_reports_url($mode, &$module_row)
+function phpbb_module_reports_url($mode, $module_row)
{
return phpbb_extra_url();
}
@@ -113,7 +113,7 @@ function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = fa
$topics = array();
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
return array();
}
@@ -130,7 +130,7 @@ function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = fa
$cache_topic_ids = array();
}
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$sql_array = array(
'SELECT' => 't.*, f.*',
@@ -197,11 +197,11 @@ function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = fa
*/
function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = false)
{
- global $db, $auth, $config, $user;
+ global $db, $auth, $config, $user, $phpbb_container;
$rowset = array();
- if (!sizeof($post_ids))
+ if (!count($post_ids))
{
return array();
}
@@ -246,6 +246,8 @@ function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = fals
$result = $db->sql_query($sql);
unset($sql_array);
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
while ($row = $db->sql_fetchrow($result))
{
if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
@@ -253,7 +255,7 @@ function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = fals
continue;
}
- if ($row['post_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id']))
+ if (!$phpbb_content_visibility->is_visible('post', $row['forum_id'], $row))
{
// Moderators without the permission to approve post should at least not see them. ;)
continue;
@@ -280,7 +282,7 @@ function phpbb_get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking =
$forum_id = array($forum_id);
}
- if (!sizeof($forum_id))
+ if (!count($forum_id))
{
return array();
}
@@ -329,7 +331,7 @@ function phpbb_get_pm_data($pm_ids)
$rowset = array();
- if (!sizeof($pm_ids))
+ if (!count($pm_ids))
{
return array();
}
@@ -730,7 +732,7 @@ function phpbb_check_ids(&$ids, $table, $sql_id, $acl_list = false, $single_foru
}
$db->sql_freeresult($result);
- if (!sizeof($ids))
+ if (!count($ids))
{
return false;
}
diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php
index ab7f00a65a..7f8238e1bf 100644
--- a/phpBB/includes/functions_messenger.php
+++ b/phpBB/includes/functions_messenger.php
@@ -24,8 +24,9 @@ if (!defined('IN_PHPBB'))
*/
class messenger
{
- var $msg, $extra_headers, $replyto, $from, $subject;
+ var $msg, $replyto, $from, $subject;
var $addresses = array();
+ var $extra_headers = array();
var $mail_priority = MAIL_NORMAL_PRIORITY;
var $use_queue = true;
@@ -36,7 +37,7 @@ class messenger
/**
* Constructor
*/
- function messenger($use_queue = true)
+ function __construct($use_queue = true)
{
global $config;
@@ -84,7 +85,7 @@ class messenger
return;
}
- $pos = isset($this->addresses['to']) ? sizeof($this->addresses['to']) : 0;
+ $pos = isset($this->addresses['to']) ? count($this->addresses['to']) : 0;
$this->addresses['to'][$pos]['email'] = trim($address);
@@ -109,7 +110,7 @@ class messenger
return;
}
- $pos = isset($this->addresses['cc']) ? sizeof($this->addresses['cc']) : 0;
+ $pos = isset($this->addresses['cc']) ? count($this->addresses['cc']) : 0;
$this->addresses['cc'][$pos]['email'] = trim($address);
$this->addresses['cc'][$pos]['name'] = trim($realname);
}
@@ -124,7 +125,7 @@ class messenger
return;
}
- $pos = isset($this->addresses['bcc']) ? sizeof($this->addresses['bcc']) : 0;
+ $pos = isset($this->addresses['bcc']) ? count($this->addresses['bcc']) : 0;
$this->addresses['bcc'][$pos]['email'] = trim($address);
$this->addresses['bcc'][$pos]['name'] = trim($realname);
}
@@ -140,7 +141,7 @@ class messenger
return;
}
- $pos = isset($this->addresses['im']) ? sizeof($this->addresses['im']) : 0;
+ $pos = isset($this->addresses['im']) ? count($this->addresses['im']) : 0;
$this->addresses['im'][$pos]['uid'] = trim($address);
$this->addresses['im'][$pos]['name'] = trim($realname);
}
@@ -180,10 +181,9 @@ class messenger
/**
* Adds X-AntiAbuse headers
*
- * @param array $config Configuration array
- * @param user $user A user object
- *
- * @return null
+ * @param \phpbb\config\config $config Config object
+ * @param \phpbb\user $user User object
+ * @return void
*/
function anti_abuse_headers($config, $user)
{
@@ -325,9 +325,26 @@ class messenger
));
$subject = $this->subject;
- $message = $this->msg;
+ $template = $this->template;
+ /**
+ * Event to modify the template before parsing
+ *
+ * @event core.modify_notification_template
+ * @var int method User notification method NOTIFY_EMAIL|NOTIFY_IM|NOTIFY_BOTH
+ * @var bool break Flag indicating if the function only formats the subject
+ * and the message without sending it
+ * @var string subject The message subject
+ * @var \phpbb\template\template template The (readonly) template object
+ * @since 3.2.4-RC1
+ */
+ $vars = array('method', 'break', 'subject', 'template');
+ extract($phpbb_dispatcher->trigger_event('core.modify_notification_template', compact($vars)));
+
+ // Parse message through template
+ $message = trim($this->template->assign_display('body'));
+
/**
- * Event to modify notification message text before parsing
+ * Event to modify notification message text after parsing
*
* @event core.modify_notification_message
* @var int method User notification method NOTIFY_EMAIL|NOTIFY_IM|NOTIFY_BOTH
@@ -337,19 +354,12 @@ class messenger
* @var string message The message text
* @since 3.1.11-RC1
*/
- $vars = array(
- 'method',
- 'break',
- 'subject',
- 'message',
- );
+ $vars = array('method', 'break', 'subject', 'message');
extract($phpbb_dispatcher->trigger_event('core.modify_notification_message', compact($vars)));
+
$this->subject = $subject;
$this->msg = $message;
- unset($subject, $message);
-
- // Parse message through template
- $this->msg = trim($this->template->assign_display('body'));
+ unset($subject, $message, $template);
// Because we use \n for newlines in the body message we need to fix line encoding errors for those admins who uploaded email template files in the wrong encoding
$this->msg = str_replace("\r\n", "\n", $this->msg);
@@ -368,6 +378,12 @@ class messenger
$this->subject = (($this->subject != '') ? $this->subject : $user->lang['NO_EMAIL_SUBJECT']);
}
+ if (preg_match('#^(List-Unsubscribe:(.*?))$#m', $this->msg, $match))
+ {
+ $this->extra_headers[] = $match[1];
+ $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#');
+ }
+
if ($drop_header)
{
$this->msg = trim(preg_replace('#' . $drop_header . '#s', '', $this->msg));
@@ -416,7 +432,7 @@ class messenger
switch ($type)
{
case 'EMAIL':
- $message = '<strong>EMAIL/' . (($config['smtp_delivery']) ? 'SMTP' : 'PHP/' . $config['email_function_name'] . '()') . '</strong>';
+ $message = '<strong>EMAIL/' . (($config['smtp_delivery']) ? 'SMTP' : 'PHP/mail()') . '</strong>';
break;
default:
@@ -503,7 +519,7 @@ class messenger
$vars = array('headers');
extract($phpbb_dispatcher->trigger_event('core.modify_email_headers', compact($vars)));
- if (sizeof($this->extra_headers))
+ if (count($this->extra_headers))
{
$headers = array_merge($headers, $this->extra_headers);
}
@@ -516,7 +532,7 @@ class messenger
*/
function msg_email()
{
- global $config;
+ global $config, $phpbb_dispatcher;
if (empty($config['email_enable']))
{
@@ -544,6 +560,33 @@ class messenger
$contact_name = htmlspecialchars_decode($config['board_contact_name']);
$board_contact = (($contact_name !== '') ? '"' . mail_encode($contact_name) . '" ' : '') . '<' . $config['board_contact'] . '>';
+ $break = false;
+ $addresses = $this->addresses;
+ $subject = $this->subject;
+ $msg = $this->msg;
+ /**
+ * Event to send message via external transport
+ *
+ * @event core.notification_message_email
+ * @var bool break Flag indicating if the function return after hook
+ * @var array addresses The message recipients
+ * @var string subject The message subject
+ * @var string msg The message text
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'break',
+ 'addresses',
+ 'subject',
+ 'msg',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.notification_message_email', compact($vars)));
+
+ if ($break)
+ {
+ return true;
+ }
+
if (empty($this->replyto))
{
$this->replyto = $board_contact;
@@ -749,7 +792,7 @@ class queue
/**
* constructor
*/
- function queue()
+ function __construct()
{
global $phpEx, $phpbb_root_path, $phpbb_filesystem, $phpbb_container;
@@ -782,7 +825,7 @@ class queue
*/
function process()
{
- global $config, $phpEx, $phpbb_root_path, $user;
+ global $config, $phpEx, $phpbb_root_path, $user, $phpbb_dispatcher;
$lock = new \phpbb\lock\flock($this->cache_file);
$lock->acquire();
@@ -814,7 +857,7 @@ class queue
}
$package_size = $data_ary['package_size'];
- $num_items = (!$package_size || sizeof($data_ary['data']) < $package_size) ? sizeof($data_ary['data']) : $package_size;
+ $num_items = (!$package_size || count($data_ary['data']) < $package_size) ? count($data_ary['data']) : $package_size;
/*
* This code is commented out because it causes problems on some web hosts.
@@ -823,9 +866,9 @@ class queue
* web host and the package size setting is wrong.
// If the amount of emails to be sent is way more than package_size than we need to increase it to prevent backlogs...
- if (sizeof($data_ary['data']) > $package_size * 2.5)
+ if (count($data_ary['data']) > $package_size * 2.5)
{
- $num_items = sizeof($data_ary['data']);
+ $num_items = count($data_ary['data']);
}
*/
@@ -879,23 +922,45 @@ class queue
switch ($object)
{
case 'email':
- $err_msg = '';
- $to = (!$to) ? 'undisclosed-recipients:;' : $to;
-
- if ($config['smtp_delivery'])
- {
- $result = smtpmail($addresses, mail_encode($subject), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $err_msg, $headers);
- }
- else
+ $break = false;
+ /**
+ * Event to send message via external transport
+ *
+ * @event core.notification_message_process
+ * @var bool break Flag indicating if the function return after hook
+ * @var array addresses The message recipients
+ * @var string subject The message subject
+ * @var string msg The message text
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'break',
+ 'addresses',
+ 'subject',
+ 'msg',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.notification_message_process', compact($vars)));
+
+ if (!$break)
{
- $result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg);
- }
+ $err_msg = '';
+ $to = (!$to) ? 'undisclosed-recipients:;' : $to;
- if (!$result)
- {
- $messenger = new messenger();
- $messenger->error('EMAIL', $err_msg);
- continue 2;
+ if ($config['smtp_delivery'])
+ {
+ $result = smtpmail($addresses, mail_encode($subject), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $err_msg, $headers);
+ }
+ else
+ {
+ $result = phpbb_mail($to, $subject, $msg, $headers, PHP_EOL, $err_msg);
+ }
+
+ if (!$result)
+ {
+ $messenger = new messenger();
+ $messenger->error('EMAIL', $err_msg);
+ continue 2;
+ }
}
break;
@@ -914,7 +979,7 @@ class queue
}
// No more data for this object? Unset it
- if (!sizeof($this->queue_data[$object]['data']))
+ if (!count($this->queue_data[$object]['data']))
{
unset($this->queue_data[$object]);
}
@@ -930,7 +995,7 @@ class queue
}
}
- if (!sizeof($this->queue_data))
+ if (!count($this->queue_data))
{
@unlink($this->cache_file);
}
@@ -965,7 +1030,7 @@ class queue
*/
function save()
{
- if (!sizeof($this->data))
+ if (!count($this->data))
{
return;
}
@@ -979,7 +1044,7 @@ class queue
foreach ($this->queue_data as $object => $data_ary)
{
- if (isset($this->data[$object]) && sizeof($this->data[$object]))
+ if (isset($this->data[$object]) && count($this->data[$object]))
{
$this->data[$object]['data'] = array_merge($data_ary['data'], $this->data[$object]['data']);
}
@@ -1067,7 +1132,7 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = false)
$mail_rcpt = $mail_to = $mail_cc = array();
// Build correct addresses for RCPT TO command and the client side display (TO, CC)
- if (isset($addresses['to']) && sizeof($addresses['to']))
+ if (isset($addresses['to']) && count($addresses['to']))
{
foreach ($addresses['to'] as $which_ary)
{
@@ -1076,7 +1141,7 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = false)
}
}
- if (isset($addresses['bcc']) && sizeof($addresses['bcc']))
+ if (isset($addresses['bcc']) && count($addresses['bcc']))
{
foreach ($addresses['bcc'] as $which_ary)
{
@@ -1084,7 +1149,7 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = false)
}
}
- if (isset($addresses['cc']) && sizeof($addresses['cc']))
+ if (isset($addresses['cc']) && count($addresses['cc']))
{
foreach ($addresses['cc'] as $which_ary)
{
@@ -1263,7 +1328,7 @@ class smtp_class
var $backtrace = false;
var $backtrace_log = array();
- function smtp_class()
+ function __construct()
{
// Always create a backtrace for admins to identify SMTP problems
$this->backtrace = true;
@@ -1516,6 +1581,14 @@ class smtp_class
*/
protected function starttls()
{
+ global $config;
+
+ // allow SMTPS (what was used by phpBB 3.0) if hostname is prefixed with tls:// or ssl://
+ if (strpos($config['smtp_host'], 'tls://') === 0 || strpos($config['smtp_host'], 'ssl://') === 0)
+ {
+ return true;
+ }
+
if (!function_exists('stream_socket_enable_crypto'))
{
return false;
@@ -1538,7 +1611,9 @@ class smtp_class
if (socket_set_blocking($this->socket, 1))
{
- $result = stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
+ // https://secure.php.net/manual/en/function.stream-socket-enable-crypto.php#119122
+ $crypto = (phpbb_version_compare(PHP_VERSION, '5.6.7', '<')) ? STREAM_CRYPTO_METHOD_TLS_CLIENT : STREAM_CRYPTO_METHOD_SSLv23_CLIENT;
+ $result = stream_socket_enable_crypto($this->socket, true, $crypto);
socket_set_blocking($this->socket, (int) $stream_meta['blocked']);
}
@@ -1802,11 +1877,11 @@ function mail_encode($str, $eol = "\r\n")
$array = utf8_str_split($str);
$str = '';
- while (sizeof($array))
+ while (count($array))
{
$text = '';
- while (sizeof($array) && intval((strlen($text . $array[0]) + 2) / 3) << 2 <= $split_length)
+ while (count($array) && intval((strlen($text . $array[0]) + 2) / 3) << 2 <= $split_length)
{
$text .= array_shift($array);
}
@@ -1839,7 +1914,8 @@ function phpbb_mail($to, $subject, $msg, $headers, $eol, &$err_msg)
// On some PHP Versions mail() *may* fail if there are newlines within the subject.
// Newlines are used as a delimiter for lines in mail_encode() according to RFC 2045 section 6.8.
// Because PHP can't decide what is wanted we revert back to the non-RFC-compliant way of separating by one space (Use '' as parameter to mail_encode() results in SPACE used)
- $result = $config['email_function_name']($to, mail_encode($subject, ''), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $headers);
+ $additional_parameters = $config['email_force_sender'] ? '-f' . $config['board_email'] : '';
+ $result = mail($to, mail_encode($subject, ''), wordwrap(utf8_wordwrap($msg), 997, "\n", true), $headers, $additional_parameters);
$collector->uninstall();
$err_msg = $collector->format_errors();
diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php
index 7a1991d69a..88dafc4300 100644
--- a/phpBB/includes/functions_module.php
+++ b/phpBB/includes/functions_module.php
@@ -40,7 +40,7 @@ class p_master
* Constuctor
* Set module include path
*/
- function p_master($include_path = false)
+ function __construct($include_path = false)
{
global $phpbb_root_path;
@@ -243,7 +243,7 @@ class p_master
}
}
- $depth = sizeof($this->module_cache['parents'][$row['module_id']]);
+ $depth = count($this->module_cache['parents'][$row['module_id']]);
// We need to prefix the functions to not create a naming conflict
@@ -279,7 +279,7 @@ class p_master
'parent' => (int) $row['parent_id'],
'cat' => ($row['right_id'] > $row['left_id'] + 1) ? true : false,
- 'is_duplicate' => ($row['module_basename'] && sizeof($names[$row['module_basename'] . '_' . $row['module_mode']]) > 1) ? true : false,
+ 'is_duplicate' => ($row['module_basename'] && count($names[$row['module_basename'] . '_' . $row['module_mode']]) > 1) ? true : false,
'name' => (string) $row['module_basename'],
'mode' => (string) $row['module_mode'],
@@ -431,7 +431,7 @@ class p_master
extract($phpbb_dispatcher->trigger_event('core.module_auth', compact($vars)));
$tokens = $match[0];
- for ($i = 0, $size = sizeof($tokens); $i < $size; $i++)
+ for ($i = 0, $size = count($tokens); $i < $size; $i++)
{
$token = &$tokens[$i];
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index d9f395efb3..2cce77e092 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -114,7 +114,7 @@ function generate_smilies($mode, $forum_id)
}
$db->sql_freeresult($result);
- if (sizeof($smilies))
+ if (count($smilies))
{
$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_path_helper->get_web_root_path();
@@ -200,13 +200,15 @@ function update_post_information($type, $ids, $return_update_sql = false)
$topic_condition = '';
}
- if (sizeof($ids) == 1)
+ if (count($ids) == 1)
{
- $sql = 'SELECT MAX(p.post_id) as last_post_id
+ $sql = 'SELECT p.post_id as last_post_id
FROM ' . POSTS_TABLE . " p $topic_join
WHERE " . $db->sql_in_set('p.' . $type . '_id', $ids) . "
$topic_condition
- AND p.post_visibility = " . ITEM_APPROVED;
+ AND p.post_visibility = " . ITEM_APPROVED . "
+ ORDER BY p.post_id DESC";
+ $result = $db->sql_query_limit($sql, 1);
}
else
{
@@ -216,13 +218,13 @@ function update_post_information($type, $ids, $return_update_sql = false)
$topic_condition
AND p.post_visibility = " . ITEM_APPROVED . "
GROUP BY p.{$type}_id";
+ $result = $db->sql_query($sql);
}
- $result = $db->sql_query($sql);
$last_post_ids = array();
while ($row = $db->sql_fetchrow($result))
{
- if (sizeof($ids) == 1)
+ if (count($ids) == 1)
{
$row[$type . '_id'] = $ids[0];
}
@@ -256,7 +258,7 @@ function update_post_information($type, $ids, $return_update_sql = false)
}
}
- if (sizeof($last_post_ids))
+ if (count($last_post_ids))
{
$sql = 'SELECT p.' . $type . '_id, p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
@@ -277,7 +279,7 @@ function update_post_information($type, $ids, $return_update_sql = false)
}
unset($empty_forums, $ids, $last_post_ids);
- if ($return_update_sql || !sizeof($update_sql))
+ if ($return_update_sql || !count($update_sql))
{
return $update_sql;
}
@@ -310,7 +312,7 @@ function posting_gen_topic_icons($mode, $icon_id)
$template->assign_var('S_NO_ICON_CHECKED', ' checked="checked"');
}
- if (sizeof($icons))
+ if (count($icons))
{
$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path;
@@ -519,7 +521,7 @@ function get_supported_image_types($type = false)
*/
function create_thumbnail($source, $destination, $mimetype)
{
- global $config, $phpbb_filesystem;
+ global $config, $phpbb_filesystem, $phpbb_dispatcher;
$min_filesize = (int) $config['img_min_thumb_filesize'];
$img_filesize = (file_exists($source)) ? @filesize($source) : false;
@@ -551,25 +553,31 @@ function create_thumbnail($source, $destination, $mimetype)
return false;
}
- $used_imagick = false;
-
- // Only use ImageMagick if defined and the passthru function not disabled
- if ($config['img_imagick'] && function_exists('passthru'))
- {
- if (substr($config['img_imagick'], -1) !== '/')
- {
- $config['img_imagick'] .= '/';
- }
-
- @passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -geometry ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" "' . str_replace('\\', '/', $destination) . '"');
+ $thumbnail_created = false;
- if (file_exists($destination))
- {
- $used_imagick = true;
- }
- }
+ /**
+ * Create thumbnail event to replace GD thumbnail creation with for example ImageMagick
+ *
+ * @event core.thumbnail_create_before
+ * @var string source Image source path
+ * @var string destination Thumbnail destination path
+ * @var string mimetype Image mime type
+ * @var float new_width Calculated thumbnail width
+ * @var float new_height Calculated thumbnail height
+ * @var bool thumbnail_created Set to true to skip default GD thumbnail creation
+ * @since 3.2.4
+ */
+ $vars = array(
+ 'source',
+ 'destination',
+ 'mimetype',
+ 'new_width',
+ 'new_height',
+ 'thumbnail_created',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.thumbnail_create_before', compact($vars)));
- if (!$used_imagick)
+ if (!$thumbnail_created)
{
$type = get_supported_image_types($type);
@@ -690,7 +698,7 @@ function posting_gen_inline_attachments(&$attachment_data)
{
global $template;
- if (sizeof($attachment_data))
+ if (count($attachment_data))
{
$s_inline_attachment_options = '';
@@ -717,20 +725,21 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a
// Some default template variables
$template->assign_vars(array(
'S_SHOW_ATTACH_BOX' => $show_attach_box,
- 'S_HAS_ATTACHMENTS' => sizeof($attachment_data),
+ 'S_HAS_ATTACHMENTS' => count($attachment_data),
'FILESIZE' => $config['max_filesize'],
'FILE_COMMENT' => (isset($filename_data['filecomment'])) ? $filename_data['filecomment'] : '',
));
- if (sizeof($attachment_data))
+ if (count($attachment_data))
{
// We display the posted attachments within the desired order.
($config['display_order']) ? krsort($attachment_data) : ksort($attachment_data);
+ $attachrow_template_vars = [];
+
foreach ($attachment_data as $count => $attach_row)
{
$hidden = '';
- $attachrow_template_vars = array();
$attach_row['real_filename'] = utf8_basename($attach_row['real_filename']);
foreach ($attach_row as $key => $value)
@@ -768,7 +777,7 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a
$template->assign_block_vars_array('attach_row', $attachrow_template_vars);
}
- return sizeof($attachment_data);
+ return count($attachment_data);
}
//
@@ -816,13 +825,13 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms
}
$db->sql_freeresult($result);
- if (!sizeof($draft_rows))
+ if (!count($draft_rows))
{
return;
}
$topic_rows = array();
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$sql = 'SELECT topic_id, forum_id, topic_title, topic_poster
FROM ' . TOPICS_TABLE . '
@@ -935,7 +944,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
$db->sql_freeresult($result);
- if (!sizeof($post_list))
+ if (!count($post_list))
{
return false;
}
@@ -969,6 +978,30 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
AND u.user_id = p.poster_id',
);
+ /**
+ * Event to modify the SQL query for topic reviews
+ *
+ * @event core.topic_review_modify_sql_ary
+ * @var int topic_id The topic ID that is being reviewed
+ * @var int forum_id The topic's forum ID
+ * @var string mode The topic review mode
+ * @var int cur_post_id Post offset ID
+ * @var bool show_quote_button Flag indicating if the quote button should be displayed
+ * @var array post_list Array with the post IDs
+ * @var array sql_ary Array with the SQL query
+ * @since 3.2.8-RC1
+ */
+ $vars = array(
+ 'topic_id',
+ 'forum_id',
+ 'mode',
+ 'cur_post_id',
+ 'show_quote_button',
+ 'post_list',
+ 'sql_ary',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.topic_review_modify_sql_ary', compact($vars)));
+
$sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query($sql);
@@ -1030,7 +1063,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
);
extract($phpbb_dispatcher->trigger_event('core.topic_review_modify_post_list', compact($vars)));
- for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
+ for ($i = 0, $end = count($post_list); $i < $end; ++$i)
{
// A non-existing rowset only happens if there was no user present for the entered poster_id
// This could be a broken posts table.
@@ -1257,7 +1290,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
foreach ($shadow_forum_ids as $updated_forum => $topic_count)
{
- // counting is fun! we only have to do sizeof($forum_ids) number of queries,
+ // counting is fun! we only have to do count($forum_ids) number of queries,
// even if the topic is moved back to where its shadow lives (we count how many times it is in a forum)
$sql = 'UPDATE ' . FORUMS_TABLE . '
SET forum_topics_approved = forum_topics_approved - ' . $topic_count . '
@@ -1275,9 +1308,10 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
delete_topics('topic_id', array($topic_id), false);
$phpbb_content_visibility->remove_topic_from_statistic($data, $sql_data);
+ $config->increment('num_posts', -1, false);
$update_sql = update_post_information('forum', $forum_id, true);
- if (sizeof($update_sql))
+ if (count($update_sql))
{
$sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : '';
$sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]);
@@ -1326,7 +1360,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $
{
// Update last post information when hard deleting. Soft delete already did that by itself.
$update_sql = update_post_information('forum', $forum_id, true);
- if (sizeof($update_sql))
+ if (count($update_sql))
{
$sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . implode(', ', $update_sql[$forum_id]);
}
@@ -1968,7 +2002,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
$sql_insert_ary = array();
- for ($i = 0, $size = sizeof($poll_ary['poll_options']); $i < $size; $i++)
+ for ($i = 0, $size = count($poll_ary['poll_options']); $i < $size; $i++)
{
if (strlen(trim($poll_ary['poll_options'][$i])))
{
@@ -1976,7 +2010,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
{
// If we add options we need to put them to the end to be able to preserve votes...
$sql_insert_ary[] = array(
- 'poll_option_id' => (int) sizeof($cur_poll_options) + 1 + sizeof($sql_insert_ary),
+ 'poll_option_id' => (int) count($cur_poll_options) + 1 + count($sql_insert_ary),
'topic_id' => (int) $data_ary['topic_id'],
'poll_option_text' => (string) $poll_ary['poll_options'][$i]
);
@@ -1994,16 +2028,16 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
$db->sql_multi_insert(POLL_OPTIONS_TABLE, $sql_insert_ary);
- if (sizeof($poll_ary['poll_options']) < sizeof($cur_poll_options))
+ if (count($poll_ary['poll_options']) < count($cur_poll_options))
{
$sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . '
- WHERE poll_option_id > ' . sizeof($poll_ary['poll_options']) . '
+ WHERE poll_option_id > ' . count($poll_ary['poll_options']) . '
AND topic_id = ' . $data_ary['topic_id'];
$db->sql_query($sql);
}
// If edited, we would need to reset votes (since options can be re-ordered above, you can't be sure if the change is for changing the text or adding an option
- if ($mode == 'edit' && sizeof($poll_ary['poll_options']) != sizeof($cur_poll_options))
+ if ($mode == 'edit' && count($poll_ary['poll_options']) != count($cur_poll_options))
{
$db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data_ary['topic_id']);
$db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data_ary['topic_id']);
@@ -2021,7 +2055,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
$orphan_rows[(int) $attach_row['attach_id']] = array();
}
- if (sizeof($orphan_rows))
+ if (count($orphan_rows))
{
$sql = 'SELECT attach_id, filesize, physical_filename
FROM ' . ATTACHMENTS_TABLE . '
@@ -2045,6 +2079,11 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
continue;
}
+ if (preg_match('/[\x{10000}-\x{10FFFF}]/u', $attach_row['attach_comment']))
+ {
+ trigger_error('ATTACH_COMMENT_NO_EMOJIS');
+ }
+
if (!$attach_row['is_orphan'])
{
// update entry in db if attachment already stored in db and filespace
@@ -2281,6 +2320,19 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
'post_subject' => $subject,
));
+ /**
+ * This event allows you to modify the notification data upon submission
+ *
+ * @event core.modify_submit_notification_data
+ * @var array notification_data The notification data to be inserted in to the database
+ * @var array data_ary The data array with a lot of the post submission data
+ * @var string mode The posting mode
+ * @var int poster_id The poster id
+ * @since 3.2.4-RC1
+ */
+ $vars = array('notification_data', 'data_ary', 'mode', 'poster_id');
+ extract($phpbb_dispatcher->trigger_event('core.modify_submit_notification_data', compact($vars)));
+
/* @var $phpbb_notifications \phpbb\notification\manager */
$phpbb_notifications = $phpbb_container->get('notification_manager');
@@ -2308,8 +2360,14 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data
case 'edit_first_post':
case 'edit':
case 'edit_last_post':
+ if ($user->data['user_id'] == $poster_id)
+ {
+ $phpbb_notifications->update_notifications(array(
+ 'notification.type.quote',
+ ), $notification_data);
+ }
+
$phpbb_notifications->update_notifications(array(
- 'notification.type.quote',
'notification.type.bookmark',
'notification.type.topic',
'notification.type.post',
diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php
index ff962075a8..f07512d623 100644
--- a/phpBB/includes/functions_privmsgs.php
+++ b/phpBB/includes/functions_privmsgs.php
@@ -466,7 +466,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
$user_rules = $db->sql_fetchrowset($result);
$db->sql_freeresult($result);
- if (sizeof($user_rules))
+ if (count($user_rules))
{
$sql = 'SELECT zebra_id, friend, foe
FROM ' . ZEBRA_TABLE . "
@@ -490,7 +490,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
'bcc' => explode(':', $row['bcc_address']),
'friend' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['friend'] : 0,
'foe' => (isset($zebra[$row['author_id']])) ? $zebra[$row['author_id']]['foe'] : 0,
- 'user_in_group' => array($user->data['group_id']),
+ 'user_in_group' => $user->data['group_id'],
'author_in_group' => array())
);
@@ -499,7 +499,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
$db->sql_freeresult($result);
// Retrieve user memberships
- if (sizeof($user_ids))
+ if (count($user_ids))
{
$sql = 'SELECT *
FROM ' . USER_GROUP_TABLE . '
@@ -600,14 +600,14 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
// only gone through if new messages arrive.
// Delete messages
- if (sizeof($delete_ids))
+ if (count($delete_ids))
{
- $num_removed += sizeof($delete_ids);
+ $num_removed += count($delete_ids);
delete_pm($user_id, $delete_ids, PRIVMSGS_NO_BOX);
}
// Set messages to Unread
- if (sizeof($unread_ids))
+ if (count($unread_ids))
{
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . '
SET pm_unread = 0
@@ -618,7 +618,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
}
// mark messages as important
- if (sizeof($important_ids))
+ if (count($important_ids))
{
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . '
SET pm_marked = 1 - pm_marked
@@ -631,7 +631,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
// Move into folder
$folder = array();
- if (sizeof($move_into_folder))
+ if (count($move_into_folder))
{
// Determine Full Folder Action - we need the move to folder id later eventually
$full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder'];
@@ -676,12 +676,12 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
// Check Message Limit - we calculate with the complete array, most of the time it is one message
// But we are making sure that the other way around works too (more messages in queue than allowed to be stored)
- if ($user->data['message_limit'] && $folder[$folder_id] && ($folder[$folder_id] + sizeof($msg_ary)) > $user->data['message_limit'])
+ if ($user->data['message_limit'] && $folder[$folder_id] && ($folder[$folder_id] + count($msg_ary)) > $user->data['message_limit'])
{
$full_folder_action = ($user->data['user_full_folder'] == FULL_FOLDER_NONE) ? ($config['full_folder_action'] - (FULL_FOLDER_NONE*(-1))) : $user->data['user_full_folder'];
// If destination folder itself is full...
- if ($full_folder_action >= 0 && ($folder[$full_folder_action] + sizeof($msg_ary)) > $user->data['message_limit'])
+ if ($full_folder_action >= 0 && ($folder[$full_folder_action] + count($msg_ary)) > $user->data['message_limit'])
{
$full_folder_action = $config['full_folder_action'] - (FULL_FOLDER_NONE*(-1));
}
@@ -699,7 +699,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
WHERE user_id = $user_id
AND folder_id = $dest_folder
ORDER BY msg_id ASC";
- $result = $db->sql_query_limit($sql, (($folder[$dest_folder] + sizeof($msg_ary)) - $user->data['message_limit']));
+ $result = $db->sql_query_limit($sql, (($folder[$dest_folder] + count($msg_ary)) - $user->data['message_limit']));
$delete_ids = array();
while ($row = $db->sql_fetchrow($result))
@@ -708,7 +708,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
}
$db->sql_freeresult($result);
- $num_removed += sizeof($delete_ids);
+ $num_removed += count($delete_ids);
delete_pm($user_id, $delete_ids, $dest_folder);
}
}
@@ -744,7 +744,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
}
}
- if (sizeof($action_ary))
+ if (count($action_ary))
{
// Move from OUTBOX to SENTBOX
// We are not checking any full folder status here... SENTBOX is a special treatment (old messages get deleted)
@@ -785,7 +785,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
$move_msg_ids = array($move_msg_ids);
}
- if (sizeof($move_msg_ids) && !in_array($dest_folder, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX)) &&
+ if (count($move_msg_ids) && !in_array($dest_folder, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX, PRIVMSGS_SENTBOX)) &&
!in_array($cur_folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)) && $cur_folder_id != $dest_folder)
{
// We have to check the destination folder ;)
@@ -805,7 +805,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
trigger_error('NOT_AUTHORISED');
}
- if ($message_limit && $row['pm_count'] + sizeof($move_msg_ids) > $message_limit)
+ if ($message_limit && $row['pm_count'] + count($move_msg_ids) > $message_limit)
{
$message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $row['folder_name']) . '<br /><br />';
$message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $row['folder_id']) . '">', '</a>', $row['folder_name']);
@@ -822,7 +822,7 @@ function move_pm($user_id, $message_limit, $move_msg_ids, $dest_folder, $cur_fol
$num_messages = (int) $db->sql_fetchfield('num_messages');
$db->sql_freeresult($result);
- if ($message_limit && $num_messages + sizeof($move_msg_ids) > $message_limit)
+ if ($message_limit && $num_messages + count($move_msg_ids) > $message_limit)
{
$message = sprintf($user->lang['NOT_ENOUGH_SPACE_FOLDER'], $user->lang['PM_INBOX']) . '<br /><br />';
$message .= sprintf($user->lang['CLICK_RETURN_FOLDER'], '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=inbox') . '">', '</a>', $user->lang['PM_INBOX']);
@@ -949,7 +949,7 @@ function handle_mark_actions($user_id, $mark_action)
$msg_ids = $request->variable('marked_msg_id', array(0));
$cur_folder_id = $request->variable('cur_folder_id', PRIVMSGS_NO_BOX);
- if (!sizeof($msg_ids))
+ if (!count($msg_ids))
{
return false;
}
@@ -981,7 +981,7 @@ function handle_mark_actions($user_id, $mark_action)
{
delete_pm($user_id, $msg_ids, $cur_folder_id);
- $success_msg = (sizeof($msg_ids) == 1) ? 'MESSAGE_DELETED' : 'MESSAGES_DELETED';
+ $success_msg = (count($msg_ids) == 1) ? 'MESSAGE_DELETED' : 'MESSAGES_DELETED';
$redirect = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $cur_folder_id);
meta_refresh(3, $redirect);
@@ -1032,7 +1032,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$msg_ids = array($msg_ids);
}
- if (!sizeof($msg_ids))
+ if (!count($msg_ids))
{
return false;
}
@@ -1069,7 +1069,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$db->sql_freeresult($result);
unset($msg_ids);
- if (!sizeof($delete_rows))
+ if (!count($delete_rows))
{
return false;
}
@@ -1156,7 +1156,7 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$delete_ids = array_keys($delete_rows);
- if (sizeof($delete_ids))
+ if (count($delete_ids))
{
// Check if there are any attachments we need to remove
/** @var \phpbb\attachment\manager $attachment_manager */
@@ -1289,7 +1289,7 @@ function phpbb_delete_users_pms($user_ids)
$num_pms = (int) $row['num_undelivered_privmsgs'];
$undelivered_user[$num_pms][] = (int) $row['user_id'];
- if (sizeof($undelivered_user[$num_pms]) > 50)
+ if (count($undelivered_user[$num_pms]) > 50)
{
// If there are too many users affected the query might get
// too long, so we update the value for the first bunch here.
@@ -1416,7 +1416,7 @@ function rebuild_header($check_ary)
$_types = array('u', 'g');
foreach ($_types as $type)
{
- if (sizeof(${$type}))
+ if (count(${$type}))
{
foreach (${$type} as $id)
{
@@ -1461,7 +1461,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
}
$address = array();
- if (sizeof($u))
+ if (count($u))
{
$sql = 'SELECT user_id, username, user_colour
FROM ' . USERS_TABLE . '
@@ -1485,7 +1485,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
$db->sql_freeresult($result);
}
- if (sizeof($g))
+ if (count($g))
{
if ($plaintext)
{
@@ -1532,7 +1532,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
}
}
- if (sizeof($address) && !$plaintext)
+ if (count($address) && !$plaintext)
{
$template->assign_var('S_' . strtoupper($check_type) . '_RECIPIENT', true);
@@ -1651,7 +1651,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
$_types = array('u', 'g');
foreach ($_types as $ug_type)
{
- if (isset($data_ary['address_list'][$ug_type]) && sizeof($data_ary['address_list'][$ug_type]))
+ if (isset($data_ary['address_list'][$ug_type]) && count($data_ary['address_list'][$ug_type]))
{
foreach ($data_ary['address_list'][$ug_type] as $id => $field)
{
@@ -1673,7 +1673,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
}
}
- if (isset($data_ary['address_list']['g']) && sizeof($data_ary['address_list']['g']))
+ if (isset($data_ary['address_list']['g']) && count($data_ary['address_list']['g']))
{
// We need to check the PM status of group members (do they want to receive PM's?)
// Only check if not a moderator or admin, since they are allowed to override this user setting
@@ -1696,7 +1696,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
$db->sql_freeresult($result);
}
- if (!sizeof($recipients))
+ if (!count($recipients))
{
trigger_error('NO_RECIPIENT');
}
@@ -1764,7 +1764,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
break;
}
- if (sizeof($sql_data))
+ if (count($sql_data))
{
if ($mode == 'post' || $mode == 'reply' || $mode == 'quote' || $mode == 'quotepost' || $mode == 'forward')
{
@@ -1844,7 +1844,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
$orphan_rows[(int) $attach_row['attach_id']] = array();
}
- if (sizeof($orphan_rows))
+ if (count($orphan_rows))
{
$sql = 'SELECT attach_id, filesize, physical_filename
FROM ' . ATTACHMENTS_TABLE . '
@@ -1966,7 +1966,7 @@ function submit_pm($mode, $subject, &$data_ary, $put_in_outbox = true)
*/
function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode = false)
{
- global $db, $user, $template, $phpbb_root_path, $phpEx, $auth;
+ global $db, $user, $template, $phpbb_root_path, $phpEx, $auth, $phpbb_dispatcher;
// Select all receipts and the author from the pm we currently view, to only display their pm-history
$sql = 'SELECT author_id, user_id
@@ -1985,9 +1985,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
$recipients = array_unique($recipients);
// Get History Messages (could be newer)
- $sql = 'SELECT t.*, p.*, u.*
- FROM ' . PRIVMSGS_TABLE . ' p, ' . PRIVMSGS_TO_TABLE . ' t, ' . USERS_TABLE . ' u
- WHERE t.msg_id = p.msg_id
+ $sql_where = 't.msg_id = p.msg_id
AND p.author_id = u.user_id
AND t.folder_id NOT IN (' . PRIVMSGS_NO_BOX . ', ' . PRIVMSGS_HOLD_BOX . ')
AND ' . $db->sql_in_set('t.author_id', $recipients, false, true) . "
@@ -1998,13 +1996,37 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
if (!$message_row['root_level'])
{
- $sql .= " AND (p.root_level = $msg_id OR (p.root_level = 0 AND p.msg_id = $msg_id))";
+ $sql_where .= " AND (p.root_level = $msg_id OR (p.root_level = 0 AND p.msg_id = $msg_id))";
}
else
{
- $sql .= " AND (p.root_level = " . $message_row['root_level'] . ' OR p.msg_id = ' . $message_row['root_level'] . ')';
+ $sql_where .= " AND (p.root_level = " . $message_row['root_level'] . ' OR p.msg_id = ' . $message_row['root_level'] . ')';
}
- $sql .= ' ORDER BY p.message_time DESC';
+
+ $sql_ary = array(
+ 'SELECT' => 't.*, p.*, u.*',
+ 'FROM' => array(
+ PRIVMSGS_TABLE => 'p',
+ PRIVMSGS_TO_TABLE => 't',
+ USERS_TABLE => 'u'
+ ),
+ 'LEFT_JOIN' => array(),
+ 'WHERE' => $sql_where,
+ 'ORDER_BY' => 'p.message_time DESC',
+ );
+
+ /**
+ * Event to modify the SQL query before the message history in private message is queried
+ *
+ * @event core.message_history_modify_sql_ary
+ * @var array sql_ary The SQL array to get the data of the message history in private message
+ * @since 3.2.8-RC1
+ */
+ $vars = array('sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.message_history_modify_sql_ary', compact($vars)));
+
+ $sql = $db->sql_build_query('SELECT', $sql_ary);
+ unset($sql_ary);
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
@@ -2038,7 +2060,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
while ($row = $db->sql_fetchrow($result));
$db->sql_freeresult($result);
- if (sizeof($rowset) == 1 && !$in_post_mode)
+ if (count($rowset) == 1 && !$in_post_mode)
{
return false;
}
@@ -2051,7 +2073,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
// Re-order rowset to be able to get the next/prev message rows...
$rowset = array_values($rowset);
- for ($i = 0, $size = sizeof($rowset); $i < $size; $i++)
+ for ($i = 0, $size = count($rowset); $i < $size; $i++)
{
$row = &$rowset[$i];
$id = (int) $row['msg_id'];
@@ -2087,7 +2109,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
$previous_history_pm = $prev_id;
}
- $template->assign_block_vars('history_row', array(
+ $template_vars = array(
'MESSAGE_AUTHOR_QUOTE' => (($decoded_message) ? addslashes(get_username_string('username', $author_id, $row['username'], $row['user_colour'], $row['username'])) : ''),
'MESSAGE_AUTHOR_FULL' => get_username_string('full', $author_id, $row['username'], $row['user_colour'], $row['username']),
'MESSAGE_AUTHOR_COLOUR' => get_username_string('colour', $author_id, $row['username'], $row['user_colour'], $row['username']),
@@ -2109,8 +2131,25 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
'USER_ID' => $row['user_id'],
'U_VIEW_MESSAGE' => "$url&amp;f=$folder_id&amp;p=" . $row['msg_id'],
'U_QUOTE' => (!$in_post_mode && $auth->acl_get('u_sendpm') && $author_id != ANONYMOUS) ? "$url&amp;mode=compose&amp;action=quote&amp;f=" . $folder_id . "&amp;p=" . $row['msg_id'] : '',
- 'U_POST_REPLY_PM' => ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&amp;mode=compose&amp;action=reply&amp;f=$folder_id&amp;p=" . $row['msg_id'] : '')
+ 'U_POST_REPLY_PM' => ($author_id != $user->data['user_id'] && $author_id != ANONYMOUS && $auth->acl_get('u_sendpm')) ? "$url&amp;mode=compose&amp;action=reply&amp;f=$folder_id&amp;p=" . $row['msg_id'] : ''
+ );
+
+ /**
+ * Modify the template vars for displaying the message history in private message
+ *
+ * @event core.message_history_modify_template_vars
+ * @var array template_vars Array containing the query
+ * @var array row Array containing the action user row
+ * @since 3.2.8-RC1
+ */
+ $vars = array(
+ 'template_vars',
+ 'row',
);
+ extract($phpbb_dispatcher->trigger_event('core.message_history_modify_template_vars', compact($vars)));
+
+ $template->assign_block_vars('history_row', $template_vars);
+
unset($rowset[$i]);
$prev_id = $id;
}
@@ -2197,7 +2236,7 @@ function get_recipient_strings($pm_by_id)
foreach ($_types as $ug_type)
{
- if (isset($address[$message_id][$ug_type]) && sizeof($address[$message_id][$ug_type]))
+ if (isset($address[$message_id][$ug_type]) && count($address[$message_id][$ug_type]))
{
foreach ($address[$message_id][$ug_type] as $ug_id => $in_to)
{
diff --git a/phpBB/includes/functions_transfer.php b/phpBB/includes/functions_transfer.php
index 0fc8a7eea5..7427b89917 100644
--- a/phpBB/includes/functions_transfer.php
+++ b/phpBB/includes/functions_transfer.php
@@ -38,7 +38,7 @@ class transfer
/**
* Constructor - init some basic values
*/
- function transfer()
+ function __construct()
{
global $phpbb_root_path;
@@ -112,7 +112,7 @@ class transfer
$dir = explode('/', $dir);
$dirs = '';
- for ($i = 0, $total = sizeof($dir); $i < $total; $i++)
+ for ($i = 0, $total = count($dir); $i < $total; $i++)
{
$result = true;
@@ -264,7 +264,7 @@ class ftp extends transfer
/**
* Standard parameters for FTP session
*/
- function ftp($host, $username, $password, $root_path, $port = 21, $timeout = 10)
+ function __construct($host, $username, $password, $root_path, $port = 21, $timeout = 10)
{
$this->host = $host;
$this->port = $port;
@@ -512,7 +512,7 @@ class ftp_fsock extends transfer
/**
* Standard parameters for FTP session
*/
- function ftp_fsock($host, $username, $password, $root_path, $port = 21, $timeout = 10)
+ function __construct($host, $username, $password, $root_path, $port = 21, $timeout = 10)
{
$this->host = $host;
$this->port = $port;
@@ -529,7 +529,7 @@ class ftp_fsock extends transfer
}
// Init some needed values
- $this->transfer();
+ parent::__construct();
return;
}
diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php
index c746bd0e4c..3bf4aa16b7 100644
--- a/phpBB/includes/functions_user.php
+++ b/phpBB/includes/functions_user.php
@@ -26,8 +26,10 @@ if (!defined('IN_PHPBB'))
* @param array &$user_id_ary The user ids to check or empty if usernames used
* @param array &$username_ary The usernames to check or empty if user ids used
* @param mixed $user_type Array of user types to check, false if not restricting by user type
+* @param boolean $update_references If false, the supplied array is unset and appears unchanged from where it was called
+* @return boolean|string Returns false on success, error string on failure
*/
-function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false)
+function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false, $update_references = false)
{
global $db;
@@ -50,7 +52,13 @@ function user_get_id_name(&$user_id_ary, &$username_ary, $user_type = false)
}
$sql_in = ($which_ary == 'user_id_ary') ? array_map('intval', ${$which_ary}) : array_map('utf8_clean_string', ${$which_ary});
- unset(${$which_ary});
+
+ // By unsetting the array here, the values passed in at the point user_get_id_name() was called will be retained.
+ // Otherwise, if we don't unset (as the array was passed by reference) the original array will be updated below.
+ if ($update_references === false)
+ {
+ unset(${$which_ary});
+ }
$user_id_ary = $username_ary = array();
@@ -170,7 +178,7 @@ function user_update_name($old_name, $new_name)
* Adds an user
*
* @param mixed $user_row An array containing the following keys (and the appropriate values): username, group_id (the group to place the user in), user_email and the user_type(usually 0). Additional entries not overridden by defaults will be forwarded.
-* @param string $cp_data custom profile fields, see custom_profile::build_insert_sql_array
+* @param array $cp_data custom profile fields, see custom_profile::build_insert_sql_array
* @param array $notifications_data The notifications settings for the new user
* @return the new user's ID.
*/
@@ -260,7 +268,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
$remaining_vars = array_diff(array_keys($user_row), array_keys($sql_ary));
// Now fill our sql array with the remaining vars
- if (sizeof($remaining_vars))
+ if (count($remaining_vars))
{
foreach ($remaining_vars as $key)
{
@@ -272,8 +280,8 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
* Use this event to modify the values to be inserted when a user is added
*
* @event core.user_add_modify_data
- * @var array user_row Array of user details submited to user_add
- * @var array cp_data Array of Custom profile fields submited to user_add
+ * @var array user_row Array of user details submitted to user_add
+ * @var array cp_data Array of Custom profile fields submitted to user_add
* @var array sql_ary Array of data to be inserted when a user is added
* @var array notifications_data Array of notification data to be inserted when a user is added
* @since 3.1.0-a1
@@ -289,7 +297,7 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
$user_id = $db->sql_nextid();
// Insert Custom Profile Fields
- if ($cp_data !== false && sizeof($cp_data))
+ if ($cp_data !== false && count($cp_data))
{
$cp_data['user_id'] = (int) $user_id;
@@ -376,6 +384,19 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
);
}
+ /**
+ * Modify the notifications data to be inserted in the database when a user is added
+ *
+ * @event core.user_add_modify_notifications_data
+ * @var array user_row Array of user details submitted to user_add
+ * @var array cp_data Array of Custom profile fields submitted to user_add
+ * @var array sql_ary Array of data to be inserted when a user is added
+ * @var array notifications_data Array of notification data to be inserted when a user is added
+ * @since 3.2.2-RC1
+ */
+ $vars = array('user_row', 'cp_data', 'sql_ary', 'notifications_data');
+ extract($phpbb_dispatcher->trigger_event('core.user_add_modify_notifications_data', compact($vars)));
+
// Subscribe user to notifications if necessary
if (!empty($notifications_data))
{
@@ -388,12 +409,12 @@ function user_add($user_row, $cp_data = false, $notifications_data = null)
}
/**
- * Event that returns user id, user detals and user CPF of newly registared user
+ * Event that returns user id, user details and user CPF of newly registered user
*
* @event core.user_add_after
- * @var int user_id User id of newly registared user
- * @var array user_row Array of user details submited to user_add
- * @var array cp_data Array of Custom profile fields submited to user_add
+ * @var int user_id User id of newly registered user
+ * @var array user_row Array of user details submitted to user_add
+ * @var array cp_data Array of Custom profile fields submitted to user_add
* @since 3.1.0-b5
*/
$vars = array('user_id', 'user_row', 'cp_data');
@@ -448,9 +469,11 @@ function user_delete($mode, $user_ids, $retain_username = true)
* @var array user_ids IDs of the deleted user
* @var mixed retain_username True if username should be retained
* or false if not
+ * @var array user_rows Array containing data of the deleted users
* @since 3.1.0-a1
+ * @changed 3.2.4-RC1 Added user_rows
*/
- $vars = array('mode', 'user_ids', 'retain_username');
+ $vars = array('mode', 'user_ids', 'retain_username', 'user_rows');
extract($phpbb_dispatcher->trigger_event('core.delete_user_before', compact($vars)));
// Before we begin, we will remove the reports the user issued.
@@ -468,7 +491,7 @@ function user_delete($mode, $user_ids, $retain_username = true)
}
$db->sql_freeresult($result);
- if (sizeof($report_posts))
+ if (count($report_posts))
{
$report_posts = array_unique($report_posts);
$report_topics = array_unique($report_topics);
@@ -488,7 +511,7 @@ function user_delete($mode, $user_ids, $retain_username = true)
}
$db->sql_freeresult($result);
- if (sizeof($keep_report_topics))
+ if (count($keep_report_topics))
{
$report_topics = array_diff($report_topics, $keep_report_topics);
}
@@ -500,7 +523,7 @@ function user_delete($mode, $user_ids, $retain_username = true)
WHERE ' . $db->sql_in_set('post_id', $report_posts);
$db->sql_query($sql);
- if (sizeof($report_topics))
+ if (count($report_topics))
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_reported = 0
@@ -651,8 +674,30 @@ function user_delete($mode, $user_ids, $retain_username = true)
delete_posts('poster_id', $user_ids);
}
- $table_ary = array(USERS_TABLE, USER_GROUP_TABLE, TOPICS_WATCH_TABLE, FORUMS_WATCH_TABLE, ACL_USERS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, FORUMS_TRACK_TABLE, PROFILE_FIELDS_DATA_TABLE, MODERATOR_CACHE_TABLE, DRAFTS_TABLE, BOOKMARKS_TABLE, SESSIONS_KEYS_TABLE, PRIVMSGS_FOLDER_TABLE, PRIVMSGS_RULES_TABLE);
-
+ $table_ary = [
+ USERS_TABLE,
+ USER_GROUP_TABLE,
+ TOPICS_WATCH_TABLE,
+ FORUMS_WATCH_TABLE,
+ ACL_USERS_TABLE,
+ TOPICS_TRACK_TABLE,
+ TOPICS_POSTED_TABLE,
+ FORUMS_TRACK_TABLE,
+ PROFILE_FIELDS_DATA_TABLE,
+ MODERATOR_CACHE_TABLE,
+ DRAFTS_TABLE,
+ BOOKMARKS_TABLE,
+ SESSIONS_KEYS_TABLE,
+ PRIVMSGS_FOLDER_TABLE,
+ PRIVMSGS_RULES_TABLE,
+ $phpbb_container->getParameter('tables.auth_provider_oauth_token_storage'),
+ $phpbb_container->getParameter('tables.auth_provider_oauth_states'),
+ $phpbb_container->getParameter('tables.auth_provider_oauth_account_assoc'),
+ $phpbb_container->getParameter('tables.user_notifications')
+ ];
+
+ // Ignore errors on deleting from non-existent tables, e.g. when migrating
+ $db->sql_return_on_error(true);
// Delete the miscellaneous (non-post) data for the user
foreach ($table_ary as $table)
{
@@ -660,6 +705,7 @@ function user_delete($mode, $user_ids, $retain_username = true)
WHERE " . $user_id_sql;
$db->sql_query($sql);
}
+ $db->sql_return_on_error();
$cache->destroy('sql', MODERATOR_CACHE_TABLE);
@@ -767,7 +813,7 @@ function user_active_flip($mode, $user_id_ary, $reason = INACTIVE_MANUAL)
$user_id_ary = array($user_id_ary);
}
- if (!sizeof($user_id_ary))
+ if (!count($user_id_ary))
{
return;
}
@@ -825,7 +871,7 @@ function user_active_flip($mode, $user_id_ary, $reason = INACTIVE_MANUAL)
$vars = array('mode', 'reason', 'activated', 'deactivated', 'user_id_ary', 'sql_statements');
extract($phpbb_dispatcher->trigger_event('core.user_active_flip_before', compact($vars)));
- if (sizeof($sql_statements))
+ if (count($sql_statements))
{
foreach ($sql_statements as $user_id => $sql_ary)
{
@@ -903,7 +949,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
else
{
$ban_other = explode('-', $ban_len_other);
- if (sizeof($ban_other) == 3 && ((int) $ban_other[0] < 9999) &&
+ if (count($ban_other) == 3 && ((int) $ban_other[0] < 9999) &&
(strlen($ban_other[0]) == 4) && (strlen($ban_other[1]) == 2) && (strlen($ban_other[2]) == 2))
{
$ban_end = max($current_time, $user->create_datetime()
@@ -971,7 +1017,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
}
// Make sure we have been given someone to ban
- if (!sizeof($sql_usernames))
+ if (!count($sql_usernames))
{
trigger_error('NO_USER_SPECIFIED', E_USER_WARNING);
}
@@ -982,7 +1028,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
// Do not allow banning yourself, the guest account, or founders.
$non_bannable = array($user->data['user_id'], ANONYMOUS);
- if (sizeof($founder))
+ if (count($founder))
{
$sql .= ' AND ' . $db->sql_in_set('user_id', array_merge(array_keys($founder), $non_bannable), true);
}
@@ -1122,14 +1168,14 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
continue;
}
- if (!sizeof($founder) || !in_array($ban_item, $founder))
+ if (!count($founder) || !in_array($ban_item, $founder))
{
$banlist_ary[] = $ban_item;
}
}
}
- if (sizeof($ban_list) == 0)
+ if (count($ban_list) == 0)
{
trigger_error('NO_EMAILS_DEFINED', E_USER_WARNING);
}
@@ -1176,7 +1222,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
$banlist_ary_tmp = array_intersect($banlist_ary, $banlist_ary_tmp);
- if (sizeof($banlist_ary_tmp))
+ if (count($banlist_ary_tmp))
{
// One or more entities are already banned/excluded, delete the existing bans, so they can be re-inserted with the given new length
$sql = 'DELETE FROM ' . BANLIST_TABLE . '
@@ -1190,7 +1236,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
$db->sql_freeresult($result);
// We have some entities to ban
- if (sizeof($banlist_ary))
+ if (count($banlist_ary))
{
$sql_ary = array();
@@ -1318,7 +1364,7 @@ function user_unban($mode, $ban)
$unban_sql = array_map('intval', $ban);
- if (sizeof($unban_sql))
+ if (count($unban_sql))
{
// Grab details of bans for logging information later
switch ($mode)
@@ -1414,21 +1460,14 @@ function user_ipwhois($ip)
return '';
}
- if (preg_match(get_preg_expression('ipv4'), $ip))
- {
- // IPv4 address
- $whois_host = 'whois.arin.net.';
- }
- else if (preg_match(get_preg_expression('ipv6'), $ip))
- {
- // IPv6 address
- $whois_host = 'whois.sixxs.net.';
- }
- else
+ if (!preg_match(get_preg_expression('ipv4'), $ip) && !preg_match(get_preg_expression('ipv6'), $ip))
{
return '';
}
+ // IPv4 & IPv6 addresses
+ $whois_host = 'whois.arin.net.';
+
$ipwhois = '';
if (($fsk = @fsockopen($whois_host, 43)))
@@ -1582,7 +1621,7 @@ function validate_num($num, $optional = false, $min = 0, $max = 1E99)
function validate_date($date_string, $optional = false)
{
$date = explode('-', $date_string);
- if ((empty($date) || sizeof($date) != 3) && $optional)
+ if ((empty($date) || count($date) != 3) && $optional)
{
return false;
}
@@ -1604,7 +1643,7 @@ function validate_date($date_string, $optional = false)
}
}
- if (sizeof($date) != 3 || !checkdate($date[1], $date[0], $date[2]))
+ if (count($date) != 3 || !checkdate($date[1], $date[0], $date[2]))
{
return 'INVALID';
}
@@ -1679,17 +1718,21 @@ function phpbb_validate_timezone($timezone)
return (in_array($timezone, phpbb_get_timezone_identifiers($timezone))) ? false : 'TIMEZONE_INVALID';
}
-/**
-* Check to see if the username has been taken, or if it is disallowed.
-* Also checks if it includes the " character, which we don't allow in usernames.
-* Used for registering, changing names, and posting anonymously with a username
-*
-* @param string $username The username to check
-* @param string $allowed_username An allowed username, default being $user->data['username']
-*
-* @return mixed Either false if validation succeeded or a string which will be used as the error message (with the variable name appended)
-*/
-function validate_username($username, $allowed_username = false)
+/***
+ * Validate Username
+ *
+ * Check to see if the username has been taken, or if it is disallowed.
+ * Also checks if it includes the " character or the 4-bytes Unicode ones
+ * (aka emojis) which we don't allow in usernames.
+ * Used for registering, changing names, and posting anonymously with a username
+ *
+ * @param string $username The username to check
+ * @param string $allowed_username An allowed username, default being $user->data['username']
+ *
+ * @return mixed Either false if validation succeeded or a string which will be
+ * used as the error message (with the variable name appended)
+ */
+function validate_username($username, $allowed_username = false, $allow_all_names = false)
{
global $config, $db, $user, $cache;
@@ -1701,6 +1744,14 @@ function validate_username($username, $allowed_username = false)
return false;
}
+ // The very first check is for
+ // out-of-bounds characters that are currently
+ // not supported by utf8_bin in MySQL
+ if (preg_match('/[\x{10000}-\x{10FFFF}]/u', $username))
+ {
+ return 'INVALID_EMOJIS';
+ }
+
// ... fast checks first.
if (strpos($username, '&quot;') !== false || strpos($username, '"') !== false || empty($clean_username))
{
@@ -1764,13 +1815,16 @@ function validate_username($username, $allowed_username = false)
return 'USERNAME_TAKEN';
}
- $bad_usernames = $cache->obtain_disallowed_usernames();
-
- foreach ($bad_usernames as $bad_username)
+ if (!$allow_all_names)
{
- if (preg_match('#^' . $bad_username . '$#', $clean_username))
+ $bad_usernames = $cache->obtain_disallowed_usernames();
+
+ foreach ($bad_usernames as $bad_username)
{
- return 'USERNAME_DISALLOWED';
+ if (preg_match('#^' . $bad_username . '$#', $clean_username))
+ {
+ return 'USERNAME_DISALLOWED';
+ }
}
}
@@ -1891,9 +1945,9 @@ function validate_user_email($email, $allowed_email = false)
return $validate_email;
}
- if (($ban_reason = $user->check_ban(false, false, $email, true)) !== false)
+ if (($ban = $user->check_ban(false, false, $email, true)) !== false)
{
- return ($ban_reason === true) ? 'EMAIL_BANNED' : $ban_reason;
+ return ($ban === true) ? 'EMAIL_BANNED' : (!empty($ban['ban_give_reason']) ? $ban['ban_give_reason'] : $ban);
}
if (!$config['allow_emailreuse'])
@@ -1944,7 +1998,7 @@ function validate_jabber($jid)
$arr = explode('.', $realm);
- if (sizeof($arr) == 0)
+ if (count($arr) == 0)
{
return 'WRONG_DATA';
}
@@ -2268,7 +2322,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
$group_teampage = !empty($group_attributes['group_teampage']);
unset($group_attributes['group_teampage']);
- if (!sizeof($error))
+ if (!count($error))
{
$current_legend = \phpbb\groupposition\legend::GROUP_DISABLED;
$current_teampage = \phpbb\groupposition\teampage::GROUP_DISABLED;
@@ -2341,7 +2395,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
generate_text_for_storage($sql_ary['group_desc'], $sql_ary['group_desc_uid'], $sql_ary['group_desc_bitfield'], $sql_ary['group_desc_options'], $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies);
}
- if (sizeof($group_attributes))
+ if (count($group_attributes))
{
// Merge them with $sql_ary to properly update the group
$sql_ary = array_merge($sql_ary, $group_attributes);
@@ -2467,7 +2521,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
// Set user attributes
$sql_ary = array();
- if (sizeof($group_attributes))
+ if (count($group_attributes))
{
// Go through the user attributes array, check if a group attribute matches it and then set it. ;)
foreach ($user_attribute_ary as $attribute)
@@ -2487,7 +2541,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
}
}
- if (sizeof($sql_ary) && sizeof($user_ary))
+ if (count($sql_ary) && count($user_ary))
{
group_set_user_default($group_id, $user_ary, $sql_ary);
}
@@ -2498,7 +2552,7 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
group_update_listings($group_id);
}
- return (sizeof($error)) ? $error : false;
+ return (count($error)) ? $error : false;
}
@@ -2663,11 +2717,18 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
// We need both username and user_id info
$result = user_get_id_name($user_id_ary, $username_ary);
- if (!sizeof($user_id_ary) || $result !== false)
+ if (empty($user_id_ary) || $result !== false)
{
return 'NO_USER';
}
+ // Because the item that gets passed into the previous function is unset, the reference is lost and our original
+ // array is retained - so we know there's a problem if there's a different number of ids to usernames now.
+ if (count($user_id_ary) != count($username_ary))
+ {
+ return 'GROUP_USERS_INVALID';
+ }
+
// Remove users who are already members of this group
$sql = 'SELECT user_id, group_leader
FROM ' . USER_GROUP_TABLE . '
@@ -2691,7 +2752,7 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
$add_id_ary = array_diff($user_id_ary, $add_id_ary);
// If we have no users
- if (!sizeof($add_id_ary) && !sizeof($update_id_ary))
+ if (!count($add_id_ary) && !count($update_id_ary))
{
return 'GROUP_USERS_EXIST';
}
@@ -2699,7 +2760,7 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
$db->sql_transaction('begin');
// Insert the new users
- if (sizeof($add_id_ary))
+ if (count($add_id_ary))
{
$sql_ary = array();
@@ -2716,7 +2777,7 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
$db->sql_multi_insert(USER_GROUP_TABLE, $sql_ary);
}
- if (sizeof($update_id_ary))
+ if (count($update_id_ary))
{
$sql = 'UPDATE ' . USER_GROUP_TABLE . '
SET group_leader = 1
@@ -2808,7 +2869,7 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
// We need both username and user_id info
$result = user_get_id_name($user_id_ary, $username_ary);
- if (!sizeof($user_id_ary) || $result !== false)
+ if (empty($user_id_ary) || $result !== false)
{
return 'NO_USER';
}
@@ -2884,7 +2945,7 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
foreach ($special_group_data as $gid => $default_data_ary)
{
- if (isset($sql_where_ary[$gid]) && sizeof($sql_where_ary[$gid]))
+ if (isset($sql_where_ary[$gid]) && count($sql_where_ary[$gid]))
{
remove_default_rank($group_id, $sql_where_ary[$gid]);
remove_default_avatar($group_id, $sql_where_ary[$gid]);
@@ -3043,7 +3104,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
// We need both username and user_id info
$result = user_get_id_name($user_id_ary, $username_ary);
- if (!sizeof($user_id_ary) || $result !== false)
+ if (empty($user_id_ary) || $result !== false)
{
return 'NO_USERS';
}
@@ -3098,7 +3159,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
}
$db->sql_freeresult($result);
- if (!sizeof($user_id_ary))
+ if (!count($user_id_ary))
{
return false;
}
@@ -3139,7 +3200,7 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
$db->sql_freeresult($result);
$result = user_get_id_name($user_id_ary, $username_ary);
- if (!sizeof($user_id_ary) || $result !== false)
+ if (!count($user_id_ary) || $result !== false)
{
return 'NO_USERS';
}
@@ -3502,7 +3563,7 @@ function group_update_listings($group_id)
$hold_ary = $auth->acl_group_raw_data($group_id, array('a_', 'm_'));
- if (!sizeof($hold_ary))
+ if (empty($hold_ary))
{
return;
}
@@ -3589,11 +3650,6 @@ function remove_newly_registered($user_id, $user_data = false)
}
}
- if (empty($user_data['user_new']))
- {
- return false;
- }
-
$sql = 'SELECT group_id
FROM ' . GROUPS_TABLE . "
WHERE group_name = 'NEWLY_REGISTERED'
diff --git a/phpBB/includes/hooks/index.php b/phpBB/includes/hooks/index.php
index 805e0eea1a..821242cbf4 100644
--- a/phpBB/includes/hooks/index.php
+++ b/phpBB/includes/hooks/index.php
@@ -44,7 +44,7 @@ class phpbb_hook
*
* @param array $valid_hooks array containing the hookable functions/methods
*/
- function phpbb_hook($valid_hooks)
+ function __construct($valid_hooks)
{
foreach ($valid_hooks as $_null => $method)
{
diff --git a/phpBB/includes/mcp/mcp_ban.php b/phpBB/includes/mcp/mcp_ban.php
index 2f3405f915..6f748f5433 100644
--- a/phpBB/includes/mcp/mcp_ban.php
+++ b/phpBB/includes/mcp/mcp_ban.php
@@ -34,7 +34,10 @@ class mcp_ban
}
// Include the admin banning interface...
- include($phpbb_root_path . 'includes/acp/acp_ban.' . $phpEx);
+ if (!class_exists('acp_ban'))
+ {
+ include($phpbb_root_path . 'includes/acp/acp_ban.' . $phpEx);
+ }
$bansubmit = $request->is_set_post('bansubmit');
$unbansubmit = $request->is_set_post('unbansubmit');
@@ -266,9 +269,9 @@ class mcp_ban
}
else if ($post_id)
{
- $post_info = phpbb_get_post_data($post_id, 'm_ban');
+ $post_info = phpbb_get_post_data(array($post_id), 'm_ban');
- if (sizeof($post_info) && !empty($post_info[$post_id]))
+ if (count($post_info) && !empty($post_info[$post_id]))
{
switch ($mode)
{
diff --git a/phpBB/includes/mcp/mcp_forum.php b/phpBB/includes/mcp/mcp_forum.php
index 3e214797c8..19f71e092a 100644
--- a/phpBB/includes/mcp/mcp_forum.php
+++ b/phpBB/includes/mcp/mcp_forum.php
@@ -96,14 +96,14 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$pagination = $phpbb_container->get('pagination');
$selected_ids = '';
- if (sizeof($post_id_list) && $action != 'merge_topics')
+ if (count($post_id_list) && $action != 'merge_topics')
{
foreach ($post_id_list as $num => $post_id)
{
$selected_ids .= '&amp;post_id_list[' . $num . ']=' . $post_id;
}
}
- else if (sizeof($topic_id_list) && $action == 'merge_topics')
+ else if (count($topic_id_list) && $action == 'merge_topics')
{
foreach ($topic_id_list as $num => $topic_id)
{
@@ -221,13 +221,13 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$db->sql_freeresult($result);
// If there is more than one page, but we have no topic list, then the start parameter is... erm... out of sync
- if (!sizeof($topic_list) && $forum_topics && $start > 0)
+ if (!count($topic_list) && $forum_topics && $start > 0)
{
redirect($url . "&amp;i=$id&amp;action=$action&amp;mode=$mode");
}
// Get topic tracking info
- if (sizeof($topic_list))
+ if (count($topic_list))
{
if ($config['load_db_lastread'])
{
@@ -358,7 +358,7 @@ function mcp_resync_topics($topic_ids)
{
global $db, $user, $phpbb_log, $request;
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
@@ -389,7 +389,7 @@ function mcp_resync_topics($topic_ids)
}
$db->sql_freeresult($result);
- $msg = (sizeof($topic_ids) == 1) ? $user->lang['TOPIC_RESYNC_SUCCESS'] : $user->lang['TOPICS_RESYNC_SUCCESS'];
+ $msg = (count($topic_ids) == 1) ? $user->lang['TOPIC_RESYNC_SUCCESS'] : $user->lang['TOPICS_RESYNC_SUCCESS'];
$redirect = $request->variable('redirect', $user->data['session_page']);
@@ -406,7 +406,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
{
global $db, $template, $user, $phpEx, $phpbb_root_path, $phpbb_log, $request, $phpbb_dispatcher;
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
$template->assign_var('MESSAGE', $user->lang['NO_TOPIC_SELECTED']);
return;
@@ -421,7 +421,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
$all_topic_data = phpbb_get_topic_data($sync_topics, 'm_merge');
- if (!sizeof($all_topic_data) || empty($all_topic_data[$to_topic_id]))
+ if (!count($all_topic_data) || empty($all_topic_data[$to_topic_id]))
{
$template->assign_var('MESSAGE', $user->lang['NO_FINAL_TOPIC_SELECTED']);
return;
@@ -440,7 +440,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
$post_id_list = $request->variable('post_id_list', array(0));
$start = $request->variable('start', 0);
- if (!sizeof($post_id_list) && sizeof($topic_ids))
+ if (!count($post_id_list) && count($topic_ids))
{
$sql = 'SELECT post_id
FROM ' . POSTS_TABLE . '
@@ -455,7 +455,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
$db->sql_freeresult($result);
}
- if (!sizeof($post_id_list))
+ if (!count($post_id_list))
{
$template->assign_var('MESSAGE', $user->lang['NO_POST_SELECTED']);
return;
diff --git a/phpBB/includes/mcp/mcp_front.php b/phpBB/includes/mcp/mcp_front.php
index aeb716c1f9..918a98734b 100644
--- a/phpBB/includes/mcp/mcp_front.php
+++ b/phpBB/includes/mcp/mcp_front.php
@@ -290,7 +290,10 @@ function mcp_front_view($id, $mode, $action)
if ($total)
{
- include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
+ if (!function_exists('get_recipient_strings'))
+ {
+ include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
+ }
$sql_ary = array(
'SELECT' => 'r.report_id, r.report_time, p.msg_id, p.message_subject, p.message_time, p.to_address, p.bcc_address, p.message_attachment, u.username, u.username_clean, u.user_colour, u.user_id, u2.username as author_name, u2.username_clean as author_name_clean, u2.user_colour as author_colour, u2.user_id as author_id',
diff --git a/phpBB/includes/mcp/mcp_logs.php b/phpBB/includes/mcp/mcp_logs.php
index c34c915a40..79f9d35ebe 100644
--- a/phpBB/includes/mcp/mcp_logs.php
+++ b/phpBB/includes/mcp/mcp_logs.php
@@ -28,9 +28,9 @@ class mcp_logs
var $u_action;
var $p_master;
- function mcp_logs(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
@@ -115,7 +115,7 @@ class mcp_logs
{
if (confirm_box(true))
{
- if ($deletemark && sizeof($marked))
+ if ($deletemark && count($marked))
{
$conditions = array(
'forum_id' => array('IN' => $forum_list),
@@ -221,7 +221,7 @@ class mcp_logs
'IP' => $row['ip'],
'DATE' => $user->format_date($row['time']),
'ACTION' => $row['action'],
- 'DATA' => (sizeof($data)) ? implode(' | ', $data) : '',
+ 'DATA' => (count($data)) ? implode(' | ', $data) : '',
'ID' => $row['id'],
)
);
diff --git a/phpBB/includes/mcp/mcp_main.php b/phpBB/includes/mcp/mcp_main.php
index 3d56bba21c..744eaebd7d 100644
--- a/phpBB/includes/mcp/mcp_main.php
+++ b/phpBB/includes/mcp/mcp_main.php
@@ -28,9 +28,9 @@ class mcp_main
var $p_master;
var $u_action;
- function mcp_main(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
@@ -41,13 +41,29 @@ class mcp_main
$quickmod = ($mode == 'quickmod') ? true : false;
+ /**
+ * Event to perform additional actions before an MCP action is executed.
+ *
+ * @event core.mcp_main_before
+ * @var string action The action that is about to be performed
+ * @var string mode The mode in which the MCP is accessed, e.g. front, forum_view, topic_view, post_details, quickmod
+ * @var boolean quickmod Whether or not the action is performed via QuickMod
+ * @since 3.2.8-RC1
+ */
+ $vars = [
+ 'action',
+ 'mode',
+ 'quickmod',
+ ];
+ extract($phpbb_dispatcher->trigger_event('core.mcp_main_before', compact($vars)));
+
switch ($action)
{
case 'lock':
case 'unlock':
$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
@@ -60,7 +76,7 @@ class mcp_main
$post_ids = (!$quickmod) ? $request->variable('post_id_list', array(0)) : array($request->variable('p', 0));
- if (!sizeof($post_ids))
+ if (!count($post_ids))
{
trigger_error('NO_POST_SELECTED');
}
@@ -75,7 +91,7 @@ class mcp_main
$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
@@ -88,7 +104,7 @@ class mcp_main
$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
@@ -101,7 +117,7 @@ class mcp_main
$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
@@ -118,7 +134,7 @@ class mcp_main
$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
$soft_delete = (($request->is_set_post('confirm') && !$request->is_set_post('delete_permanent')) || !$auth->acl_get('m_delete', $forum_id)) ? true : false;
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
@@ -135,7 +151,7 @@ class mcp_main
$post_ids = (!$quickmod) ? $request->variable('post_id_list', array(0)) : array($request->variable('p', 0));
$soft_delete = (($request->is_set_post('confirm') && !$request->is_set_post('delete_permanent')) || !$auth->acl_get('m_delete', $forum_id)) ? true : false;
- if (!sizeof($post_ids))
+ if (!count($post_ids))
{
trigger_error('NO_POST_SELECTED');
}
@@ -148,7 +164,7 @@ class mcp_main
$topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
@@ -174,7 +190,10 @@ class mcp_main
switch ($mode)
{
case 'front':
- include($phpbb_root_path . 'includes/mcp/mcp_front.' . $phpEx);
+ if (!function_exists('mcp_front_view'))
+ {
+ include($phpbb_root_path . 'includes/mcp/mcp_front.' . $phpEx);
+ }
$user->add_lang('acp/common');
@@ -185,7 +204,10 @@ class mcp_main
break;
case 'forum_view':
- include($phpbb_root_path . 'includes/mcp/mcp_forum.' . $phpEx);
+ if (!function_exists('mcp_forum_view'))
+ {
+ include($phpbb_root_path . 'includes/mcp/mcp_forum.' . $phpEx);
+ }
$user->add_lang('viewforum');
@@ -193,7 +215,7 @@ class mcp_main
$forum_info = phpbb_get_forum_data($forum_id, 'm_', true);
- if (!sizeof($forum_info))
+ if (!count($forum_info))
{
$this->main('main', 'front');
return;
@@ -208,7 +230,10 @@ class mcp_main
break;
case 'topic_view':
- include($phpbb_root_path . 'includes/mcp/mcp_topic.' . $phpEx);
+ if (!function_exists('mcp_topic_view'))
+ {
+ include($phpbb_root_path . 'includes/mcp/mcp_topic.' . $phpEx);
+ }
mcp_topic_view($id, $mode, $action);
@@ -217,7 +242,10 @@ class mcp_main
break;
case 'post_details':
- include($phpbb_root_path . 'includes/mcp/mcp_post.' . $phpEx);
+ if (!function_exists('mcp_post_details'))
+ {
+ include($phpbb_root_path . 'includes/mcp/mcp_post.' . $phpEx);
+ }
mcp_post_details($id, $mode, $action);
@@ -342,7 +370,7 @@ function lock_unlock($action, $ids)
);
extract($phpbb_dispatcher->trigger_event('core.mcp_lock_unlock_after', compact($vars)));
- $success_msg = $l_prefix . ((sizeof($ids) == 1) ? '' : 'S') . '_' . (($action == 'lock' || $action == 'lock_post') ? 'LOCKED' : 'UNLOCKED') . '_SUCCESS';
+ $success_msg = $l_prefix . ((count($ids) == 1) ? '' : 'S') . '_' . (($action == 'lock' || $action == 'lock_post') ? 'LOCKED' : 'UNLOCKED') . '_SUCCESS';
meta_refresh(2, $redirect);
$message = $user->lang[$success_msg];
@@ -355,7 +383,7 @@ function lock_unlock($action, $ids)
}
else
{
- confirm_box(false, strtoupper($action) . '_' . $l_prefix . ((sizeof($ids) == 1) ? '' : 'S'), $s_hidden_fields);
+ confirm_box(false, strtoupper($action) . '_' . $l_prefix . ((count($ids) == 1) ? '' : 'S'), $s_hidden_fields);
}
redirect($redirect);
@@ -366,32 +394,32 @@ function lock_unlock($action, $ids)
*/
function change_topic_type($action, $topic_ids)
{
- global $user, $db, $request, $phpbb_log;
+ global $user, $db, $request, $phpbb_log, $phpbb_dispatcher;
switch ($action)
{
case 'make_announce':
$new_topic_type = POST_ANNOUNCE;
$check_acl = 'f_announce';
- $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_ANNOUNCEMENT' : 'MCP_MAKE_ANNOUNCEMENTS';
+ $l_new_type = (count($topic_ids) == 1) ? 'MCP_MAKE_ANNOUNCEMENT' : 'MCP_MAKE_ANNOUNCEMENTS';
break;
case 'make_global':
$new_topic_type = POST_GLOBAL;
$check_acl = 'f_announce_global';
- $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_GLOBAL' : 'MCP_MAKE_GLOBALS';
+ $l_new_type = (count($topic_ids) == 1) ? 'MCP_MAKE_GLOBAL' : 'MCP_MAKE_GLOBALS';
break;
case 'make_sticky':
$new_topic_type = POST_STICKY;
$check_acl = 'f_sticky';
- $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_STICKY' : 'MCP_MAKE_STICKIES';
+ $l_new_type = (count($topic_ids) == 1) ? 'MCP_MAKE_STICKY' : 'MCP_MAKE_STICKIES';
break;
default:
$new_topic_type = POST_NORMAL;
$check_acl = false;
- $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_NORMAL' : 'MCP_MAKE_NORMALS';
+ $l_new_type = (count($topic_ids) == 1) ? 'MCP_MAKE_NORMAL' : 'MCP_MAKE_NORMALS';
break;
}
@@ -414,27 +442,43 @@ function change_topic_type($action, $topic_ids)
if (confirm_box(true))
{
+
+ /**
+ * Perform additional actions before changing topic(s) type
+ *
+ * @event core.mcp_change_topic_type_before
+ * @var int new_topic_type The candidated topic type.
+ * @var int forum_id The forum ID for the topic ID(s).
+ * @var array topic_ids Array containing the topic ID(s) that will be changed
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'new_topic_type',
+ 'forum_id',
+ 'topic_ids',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.mcp_change_topic_type_before', compact($vars)));
+
+ $db->sql_transaction('begin');
+
$sql = 'UPDATE ' . TOPICS_TABLE . "
SET topic_type = $new_topic_type
WHERE " . $db->sql_in_set('topic_id', $topic_ids);
$db->sql_query($sql);
- if (($new_topic_type == POST_GLOBAL) && sizeof($topic_ids))
+ if (($new_topic_type == POST_GLOBAL) && count($topic_ids))
{
// Delete topic shadows for global announcements
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE ' . $db->sql_in_set('topic_moved_id', $topic_ids);
$db->sql_query($sql);
-
- $sql = 'UPDATE ' . TOPICS_TABLE . "
- SET topic_type = $new_topic_type
- WHERE " . $db->sql_in_set('topic_id', $topic_ids);
- $db->sql_query($sql);
}
- $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_TYPE_CHANGED' : 'TOPICS_TYPE_CHANGED';
+ $db->sql_transaction('commit');
+
+ $success_msg = (count($topic_ids) == 1) ? 'TOPIC_TYPE_CHANGED' : 'TOPICS_TYPE_CHANGED';
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$data = phpbb_get_topic_data($topic_ids);
@@ -448,6 +492,22 @@ function change_topic_type($action, $topic_ids)
}
}
+ /**
+ * Perform additional actions after changing topic types
+ *
+ * @event core.mcp_change_topic_type_after
+ * @var int new_topic_type The newly changed topic type.
+ * @var int forum_id The forum ID where the newly changed topic type belongs to.
+ * @var array topic_ids Array containing the topic IDs that have been changed
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'new_topic_type',
+ 'forum_id',
+ 'topic_ids',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.mcp_change_topic_type_after', compact($vars)));
+
meta_refresh(2, $redirect);
$message = $user->lang[$success_msg];
@@ -496,7 +556,7 @@ function mcp_move_topic($topic_ids)
{
$forum_data = phpbb_get_forum_data($to_forum_id, 'f_post');
- if (!sizeof($forum_data))
+ if (!count($forum_data))
{
$additional_msg = $user->lang['FORUM_NOT_EXIST'];
}
@@ -691,7 +751,7 @@ function mcp_move_topic($topic_ids)
$sync_sql[$forum_id][] = 'forum_topics_softdeleted = forum_topics_softdeleted - ' . (int) $topics_moved_softdeleted;
}
- $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_MOVED_SUCCESS' : 'TOPICS_MOVED_SUCCESS';
+ $success_msg = (count($topic_ids) == 1) ? 'TOPIC_MOVED_SUCCESS' : 'TOPICS_MOVED_SUCCESS';
foreach ($sync_sql as $forum_id_key => $array)
{
@@ -714,7 +774,7 @@ function mcp_move_topic($topic_ids)
'ADDITIONAL_MSG' => $additional_msg)
);
- confirm_box(false, 'MOVE_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
+ confirm_box(false, 'MOVE_TOPIC' . ((count($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
}
$redirect = $request->variable('redirect', "index.$phpEx");
@@ -762,7 +822,7 @@ function mcp_restore_topic($topic_ids)
if (confirm_box(true))
{
- $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_RESTORED_SUCCESS' : 'TOPICS_RESTORED_SUCCESS';
+ $success_msg = (count($topic_ids) == 1) ? 'TOPIC_RESTORED_SUCCESS' : 'TOPICS_RESTORED_SUCCESS';
$data = phpbb_get_topic_data($topic_ids);
@@ -784,7 +844,7 @@ function mcp_restore_topic($topic_ids)
}
else
{
- confirm_box(false, (sizeof($topic_ids) == 1) ? 'RESTORE_TOPIC' : 'RESTORE_TOPICS', $s_hidden_fields);
+ confirm_box(false, (count($topic_ids) == 1) ? 'RESTORE_TOPIC' : 'RESTORE_TOPICS', $s_hidden_fields);
}
$topic_id = $request->variable('t', 0);
@@ -842,7 +902,7 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''
if (confirm_box(true))
{
- $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_DELETED_SUCCESS' : 'TOPICS_DELETED_SUCCESS';
+ $success_msg = (count($topic_ids) == 1) ? 'TOPIC_DELETED_SUCCESS' : 'TOPICS_DELETED_SUCCESS';
$data = phpbb_get_topic_data($topic_ids);
@@ -927,13 +987,14 @@ function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = ''
'S_TOPIC_MODE' => true,
'S_ALLOWED_DELETE' => $auth->acl_get('m_delete', $forum_id),
'S_ALLOWED_SOFTDELETE' => $auth->acl_get('m_softdelete', $forum_id),
- 'DELETE_TOPIC_PERMANENTLY_EXPLAIN' => $user->lang('DELETE_TOPIC_PERMANENTLY', sizeof($topic_ids)),
+ 'DELETE_TOPIC_PERMANENTLY_EXPLAIN' => $user->lang('DELETE_TOPIC_PERMANENTLY', count($topic_ids)),
));
- $l_confirm = (sizeof($topic_ids) == 1) ? 'DELETE_TOPIC' : 'DELETE_TOPICS';
+ $count = count($topic_ids);
+ $l_confirm = $count === 1 ? 'DELETE_TOPIC' : 'DELETE_TOPICS';
if ($only_softdeleted)
{
- $l_confirm .= '_PERMANENTLY';
+ $l_confirm = array($l_confirm . '_PERMANENTLY', $count);
$s_hidden_fields['delete_permanent'] = '1';
}
else if ($only_shadow || !$auth->acl_get('m_softdelete', $forum_id))
@@ -1042,11 +1103,11 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
{
$phpbb_content_visibility->set_post_visibility(ITEM_DELETED, $topic_data['posts'], $topic_id, $topic_data['forum_id'], $user->data['user_id'], time(), $soft_delete_reason, isset($topic_data['first_post']), isset($topic_data['last_post']));
}
- $affected_topics = sizeof($topic_info);
+ $affected_topics = count($topic_info);
// None of the topics is really deleted, so a redirect won't hurt much.
$deleted_topics = 0;
- $success_msg = (sizeof($post_info) == 1) ? $user->lang['POST_DELETED_SUCCESS'] : $user->lang['POSTS_DELETED_SUCCESS'];
+ $success_msg = (count($post_info) == 1) ? $user->lang['POST_DELETED_SUCCESS'] : $user->lang['POSTS_DELETED_SUCCESS'];
foreach ($approve_log as $row)
{
@@ -1093,7 +1154,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
{
$topic_id_list[] = $row['topic_id'];
}
- $affected_topics = sizeof($topic_id_list);
+ $affected_topics = count($topic_id_list);
$db->sql_freeresult($result);
$post_data = phpbb_get_post_data($post_ids);
@@ -1132,7 +1193,7 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
}
$return_link[] = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
- if (sizeof($post_ids) == 1)
+ if (count($post_ids) == 1)
{
if ($deleted_topics)
{
@@ -1181,13 +1242,14 @@ function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '',
'S_SOFTDELETED' => $only_softdeleted,
'S_ALLOWED_DELETE' => $auth->acl_get('m_delete', $forum_id),
'S_ALLOWED_SOFTDELETE' => $auth->acl_get('m_softdelete', $forum_id),
- 'DELETE_POST_PERMANENTLY_EXPLAIN' => $user->lang('DELETE_POST_PERMANENTLY', sizeof($post_ids)),
+ 'DELETE_POST_PERMANENTLY_EXPLAIN' => $user->lang('DELETE_POST_PERMANENTLY', count($post_ids)),
));
- $l_confirm = (sizeof($post_ids) == 1) ? 'DELETE_POST' : 'DELETE_POSTS';
+ $count = count($post_ids);
+ $l_confirm = $count === 1 ? 'DELETE_POST' : 'DELETE_POSTS';
if ($only_softdeleted)
{
- $l_confirm .= '_PERMANENTLY';
+ $l_confirm = array($l_confirm . '_PERMANENTLY', $count);
$s_hidden_fields['delete_permanent'] = '1';
}
else if (!$auth->acl_get('m_softdelete', $forum_id))
@@ -1247,11 +1309,11 @@ function mcp_fork_topic($topic_ids)
{
$forum_data = phpbb_get_forum_data($to_forum_id, 'f_post');
- if (!sizeof($topic_ids))
+ if (!count($topic_ids))
{
$additional_msg = $user->lang['NO_TOPIC_SELECTED'];
}
- else if (!sizeof($forum_data))
+ else if (!count($forum_data))
{
$additional_msg = $user->lang['FORUM_NOT_EXIST'];
}
@@ -1409,7 +1471,7 @@ function mcp_fork_topic($topic_ids)
}
$db->sql_freeresult($result);
- if (!sizeof($post_rows))
+ if (!count($post_rows))
{
continue;
}
@@ -1458,6 +1520,24 @@ function mcp_fork_topic($topic_ids)
$db->sql_query('INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
$new_post_id = $db->sql_nextid();
+ /**
+ * Perform actions after forked topic is created.
+ *
+ * @event core.mcp_main_fork_sql_after
+ * @var int new_topic_id The newly created topic ID
+ * @var int to_forum_id The forum ID where the forked topic has been moved to
+ * @var int new_post_id The newly created post ID
+ * @var array row Post data
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'new_topic_id',
+ 'to_forum_id',
+ 'new_post_id',
+ 'row',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.mcp_main_fork_sql_after', compact($vars)));
+
switch ($row['post_visibility'])
{
case ITEM_APPROVED:
@@ -1512,7 +1592,7 @@ function mcp_fork_topic($topic_ids)
}
$db->sql_freeresult($result);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(ATTACHMENTS_TABLE, $sql_ary);
}
@@ -1536,7 +1616,7 @@ function mcp_fork_topic($topic_ids)
}
$db->sql_freeresult($result);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(TOPICS_WATCH_TABLE, $sql_ary);
}
@@ -1557,7 +1637,7 @@ function mcp_fork_topic($topic_ids)
}
$db->sql_freeresult($result);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(BOOKMARKS_TABLE, $sql_ary);
}
@@ -1589,7 +1669,7 @@ function mcp_fork_topic($topic_ids)
sync('topic', 'topic_id', $new_topic_id_list);
sync('forum', 'forum_id', $to_forum_id);
- $config->increment('num_topics', sizeof($new_topic_id_list), false);
+ $config->increment('num_topics', count($new_topic_id_list), false);
$config->increment('num_posts', $total_posts, false);
foreach ($new_topic_id_list as $topic_id => $new_topic_id)
@@ -1601,7 +1681,7 @@ function mcp_fork_topic($topic_ids)
));
}
- $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_FORKED_SUCCESS' : 'TOPICS_FORKED_SUCCESS';
+ $success_msg = (count($topic_ids) == 1) ? 'TOPIC_FORKED_SUCCESS' : 'TOPICS_FORKED_SUCCESS';
}
else
{
@@ -1611,7 +1691,7 @@ function mcp_fork_topic($topic_ids)
'ADDITIONAL_MSG' => $additional_msg)
);
- confirm_box(false, 'FORK_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
+ confirm_box(false, 'FORK_TOPIC' . ((count($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
}
$redirect = $request->variable('redirect', "index.$phpEx");
diff --git a/phpBB/includes/mcp/mcp_notes.php b/phpBB/includes/mcp/mcp_notes.php
index 67f59bd618..a4c2356a43 100644
--- a/phpBB/includes/mcp/mcp_notes.php
+++ b/phpBB/includes/mcp/mcp_notes.php
@@ -28,9 +28,9 @@ class mcp_notes
var $p_master;
var $u_action;
- function mcp_notes(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
diff --git a/phpBB/includes/mcp/mcp_pm_reports.php b/phpBB/includes/mcp/mcp_pm_reports.php
index 67a1a959e4..eecfe9cbc8 100644
--- a/phpBB/includes/mcp/mcp_pm_reports.php
+++ b/phpBB/includes/mcp/mcp_pm_reports.php
@@ -28,9 +28,9 @@ class mcp_pm_reports
var $p_master;
var $u_action;
- function mcp_pm_reports(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
@@ -55,7 +55,7 @@ class mcp_pm_reports
$report_id_list = $request->variable('report_id_list', array(0));
- if (!sizeof($report_id_list))
+ if (!count($report_id_list))
{
trigger_error('NO_REPORT_SELECTED');
}
@@ -104,7 +104,7 @@ class mcp_pm_reports
$pm_info = phpbb_get_pm_data(array($pm_id));
- if (!sizeof($pm_info))
+ if (!count($pm_info))
{
trigger_error('NO_REPORT_SELECTED');
}
@@ -141,7 +141,7 @@ class mcp_pm_reports
}
$db->sql_freeresult($result);
- if (sizeof($attachments))
+ if (count($attachments))
{
$update_count = array();
parse_attachments(0, $message, $attachments, $update_count);
@@ -251,7 +251,7 @@ class mcp_pm_reports
}
$db->sql_freeresult($result);
- if (sizeof($report_ids))
+ if (count($report_ids))
{
$sql = 'SELECT p.*, u.username, u.username_clean, u.user_colour, r.user_id as reporter_id, ru.username as reporter_name, ru.user_colour as reporter_colour, r.report_time, r.report_id
FROM ' . REPORTS_TABLE . ' r, ' . PRIVMSGS_TABLE . ' p, ' . USERS_TABLE . ' u, ' . USERS_TABLE . ' ru
@@ -270,7 +270,7 @@ class mcp_pm_reports
}
$db->sql_freeresult($result);
- if (sizeof($pm_list))
+ if (count($pm_list))
{
$address_list = get_recipient_strings($pm_by_id);
diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php
index 60ec3b8f5a..8d278079fb 100644
--- a/phpBB/includes/mcp/mcp_post.php
+++ b/phpBB/includes/mcp/mcp_post.php
@@ -38,7 +38,7 @@ function mcp_post_details($id, $mode, $action)
add_form_key('mcp_post_details');
- if (!sizeof($post_info))
+ if (!count($post_info))
{
trigger_error('POST_NOT_EXIST');
}
@@ -165,7 +165,7 @@ function mcp_post_details($id, $mode, $action)
}
$db->sql_freeresult($result);
- if (sizeof($attachments))
+ if (count($attachments))
{
$user->add_lang('viewtopic');
$update_count = array();
@@ -213,6 +213,10 @@ function mcp_post_details($id, $mode, $action)
$l_deleted_by = '';
}
+ // parse signature
+ $parse_flags = ($post_info['user_sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $post_info['user_sig'] = generate_text_for_display($post_info['user_sig'], $post_info['user_sig_bbcode_uid'], $post_info['user_sig_bbcode_bitfield'], $parse_flags, true);
+
$mcp_post_template_data = array(
'U_MCP_ACTION' => "$url&amp;i=main&amp;quickmod=1&amp;mode=post_details", // Use this for mode paramaters
'U_POST_ACTION' => "$url&amp;i=$id&amp;mode=post_details", // Use this for action parameters
@@ -262,6 +266,7 @@ function mcp_post_details($id, $mode, $action)
'POST_IP' => $post_info['poster_ip'],
'POST_IPADDR' => ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
'POST_ID' => $post_info['post_id'],
+ 'SIGNATURE' => $post_info['user_sig'],
'U_LOOKUP_IP' => ($auth->acl_get('m_info', $post_info['forum_id'])) ? "$url&amp;i=$id&amp;mode=$mode&amp;lookup={$post_info['poster_ip']}#ip" : '',
'U_WHOIS' => ($auth->acl_get('m_info', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;mode=$mode&amp;action=whois&amp;p=$post_id&amp;ip={$post_info['poster_ip']}") : '',
@@ -409,7 +414,7 @@ function mcp_post_details($id, $mode, $action)
);
}
- if (sizeof($users_ary))
+ if (count($users_ary))
{
// Get the usernames
$sql = 'SELECT user_id, username
@@ -495,7 +500,7 @@ function mcp_post_details($id, $mode, $action)
$user_select = '';
- if (sizeof($usernames_ary))
+ if (count($usernames_ary))
{
ksort($usernames_ary);
@@ -656,7 +661,7 @@ function change_poster(&$post_info, $userdata)
// Renew post info
$post_info = phpbb_get_post_data(array($post_id), false, true);
- if (!sizeof($post_info))
+ if (!count($post_info))
{
trigger_error('POST_NOT_EXIST');
}
diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php
index f379392b12..dec583f6f4 100644
--- a/phpBB/includes/mcp/mcp_queue.php
+++ b/phpBB/includes/mcp/mcp_queue.php
@@ -28,9 +28,9 @@ class mcp_queue
var $p_master;
var $u_action;
- public function mcp_queue(&$p_master)
+ public function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
public function main($id, $mode)
@@ -179,7 +179,7 @@ class mcp_queue
$post_info = phpbb_get_post_data(array($post_id), 'm_approve', true);
- if (!sizeof($post_info))
+ if (!count($post_info))
{
trigger_error('NO_POST_SELECTED');
}
@@ -230,7 +230,7 @@ class mcp_queue
}
$db->sql_freeresult($result);
- if (sizeof($attachments))
+ if (count($attachments))
{
$update_count = array();
parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);
@@ -280,7 +280,7 @@ class mcp_queue
$post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;p=' . $post_info['post_id'] . '#p' . $post_info['post_id']);
$topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']);
- $template->assign_vars(array(
+ $post_data = array(
'S_MCP_QUEUE' => true,
'U_APPROVE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f=$forum_id"),
'S_CAN_DELETE_POST' => $auth->acl_get('m_delete', $post_info['forum_id']),
@@ -324,7 +324,35 @@ class mcp_queue
'S_FIRST_POST' => ($post_info['topic_first_post_id'] == $post_id),
'U_LOOKUP_IP' => ($auth->acl_get('m_info', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id . '&amp;lookup=' . $post_info['poster_ip']) . '#ip' : '',
- ));
+ );
+
+ /**
+ * Alter post awaiting approval template before it is rendered
+ *
+ * @event core.mcp_queue_approve_details_template
+ * @var int post_id Post ID
+ * @var int topic_id Topic ID
+ * @var array topic_info Topic data
+ * @var array post_info Post data
+ * @var array post_data Post template data
+ * @var string message Post message
+ * @var string post_url Post URL
+ * @var string topic_url Topic URL
+ * @since 3.2.2-RC1
+ */
+ $vars = array(
+ 'post_id',
+ 'topic_id',
+ 'topic_info',
+ 'post_info',
+ 'post_data',
+ 'message',
+ 'post_url',
+ 'topic_url',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.mcp_queue_approve_details_template', compact($vars)));
+
+ $template->assign_vars($post_data);
break;
@@ -349,7 +377,7 @@ class mcp_queue
{
$topic_info = phpbb_get_topic_data(array($topic_id));
- if (!sizeof($topic_info))
+ if (!count($topic_info))
{
trigger_error('TOPIC_NOT_EXIST');
}
@@ -379,7 +407,7 @@ class mcp_queue
$forum_list[] = $row['forum_id'];
}
- if (!sizeof($forum_list))
+ if (!count($forum_list))
{
trigger_error('NOT_MODERATOR');
}
@@ -395,7 +423,7 @@ class mcp_queue
{
$forum_info = phpbb_get_forum_data(array($forum_id), $m_perm);
- if (!sizeof($forum_info))
+ if (!count($forum_info))
{
trigger_error('NOT_MODERATOR');
}
@@ -465,7 +493,7 @@ class mcp_queue
}
$db->sql_freeresult($result);
- if (sizeof($post_ids))
+ if (count($post_ids))
{
$sql = 'SELECT t.topic_id, t.topic_title, t.forum_id, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, p.post_attachment, u.username, u.username_clean, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u
@@ -473,6 +501,29 @@ class mcp_queue
AND t.topic_id = p.topic_id
AND u.user_id = p.poster_id
ORDER BY ' . $sort_order_sql;
+
+ /**
+ * Alter sql query to get information on all posts in queue
+ *
+ * @event core.mcp_queue_get_posts_for_posts_query_before
+ * @var string sql String with the query to be executed
+ * @var array forum_list List of forums that contain the posts
+ * @var int visibility_const Integer with one of the possible ITEM_* constant values
+ * @var int topic_id topic_id in the page request
+ * @var string limit_time_sql String with the SQL code to limit the time interval of the post (Note: May be empty string)
+ * @var string sort_order_sql String with the ORDER BY SQL code used in this query
+ * @since 3.2.3-RC2
+ */
+ $vars = array(
+ 'sql',
+ 'forum_list',
+ 'visibility_const',
+ 'topic_id',
+ 'limit_time_sql',
+ 'sort_order_sql',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.mcp_queue_get_posts_for_posts_query_before', compact($vars)));
+
$result = $db->sql_query($sql);
$post_data = $rowset = array();
@@ -537,7 +588,7 @@ class mcp_queue
$db->sql_freeresult($result);
}
- if (sizeof($forum_names))
+ if (count($forum_names))
{
// Select the names for the forum_ids
$sql = 'SELECT forum_id, forum_name
@@ -560,7 +611,7 @@ class mcp_queue
$row['post_username'] = $row['username'] ?: $user->lang['GUEST'];
}
- $template->assign_block_vars('postrow', array(
+ $post_row = array(
'U_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;t=' . $row['topic_id']),
'U_VIEWFORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'U_VIEWPOST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;p=' . $row['post_id']) . (($mode == 'unapproved_posts') ? '#p' . $row['post_id'] : ''),
@@ -578,7 +629,25 @@ class mcp_queue
'TOPIC_TITLE' => $row['topic_title'],
'POST_TIME' => $user->format_date($row['post_time']),
'S_HAS_ATTACHMENTS' => $auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment'],
- ));
+ );
+
+ /**
+ * Alter sql query to get information on all topics in the list of forums provided.
+ *
+ * @event core.mcp_queue_get_posts_modify_post_row
+ * @var array post_row Template variables for current post
+ * @var array row Post data
+ * @var array forum_names Forum names
+ * @since 3.2.3-RC2
+ */
+ $vars = array(
+ 'post_row',
+ 'row',
+ 'forum_names',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.mcp_queue_get_posts_modify_post_row', compact($vars)));
+
+ $template->assign_block_vars('postrow', $post_row);
}
unset($rowset, $forum_names);
@@ -771,7 +840,7 @@ class mcp_queue
}
else
{
- $success_msg = (sizeof($post_info) == 1) ? 'POST_' . strtoupper($action) . 'D_SUCCESS' : 'POSTS_' . strtoupper($action) . 'D_SUCCESS';
+ $success_msg = (count($post_info) == 1) ? 'POST_' . strtoupper($action) . 'D_SUCCESS' : 'POSTS_' . strtoupper($action) . 'D_SUCCESS';
}
/**
@@ -814,7 +883,7 @@ class mcp_queue
$message .= '<br /><br />' . $user->lang('RETURN_PAGE', '<a href="' . $redirect . '">', '</a>');
// If approving one post, also give links back to post...
- if (sizeof($post_info) == 1 && $post_url)
+ if (count($post_info) == 1 && $post_url)
{
$message .= '<br /><br />' . $user->lang('RETURN_POST', '<a href="' . $post_url . '">', '</a>');
}
@@ -847,14 +916,14 @@ class mcp_queue
// Create the confirm box message
$action_msg = strtoupper($action);
- $num_posts = sizeof($post_id_list) - $num_topics;
+ $num_posts = count($post_id_list) - $num_topics;
if ($num_topics > 0 && $num_posts <= 0)
{
$action_msg .= '_TOPIC' . (($num_topics == 1) ? '' : 'S');
}
else
{
- $action_msg .= '_POST' . ((sizeof($post_id_list) == 1) ? '' : 'S');
+ $action_msg .= '_POST' . ((count($post_id_list) == 1) ? '' : 'S');
}
confirm_box(false, $action_msg, $s_hidden_fields, 'mcp_approve.html');
}
@@ -919,9 +988,9 @@ class mcp_queue
);
}
- if (sizeof($topic_info) >= 1)
+ if (count($topic_info) >= 1)
{
- $success_msg = (sizeof($topic_info) == 1) ? 'TOPIC_' . strtoupper($action) . 'D_SUCCESS' : 'TOPICS_' . strtoupper($action) . 'D_SUCCESS';
+ $success_msg = (count($topic_info) == 1) ? 'TOPIC_' . strtoupper($action) . 'D_SUCCESS' : 'TOPICS_' . strtoupper($action) . 'D_SUCCESS';
}
foreach ($approve_log as $log_data)
@@ -1024,7 +1093,7 @@ class mcp_queue
$message .= '<br /><br />' . $user->lang('RETURN_PAGE', '<a href="' . $redirect . '">', '</a>');
// If approving one topic, also give links back to topic...
- if (sizeof($topic_info) == 1 && $topic_url)
+ if (count($topic_info) == 1 && $topic_url)
{
$message .= '<br /><br />' . $user->lang('RETURN_TOPIC', '<a href="' . $topic_url . '">', '</a>');
}
@@ -1055,7 +1124,7 @@ class mcp_queue
'S_' . strtoupper($action) => true,
));
- confirm_box(false, strtoupper($action) . '_TOPIC' . ((sizeof($topic_id_list) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_approve.html');
+ confirm_box(false, strtoupper($action) . '_TOPIC' . ((count($topic_id_list) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_approve.html');
}
redirect($redirect);
@@ -1206,8 +1275,8 @@ class mcp_queue
}
// Get disapproved posts/topics counts separately
- $num_disapproved_topics = sizeof($disapprove_log_topics);
- $num_disapproved_posts = sizeof($disapprove_log_posts);
+ $num_disapproved_topics = count($disapprove_log_topics);
+ $num_disapproved_posts = count($disapprove_log_posts);
// Build the whole log
$disapprove_log = array_merge($disapprove_log_topics, $disapprove_log_posts);
@@ -1216,7 +1285,7 @@ class mcp_queue
unset($post_data, $disapprove_log_topics, $disapprove_log_posts);
// Let's do the job - delete disapproved posts
- if (sizeof($post_disapprove_list))
+ if (count($post_disapprove_list))
{
if (!function_exists('delete_posts'))
{
@@ -1444,7 +1513,7 @@ class mcp_queue
$l_confirm_msg = 'DELETE_POST_PERMANENTLY';
$confirm_template = 'confirm_delete_body.html';
}
- $l_confirm_msg .= ((sizeof($post_id_list) == 1) ? '' : 'S');
+ $l_confirm_msg .= ((count($post_id_list) == 1) ? '' : 'S');
$template->assign_vars(array(
'S_NOTIFY_POSTER' => $show_notify,
diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php
index 1462acf110..4600257344 100644
--- a/phpBB/includes/mcp/mcp_reports.php
+++ b/phpBB/includes/mcp/mcp_reports.php
@@ -28,9 +28,9 @@ class mcp_reports
var $p_master;
var $u_action;
- function mcp_reports(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
@@ -53,7 +53,7 @@ class mcp_reports
$report_id_list = $request->variable('report_id_list', array(0));
- if (!sizeof($report_id_list))
+ if (!count($report_id_list))
{
trigger_error('NO_REPORT_SELECTED');
}
@@ -158,7 +158,7 @@ class mcp_reports
$post_info = phpbb_get_post_data(array($post_id), 'm_report', true);
- if (!sizeof($post_info))
+ if (!count($post_info))
{
trigger_error('NO_REPORT_SELECTED');
}
@@ -222,7 +222,7 @@ class mcp_reports
}
$db->sql_freeresult($result);
- if (sizeof($attachments))
+ if (count($attachments))
{
$update_count = array();
parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);
@@ -242,7 +242,14 @@ class mcp_reports
}
}
- $template->assign_vars(array(
+ // parse signature
+ $parse_flags = ($post_info['user_sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $post_info['user_sig'] = generate_text_for_display($post_info['user_sig'], $post_info['user_sig_bbcode_uid'], $post_info['user_sig_bbcode_bitfield'], $parse_flags, true);
+
+ $topic_id = (int) $post_info['topic_id'];
+
+ // So it can be sent through the event below.
+ $report_template = array(
'S_MCP_REPORT' => true,
'S_CLOSE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']),
@@ -291,9 +298,36 @@ class mcp_reports
'POST_IP' => $post_info['poster_ip'],
'POST_IPADDR' => ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
'POST_ID' => $post_info['post_id'],
+ 'SIGNATURE' => $post_info['user_sig'],
'U_LOOKUP_IP' => ($auth->acl_get('m_info', $post_info['forum_id'])) ? $this->u_action . '&amp;r=' . $report_id . '&amp;p=' . $post_id . '&amp;f=' . $forum_id . '&amp;lookup=' . $post_info['poster_ip'] . '#ip' : '',
- ));
+ );
+
+ /**
+ * Event to add/modify MCP report details template data.
+ *
+ * @event core.mcp_report_template_data
+ * @var int forum_id The forum_id, the number in the f GET parameter
+ * @var int topic_id The topic_id of the report being viewed
+ * @var int post_id The post_id of the report being viewed (if 0, it is meaningless)
+ * @var int report_id The report_id of the report being viewed
+ * @var array report Array with the report data
+ * @var array report_template Array with the report template data
+ * @var array post_info Array with the reported post data
+ * @since 3.2.5-RC1
+ */
+ $vars = array(
+ 'forum_id',
+ 'topic_id',
+ 'post_id',
+ 'report_id',
+ 'report',
+ 'report_template',
+ 'post_info',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.mcp_report_template_data', compact($vars)));
+
+ $template->assign_vars($report_template);
$this->tpl_name = 'mcp_post';
@@ -321,7 +355,7 @@ class mcp_reports
{
$topic_info = phpbb_get_topic_data(array($topic_id));
- if (!sizeof($topic_info))
+ if (!count($topic_info))
{
trigger_error('TOPIC_NOT_EXIST');
}
@@ -346,7 +380,7 @@ class mcp_reports
$forum_list[] = $row['forum_id'];
}
- if (!sizeof($forum_list))
+ if (!count($forum_list))
{
trigger_error('NOT_MODERATOR');
}
@@ -362,7 +396,7 @@ class mcp_reports
{
$forum_info = phpbb_get_forum_data(array($forum_id), 'm_report');
- if (!sizeof($forum_info))
+ if (!count($forum_info))
{
trigger_error('NOT_MODERATOR');
}
@@ -443,7 +477,7 @@ class mcp_reports
}
$db->sql_freeresult($result);
- if (sizeof($report_ids))
+ if (count($report_ids))
{
$sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, p.post_attachment, u.username, u.username_clean, u.user_colour, r.user_id as reporter_id, ru.username as reporter_name, ru.user_colour as reporter_colour, r.report_time, r.report_id
FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u, ' . USERS_TABLE . ' ru
@@ -617,12 +651,12 @@ function close_report($report_id_list, $mode, $action, $pm = false)
}
$db->sql_freeresult($result);
- if (sizeof($reports))
+ if (count($reports))
{
$close_report_posts = array_unique($close_report_posts);
$close_report_topics = array_unique($close_report_topics);
- if (!$pm && sizeof($close_report_posts))
+ if (!$pm && count($close_report_posts))
{
// Get a list of topics that still contain reported posts
$sql = 'SELECT DISTINCT topic_id
@@ -658,7 +692,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
}
$db->sql_query($sql);
- if (sizeof($close_report_posts))
+ if (count($close_report_posts))
{
if ($pm)
{
@@ -679,7 +713,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
WHERE ' . $db->sql_in_set('post_id', $close_report_posts);
$db->sql_query($sql);
- if (sizeof($close_report_topics))
+ if (count($close_report_topics))
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_reported = 0
@@ -721,7 +755,7 @@ function close_report($report_id_list, $mode, $action, $pm = false)
}
// Notify reporters
- if (sizeof($notify_reporters))
+ if (count($notify_reporters))
{
foreach ($notify_reporters as $report_id => $reporter)
{
@@ -761,11 +795,11 @@ function close_report($report_id_list, $mode, $action, $pm = false)
unset($notify_reporters, $post_info, $reports);
- $success_msg = (sizeof($report_id_list) == 1) ? "{$pm_prefix}REPORT_" . strtoupper($action) . 'D_SUCCESS' : "{$pm_prefix}REPORTS_" . strtoupper($action) . 'D_SUCCESS';
+ $success_msg = (count($report_id_list) == 1) ? "{$pm_prefix}REPORT_" . strtoupper($action) . 'D_SUCCESS' : "{$pm_prefix}REPORTS_" . strtoupper($action) . 'D_SUCCESS';
}
else
{
- confirm_box(false, $user->lang[strtoupper($action) . "_{$pm_prefix}REPORT" . ((sizeof($report_id_list) == 1) ? '' : 'S') . '_CONFIRM'], $s_hidden_fields);
+ confirm_box(false, $user->lang[strtoupper($action) . "_{$pm_prefix}REPORT" . ((count($report_id_list) == 1) ? '' : 'S') . '_CONFIRM'], $s_hidden_fields);
}
$redirect = $request->variable('redirect', "index.$phpEx");
@@ -784,12 +818,12 @@ function close_report($report_id_list, $mode, $action, $pm = false)
if (!$pm)
{
- if (sizeof($forum_ids) === 1)
+ if (count($forum_ids) === 1)
{
$return_forum = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . current($forum_ids)) . '">', '</a>') . '<br /><br />';
}
- if (sizeof($topic_ids) === 1)
+ if (count($topic_ids) === 1)
{
$return_topic = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . current($topic_ids) . '&amp;f=' . current($forum_ids)) . '">', '</a>') . '<br /><br />';
}
diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php
index 76df5b3a5e..83ad56f3e4 100644
--- a/phpBB/includes/mcp/mcp_topic.php
+++ b/phpBB/includes/mcp/mcp_topic.php
@@ -36,7 +36,7 @@ function mcp_topic_view($id, $mode, $action)
$topic_id = $request->variable('t', 0);
$topic_info = phpbb_get_topic_data(array($topic_id), false, true);
- if (!sizeof($topic_info))
+ if (!count($topic_info))
{
trigger_error('TOPIC_NOT_EXIST');
}
@@ -93,11 +93,15 @@ function mcp_topic_view($id, $mode, $action)
// Restore or pprove posts?
if (($action == 'restore' || $action == 'approve') && $auth->acl_get('m_approve', $topic_info['forum_id']))
{
- include($phpbb_root_path . 'includes/mcp/mcp_queue.' . $phpEx);
+ if (!class_exists('mcp_queue'))
+ {
+ include($phpbb_root_path . 'includes/mcp/mcp_queue.' . $phpEx);
+ }
+
include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
- if (!sizeof($post_id_list))
+ if (!count($post_id_list))
{
trigger_error('NO_POST_SELECTED');
}
@@ -138,14 +142,36 @@ function mcp_topic_view($id, $mode, $action)
}
$start = $pagination->validate_start($start, $posts_per_page, $total);
- $sql = 'SELECT u.username, u.username_clean, u.user_colour, p.*
- FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
- WHERE ' . (($action == 'reports') ? 'p.post_reported = 1 AND ' : '') . '
+ $sql_where = (($action == 'reports') ? 'p.post_reported = 1 AND ' : '') . '
p.topic_id = ' . $topic_id . '
AND ' . $phpbb_content_visibility->get_visibility_sql('post', $topic_info['forum_id'], 'p.') . '
AND p.poster_id = u.user_id ' .
- $limit_time_sql . '
- ORDER BY ' . $sort_order_sql;
+ $limit_time_sql;
+
+ $sql_ary = array(
+ 'SELECT' => 'u.username, u.username_clean, u.user_colour, p.*',
+ 'FROM' => array(
+ POSTS_TABLE => 'p',
+ USERS_TABLE => 'u'
+ ),
+ 'LEFT_JOIN' => array(),
+ 'WHERE' => $sql_where,
+ 'ORDER_BY' => $sort_order_sql,
+ );
+
+ /**
+ * Event to modify the SQL query before the MCP topic review posts is queried
+ *
+ * @event core.mcp_topic_modify_sql_ary
+ * @var array sql_ary The SQL array to get the data of the MCP topic review posts
+ * @since 3.2.8-RC1
+ */
+ $vars = array('sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.mcp_topic_modify_sql_ary', compact($vars)));
+
+ $sql = $db->sql_build_query('SELECT', $sql_ary);
+ unset($sql_ary);
+
$result = $db->sql_query_limit($sql, $posts_per_page, $start);
$rowset = $post_id_list = array();
@@ -172,7 +198,7 @@ function mcp_topic_view($id, $mode, $action)
// Grab extensions
$attachments = array();
- if ($topic_info['topic_attachment'] && sizeof($post_id_list))
+ if ($topic_info['topic_attachment'] && count($post_id_list))
{
// Get attachments...
if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $topic_info['forum_id']))
@@ -326,7 +352,7 @@ function mcp_topic_view($id, $mode, $action)
{
$to_topic_info = phpbb_get_topic_data(array($to_topic_id), 'm_merge');
- if (!sizeof($to_topic_info))
+ if (!count($to_topic_info))
{
$to_topic_id = 0;
}
@@ -408,7 +434,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
$forum_id = $request->variable('forum_id', 0);
$start = $request->variable('start', 0);
- if (!sizeof($post_id_list))
+ if (!count($post_id_list))
{
$template->assign_var('MESSAGE', $user->lang['NO_POST_SELECTED']);
return;
@@ -422,7 +448,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
$post_id = $post_id_list[0];
$post_info = phpbb_get_post_data(array($post_id));
- if (!sizeof($post_info))
+ if (!count($post_info))
{
$template->assign_var('MESSAGE', $user->lang['NO_POST_SELECTED']);
return;
@@ -446,7 +472,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
$forum_info = phpbb_get_forum_data(array($to_forum_id), 'f_post');
- if (!sizeof($forum_info))
+ if (!count($forum_info))
{
$template->assign_var('MESSAGE', $user->lang['USER_CANNOT_POST']);
return;
@@ -530,7 +556,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
$db->sql_freeresult($result);
}
- if (!sizeof($post_id_list))
+ if (!count($post_id_list))
{
trigger_error('NO_POST_SELECTED');
}
@@ -628,7 +654,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
}
$db->sql_freeresult($result);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(TOPICS_WATCH_TABLE, $sql_ary);
}
@@ -649,7 +675,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
}
$db->sql_freeresult($result);
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$db->sql_multi_insert(BOOKMARKS_TABLE, $sql_ary);
}
@@ -690,7 +716,7 @@ function merge_posts($topic_id, $to_topic_id)
$topic_data = phpbb_get_topic_data($sync_topics, 'm_merge');
- if (!sizeof($topic_data) || empty($topic_data[$to_topic_id]))
+ if (!count($topic_data) || empty($topic_data[$to_topic_id]))
{
$template->assign_var('MESSAGE', $user->lang['NO_FINAL_TOPIC_SELECTED']);
return;
@@ -707,7 +733,7 @@ function merge_posts($topic_id, $to_topic_id)
$post_id_list = $request->variable('post_id_list', array(0));
$start = $request->variable('start', 0);
- if (!sizeof($post_id_list))
+ if (!count($post_id_list))
{
$template->assign_var('MESSAGE', $user->lang['NO_POST_SELECTED']);
return;
diff --git a/phpBB/includes/mcp/mcp_warn.php b/phpBB/includes/mcp/mcp_warn.php
index 0e80372f43..df175133fc 100644
--- a/phpBB/includes/mcp/mcp_warn.php
+++ b/phpBB/includes/mcp/mcp_warn.php
@@ -28,9 +28,9 @@ class mcp_warn
var $p_master;
var $u_action;
- function mcp_warn(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php
index 45f00c9ee1..0b79cca864 100644
--- a/phpBB/includes/message_parser.php
+++ b/phpBB/includes/message_parser.php
@@ -705,10 +705,10 @@ class bbcode_firstpass extends bbcode
if ($tok == ']')
{
// if $tok is ']' the buffer holds a tag
- if (strtolower($buffer) == '/list' && sizeof($list_end_tags))
+ if (strtolower($buffer) == '/list' && count($list_end_tags))
{
// valid [/list] tag, check nesting so that we don't hit false positives
- if (sizeof($item_end_tags) && sizeof($item_end_tags) >= sizeof($list_end_tags))
+ if (count($item_end_tags) && count($item_end_tags) >= count($list_end_tags))
{
// current li tag has not been closed
$out = preg_replace('/\n?\[$/', '[', $out) . array_pop($item_end_tags) . '][';
@@ -733,10 +733,10 @@ class bbcode_firstpass extends bbcode
}
else
{
- if (($buffer == '*' || substr($buffer, -2) == '[*') && sizeof($list_end_tags))
+ if (($buffer == '*' || substr($buffer, -2) == '[*') && count($list_end_tags))
{
// the buffer holds a bullet tag and we have a [list] tag open
- if (sizeof($item_end_tags) >= sizeof($list_end_tags))
+ if (count($item_end_tags) >= count($list_end_tags))
{
if (substr($buffer, -2) == '[*')
{
@@ -780,11 +780,11 @@ class bbcode_firstpass extends bbcode
while ($in);
// do we have some tags open? close them now
- if (sizeof($item_end_tags))
+ if (count($item_end_tags))
{
$out .= '[' . implode('][', $item_end_tags) . ']';
}
- if (sizeof($list_end_tags))
+ if (count($list_end_tags))
{
$out .= '[' . implode('][', $list_end_tags) . ']';
}
@@ -835,7 +835,7 @@ class bbcode_firstpass extends bbcode
if ($tok == ']')
{
- if (strtolower($buffer) == '/quote' && sizeof($close_tags) && substr($out, -1, 1) == '[')
+ if (strtolower($buffer) == '/quote' && count($close_tags) && substr($out, -1, 1) == '[')
{
// we have found a closing tag
$out .= array_pop($close_tags) . ']';
@@ -949,7 +949,7 @@ class bbcode_firstpass extends bbcode
$out .= $buffer;
- if (sizeof($close_tags))
+ if (count($close_tags))
{
$out .= '[' . implode('][', $close_tags) . ']';
}
@@ -1139,7 +1139,7 @@ class parse_message extends bbcode_firstpass
/**
* Init - give message here or manually
*/
- function parse_message($message = '')
+ function __construct($message = '')
{
// Init BBCode UID
$this->bbcode_uid = substr(base_convert(unique_id(), 16, 36), 0, BBCODE_UID_LEN);
@@ -1500,7 +1500,7 @@ class parse_message extends bbcode_firstpass
$db->sql_freeresult($result);
}
- if (sizeof($match))
+ if (count($match))
{
if ($max_smilies)
{
@@ -1534,7 +1534,7 @@ class parse_message extends bbcode_firstpass
$error = array();
- $num_attachments = sizeof($this->attachment_data);
+ $num_attachments = count($this->attachment_data);
$this->filename_data['filecomment'] = $request->variable('filecomment', '', true);
$upload = $request->file($form_name);
$upload_file = (!empty($upload) && $upload['name'] !== 'none' && trim($upload['name']));
@@ -1571,7 +1571,7 @@ class parse_message extends bbcode_firstpass
$filedata = $attachment_manager->upload($form_name, $forum_id, false, '', $is_message);
$error = $filedata['error'];
- if ($filedata['post_attach'] && !sizeof($error))
+ if ($filedata['post_attach'] && !count($error))
{
$sql_ary = array(
'physical_filename' => $filedata['physical_filename'],
@@ -1587,6 +1587,16 @@ class parse_message extends bbcode_firstpass
'poster_id' => $user->data['user_id'],
);
+ /**
+ * Modify attachment sql array on submit
+ *
+ * @event core.modify_attachment_sql_ary_on_submit
+ * @var array sql_ary Array containing SQL data
+ * @since 3.2.6-RC1
+ */
+ $vars = array('sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.modify_attachment_sql_ary_on_submit', compact($vars)));
+
$db->sql_query('INSERT INTO ' . ATTACHMENTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
$new_entry = array(
@@ -1635,7 +1645,7 @@ class parse_message extends bbcode_firstpass
}
}
- if ($preview || $refresh || sizeof($error))
+ if ($preview || $refresh || count($error))
{
if (isset($this->plupload) && $this->plupload->is_active())
{
@@ -1706,7 +1716,7 @@ class parse_message extends bbcode_firstpass
$filedata = $attachment_manager->upload($form_name, $forum_id, false, '', $is_message);
$error = array_merge($error, $filedata['error']);
- if (!sizeof($error))
+ if (!count($error))
{
$sql_ary = array(
'physical_filename' => $filedata['physical_filename'],
@@ -1722,6 +1732,16 @@ class parse_message extends bbcode_firstpass
'poster_id' => $user->data['user_id'],
);
+ /**
+ * Modify attachment sql array on upload
+ *
+ * @event core.modify_attachment_sql_ary_on_upload
+ * @var array sql_ary Array containing SQL data
+ * @since 3.2.6-RC1
+ */
+ $vars = array('sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.modify_attachment_sql_ary_on_upload', compact($vars)));
+
$db->sql_query('INSERT INTO ' . ATTACHMENTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
$new_entry = array(
@@ -1802,7 +1822,7 @@ class parse_message extends bbcode_firstpass
$check_user_id = ($check_user_id === false) ? $user->data['user_id'] : $check_user_id;
- if (!sizeof($attachment_data))
+ if (!count($attachment_data))
{
return;
}
@@ -1822,7 +1842,7 @@ class parse_message extends bbcode_firstpass
}
// Regenerate already posted attachments
- if (sizeof($not_orphan))
+ if (count($not_orphan))
{
// Get the attachment data, based on the poster id...
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment, filesize
@@ -1842,13 +1862,13 @@ class parse_message extends bbcode_firstpass
$db->sql_freeresult($result);
}
- if (sizeof($not_orphan))
+ if (count($not_orphan))
{
trigger_error('NO_ACCESS_ATTACHMENT', E_USER_ERROR);
}
// Regenerate newly uploaded attachments
- if (sizeof($orphan))
+ if (count($orphan))
{
$sql = 'SELECT attach_id, is_orphan, real_filename, attach_comment, filesize
FROM ' . ATTACHMENTS_TABLE . '
@@ -1868,7 +1888,7 @@ class parse_message extends bbcode_firstpass
$db->sql_freeresult($result);
}
- if (sizeof($orphan))
+ if (count($orphan))
{
trigger_error('NO_ACCESS_ATTACHMENT', E_USER_ERROR);
}
@@ -1889,7 +1909,7 @@ class parse_message extends bbcode_firstpass
$tmp_message = $this->message;
$poll['poll_options'] = preg_split('/\s*?\n\s*/', trim($poll['poll_option_text']));
- $poll['poll_options_size'] = sizeof($poll['poll_options']);
+ $poll['poll_options_size'] = count($poll['poll_options']);
foreach ($poll['poll_options'] as &$poll_option)
{
@@ -1918,7 +1938,7 @@ class parse_message extends bbcode_firstpass
}
}
- if (sizeof($poll['poll_options']) == 1)
+ if (count($poll['poll_options']) == 1)
{
$this->warn_msg[] = $user->lang['TOO_FEW_POLL_OPTIONS'];
}
diff --git a/phpBB/includes/questionnaire/questionnaire.php b/phpBB/includes/questionnaire/questionnaire.php
index 9699843db4..2f80582918 100644
--- a/phpBB/includes/questionnaire/questionnaire.php
+++ b/phpBB/includes/questionnaire/questionnaire.php
@@ -40,7 +40,7 @@ class phpbb_questionnaire_data_collector
*
* @param string
*/
- function phpbb_questionnaire_data_collector($install_id)
+ function __construct($install_id)
{
$this->install_id = $install_id;
$this->providers = array();
@@ -223,7 +223,7 @@ class phpbb_questionnaire_phpbb_data_provider
*
* @param array $config
*/
- function phpbb_questionnaire_phpbb_data_provider($config)
+ function __construct($config)
{
// generate a unique id if necessary
if (empty($config['questionnaire_unique_id']))
@@ -337,7 +337,7 @@ class phpbb_questionnaire_phpbb_data_provider
'edit_time' => true,
'email_check_mx' => true,
'email_enable' => true,
- 'email_function_name' => true,
+ 'email_force_sender' => true,
'email_package_size' => true,
'enable_confirm' => true,
'enable_pm_icons' => true,
@@ -369,7 +369,6 @@ class phpbb_questionnaire_phpbb_data_provider
'hot_threshold' => true,
'img_create_thumbnail' => true,
'img_display_inlined' => true,
- 'img_imagick' => true,
'img_link_height' => true,
'img_link_width' => true,
'img_max_height' => true,
diff --git a/phpBB/includes/sphinxapi.php b/phpBB/includes/sphinxapi.php
index 5e1f131ac2..b63a85a90f 100644
--- a/phpBB/includes/sphinxapi.php
+++ b/phpBB/includes/sphinxapi.php
@@ -126,7 +126,7 @@ define ( "SPH_GROUPBY_ATTRPAIR", 5 );
function sphPackI64 ( $v )
{
assert ( is_numeric($v) );
-
+
// x64
if ( PHP_INT_SIZE>=8 )
{
@@ -138,7 +138,7 @@ function sphPackI64 ( $v )
if ( is_int($v) )
return pack ( "NN", $v < 0 ? -1 : 0, $v );
- // x32, bcmath
+ // x32, bcmath
if ( function_exists("bcmul") )
{
if ( bccomp ( $v, 0 ) == -1 )
@@ -175,16 +175,16 @@ function sphPackI64 ( $v )
function sphPackU64 ( $v )
{
assert ( is_numeric($v) );
-
+
// x64
if ( PHP_INT_SIZE>=8 )
{
assert ( $v>=0 );
-
+
// x64, int
if ( is_int($v) )
return pack ( "NN", $v>>32, $v&0xFFFFFFFF );
-
+
// x64, bcmath
if ( function_exists("bcmul") )
{
@@ -192,12 +192,12 @@ function sphPackU64 ( $v )
$l = bcmod ( $v, 4294967296 );
return pack ( "NN", $h, $l );
}
-
+
// x64, no-bcmath
$p = max ( 0, strlen($v) - 13 );
$lo = (int)substr ( $v, $p );
$hi = (int)substr ( $v, 0, $p );
-
+
$m = $lo + $hi*1316134912;
$l = $m % 4294967296;
$h = $hi*2328 + (int)($m/4294967296);
@@ -208,7 +208,7 @@ function sphPackU64 ( $v )
// x32, int
if ( is_int($v) )
return pack ( "NN", 0, $v );
-
+
// x32, bcmath
if ( function_exists("bcmul") )
{
@@ -221,7 +221,7 @@ function sphPackU64 ( $v )
$p = max(0, strlen($v) - 13);
$lo = (float)substr($v, $p);
$hi = (float)substr($v, 0, $p);
-
+
$m = $lo + $hi*1316134912.0;
$q = floor($m / 4294967296.0);
$l = $m - ($q * 4294967296.0);
@@ -277,11 +277,11 @@ function sphUnpackU64 ( $v )
// x32, bcmath
if ( function_exists("bcmul") )
return bcadd ( $lo, bcmul ( $hi, "4294967296" ) );
-
+
// x32, no-bcmath
$hi = (float)$hi;
$lo = (float)$lo;
-
+
$q = floor($hi/10000000.0);
$r = $hi - $q*10000000.0;
$m = $lo + $r*4967296.0;
@@ -324,7 +324,7 @@ function sphUnpackI64 ( $v )
return $lo;
return sprintf ( "%.0f", $lo - 4294967296.0 );
}
-
+
$neg = "";
$c = 0;
if ( $hi<0 )
@@ -333,7 +333,7 @@ function sphUnpackI64 ( $v )
$lo = ~$lo;
$c = 1;
$neg = "-";
- }
+ }
$hi = sprintf ( "%u", $hi );
$lo = sprintf ( "%u", $lo );
@@ -345,7 +345,7 @@ function sphUnpackI64 ( $v )
// x32, no-bcmath
$hi = (float)$hi;
$lo = (float)$lo;
-
+
$q = floor($hi/10000000.0);
$r = $hi - $q*10000000.0;
$m = $lo + $r*4967296.0;
@@ -427,7 +427,7 @@ class SphinxClient
/////////////////////////////////////////////////////////////////////////////
/// create a new client object and fill defaults
- function SphinxClient ()
+ function __construct ()
{
// per-client-object settings
$this->_host = "localhost";
@@ -510,7 +510,7 @@ class SphinxClient
$this->_path = $host;
return;
}
-
+
assert ( is_int($port) );
$this->_host = $host;
$this->_port = $port;
@@ -590,14 +590,14 @@ class SphinxClient
$fp = @fsockopen ( $host, $port, $errno, $errstr );
else
$fp = @fsockopen ( $host, $port, $errno, $errstr, $this->_timeout );
-
+
if ( !$fp )
{
if ( $this->_path )
$location = $this->_path;
else
$location = "{$this->_host}:{$this->_port}";
-
+
$errstr = trim ( $errstr );
$this->_error = "connection to $location failed (errno=$errno, msg=$errstr)";
$this->_connerror = true;
@@ -1236,7 +1236,7 @@ class SphinxClient
if ( $type==SPH_ATTR_FLOAT )
{
list(,$uval) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
- list(,$fval) = unpack ( "f*", pack ( "L", $uval ) );
+ list(,$fval) = unpack ( "f*", pack ( "L", $uval ) );
$attrvals[$attr] = $fval;
continue;
}
@@ -1264,7 +1264,7 @@ class SphinxClient
} else if ( $type==SPH_ATTR_STRING )
{
$attrvals[$attr] = substr ( $response, $p, $val );
- $p += $val;
+ $p += $val;
} else
{
$attrvals[$attr] = sphFixUint($val);
@@ -1345,7 +1345,7 @@ class SphinxClient
if ( !isset($opts["passage_boundary"]) ) $opts["passage_boundary"] = "none";
if ( !isset($opts["emit_zones"]) ) $opts["emit_zones"] = false;
if ( !isset($opts["load_files_scattered"]) ) $opts["load_files_scattered"] = false;
-
+
/////////////////
// build request
@@ -1634,7 +1634,7 @@ class SphinxClient
fclose ( $this->_socket );
$this->_socket = false;
-
+
return true;
}
diff --git a/phpBB/includes/ucp/ucp_activate.php b/phpBB/includes/ucp/ucp_activate.php
index 1e54c18dc1..7a90f2e3b1 100644
--- a/phpBB/includes/ucp/ucp_activate.php
+++ b/phpBB/includes/ucp/ucp_activate.php
@@ -87,6 +87,8 @@ class ucp_activate
WHERE user_id = ' . $user_row['user_id'];
$db->sql_query($sql);
+ $user->reset_login_keys($user_row['user_id']);
+
$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array(
'reportee_id' => $user_row['user_id'],
$user_row['username']
diff --git a/phpBB/includes/ucp/ucp_attachments.php b/phpBB/includes/ucp/ucp_attachments.php
index 66c3109b3d..7808fed325 100644
--- a/phpBB/includes/ucp/ucp_attachments.php
+++ b/phpBB/includes/ucp/ucp_attachments.php
@@ -29,7 +29,7 @@ class ucp_attachments
function main($id, $mode)
{
- global $template, $user, $db, $config, $phpEx, $phpbb_root_path, $phpbb_container, $request;
+ global $template, $user, $db, $config, $phpEx, $phpbb_root_path, $phpbb_container, $request, $auth;
$start = $request->variable('start', 0);
$sort_key = $request->variable('sk', 'a');
@@ -38,25 +38,36 @@ class ucp_attachments
$delete = (isset($_POST['delete'])) ? true : false;
$delete_ids = array_keys($request->variable('attachment', array(0)));
- if ($delete && sizeof($delete_ids))
+ if ($delete && count($delete_ids))
{
// Validate $delete_ids...
- $sql = 'SELECT attach_id
- FROM ' . ATTACHMENTS_TABLE . '
- WHERE poster_id = ' . $user->data['user_id'] . '
- AND is_orphan = 0
- AND ' . $db->sql_in_set('attach_id', $delete_ids);
+ $sql = 'SELECT a.attach_id, p.post_edit_locked, t.topic_status, f.forum_id, f.forum_status
+ FROM ' . ATTACHMENTS_TABLE . ' a
+ LEFT JOIN ' . POSTS_TABLE . ' p
+ ON (a.post_msg_id = p.post_id AND a.in_message = 0)
+ LEFT JOIN ' . TOPICS_TABLE . ' t
+ ON (t.topic_id = p.topic_id AND a.in_message = 0)
+ LEFT JOIN ' . FORUMS_TABLE . ' f
+ ON (f.forum_id = t.forum_id AND a.in_message = 0)
+ WHERE a.poster_id = ' . $user->data['user_id'] . '
+ AND a.is_orphan = 0
+ AND ' . $db->sql_in_set('a.attach_id', $delete_ids);
$result = $db->sql_query($sql);
$delete_ids = array();
while ($row = $db->sql_fetchrow($result))
{
+ if (!$auth->acl_get('m_edit', $row['forum_id']) && ($row['forum_status'] == ITEM_LOCKED || $row['topic_status'] == ITEM_LOCKED || $row['post_edit_locked']))
+ {
+ continue;
+ }
+
$delete_ids[] = $row['attach_id'];
}
$db->sql_freeresult($result);
}
- if ($delete && sizeof($delete_ids))
+ if ($delete && count($delete_ids))
{
$s_hidden_fields = array(
'delete' => 1
@@ -75,12 +86,12 @@ class ucp_attachments
unset($attachment_manager);
meta_refresh(3, $this->u_action);
- $message = ((sizeof($delete_ids) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED']) . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+ $message = ((count($delete_ids) == 1) ? $user->lang['ATTACHMENT_DELETED'] : $user->lang['ATTACHMENTS_DELETED']) . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
trigger_error($message);
}
else
{
- confirm_box(false, (sizeof($delete_ids) == 1) ? 'DELETE_ATTACHMENT' : 'DELETE_ATTACHMENTS', build_hidden_fields($s_hidden_fields));
+ confirm_box(false, (count($delete_ids) == 1) ? 'DELETE_ATTACHMENT' : 'DELETE_ATTACHMENTS', build_hidden_fields($s_hidden_fields));
}
}
@@ -124,10 +135,12 @@ class ucp_attachments
$pagination = $phpbb_container->get('pagination');
$start = $pagination->validate_start($start, $config['topics_per_page'], $num_attachments);
- $sql = 'SELECT a.*, t.topic_title, p.message_subject as message_title
+ $sql = 'SELECT a.*, t.topic_title, pr.message_subject as message_title, p.post_edit_locked, t.topic_status, f.forum_id, f.forum_status
FROM ' . ATTACHMENTS_TABLE . ' a
+ LEFT JOIN ' . POSTS_TABLE . ' p ON (a.post_msg_id = p.post_id AND a.in_message = 0)
LEFT JOIN ' . TOPICS_TABLE . ' t ON (a.topic_id = t.topic_id AND a.in_message = 0)
- LEFT JOIN ' . PRIVMSGS_TABLE . ' p ON (a.post_msg_id = p.msg_id AND a.in_message = 1)
+ LEFT JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = t.forum_id AND a.in_message = 0)
+ LEFT JOIN ' . PRIVMSGS_TABLE . ' pr ON (a.post_msg_id = pr.msg_id AND a.in_message = 1)
WHERE a.poster_id = ' . $user->data['user_id'] . "
AND a.is_orphan = 0
ORDER BY $order_by";
@@ -164,6 +177,7 @@ class ucp_attachments
'TOPIC_ID' => $row['topic_id'],
'S_IN_MESSAGE' => $row['in_message'],
+ 'S_LOCKED' => !$row['in_message'] && !$auth->acl_get('m_edit', $row['forum_id']) && ($row['forum_status'] == ITEM_LOCKED || $row['topic_status'] == ITEM_LOCKED || $row['post_edit_locked']),
'U_VIEW_ATTACHMENT' => append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $row['attach_id']),
'U_VIEW_TOPIC' => $view_topic)
diff --git a/phpBB/includes/ucp/ucp_auth_link.php b/phpBB/includes/ucp/ucp_auth_link.php
index 08aacdef3a..e069f15eb2 100644
--- a/phpBB/includes/ucp/ucp_auth_link.php
+++ b/phpBB/includes/ucp/ucp_auth_link.php
@@ -55,14 +55,14 @@ class ucp_auth_link
$submit = $request->variable('submit', false, false, \phpbb\request\request_interface::POST);
// This path is only for primary actions
- if (!sizeof($error) && $submit)
+ if (!count($error) && $submit)
{
if (!check_form_key('ucp_auth_link'))
{
$error[] = 'FORM_INVALID';
}
- if (!sizeof($error))
+ if (!count($error))
{
// Any post data could be necessary for auth (un)linking
$link_data = $request->get_super_global(\phpbb\request\request_interface::POST);
diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php
index 352b7d1ec3..2423af86be 100644
--- a/phpBB/includes/ucp/ucp_groups.php
+++ b/phpBB/includes/ucp/ucp_groups.php
@@ -32,6 +32,9 @@ class ucp_groups
global $db, $user, $auth, $cache, $template;
global $request, $phpbb_container, $phpbb_log;
+ /** @var \phpbb\language\language $language Language object */
+ $language = $phpbb_container->get('language');
+
$user->add_lang('groups');
$return_page = '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '">', '</a>');
@@ -71,7 +74,7 @@ class ucp_groups
}
$db->sql_freeresult($result);
- if (!sizeof($group_row))
+ if (!count($group_row))
{
trigger_error('GROUP_NOT_EXIST');
}
@@ -330,7 +333,7 @@ class ucp_groups
$sql = 'SELECT group_id, group_name, group_colour, group_desc, group_desc_uid, group_desc_bitfield, group_desc_options, group_type, group_founder_manage
FROM ' . GROUPS_TABLE . '
- WHERE ' . ((sizeof($group_id_ary)) ? $db->sql_in_set('group_id', $group_id_ary, true) . ' AND ' : '') . "
+ WHERE ' . ((count($group_id_ary)) ? $db->sql_in_set('group_id', $group_id_ary, true) . ' AND ' : '') . "
group_type $sql_and
ORDER BY group_type DESC, group_name";
$result = $db->sql_query($sql);
@@ -396,7 +399,10 @@ class ucp_groups
$action = (isset($_POST['addusers'])) ? 'addusers' : $request->variable('action', '');
$group_id = $request->variable('g', 0);
- include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ if (!function_exists('phpbb_get_user_rank'))
+ {
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
add_form_key('ucp_groups');
@@ -562,7 +568,7 @@ class ucp_groups
$error = array_merge($error, $colour_error);
}
- if (!sizeof($error))
+ if (!count($error))
{
// Only set the rank, colour, etc. if it's changed or if we're adding a new
// group. This prevents existing group members being updated if no changes
@@ -605,7 +611,7 @@ class ucp_groups
}
}
- if (sizeof($error))
+ if (count($error))
{
$error = array_map(array(&$user, 'lang'), $error);
$group_rank = $submit_ary['rank'];
@@ -703,12 +709,12 @@ class ucp_groups
'S_EDIT' => true,
'S_INCLUDE_SWATCH' => true,
'S_FORM_ENCTYPE' => ' enctype="multipart/form-data"',
- 'S_ERROR' => (sizeof($error)) ? true : false,
+ 'S_ERROR' => (count($error)) ? true : false,
'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false,
'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
'S_GROUP_MANAGE' => true,
- 'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR_MSG' => (count($error)) ? implode('<br />', $error) : '',
'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
'GROUP_MESSAGE_LIMIT' => (isset($group_row['group_message_limit'])) ? $group_row['group_message_limit'] : 0,
'GROUP_MAX_RECIPIENTS' => (isset($group_row['group_max_recipients'])) ? $group_row['group_max_recipients'] : 0,
@@ -911,7 +917,7 @@ class ucp_groups
if (confirm_box(true))
{
- if (!sizeof($mark_ary))
+ if (!count($mark_ary))
{
$start = 0;
@@ -934,7 +940,7 @@ class ucp_groups
group_user_attributes('default', $group_id, $mark_ary, false, $group_row['group_name'], $group_row);
- $start = (sizeof($mark_ary) < 200) ? 0 : $start + 200;
+ $start = (count($mark_ary) < 200) ? 0 : $start + 200;
}
else
{
@@ -1054,13 +1060,27 @@ class ucp_groups
if (confirm_box(true))
{
+ $return_manage_page = '<br /><br />' . $language->lang('RETURN_PAGE', '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>');
+
// Add user/s to group
if ($error = group_user_add($group_id, false, $name_ary, $group_name, $default, 0, 0, $group_row))
{
- trigger_error($user->lang[$error] . $return_page);
+ $display_message = $language->lang($error);
+
+ if ($error == 'GROUP_USERS_INVALID')
+ {
+ // Find which users don't exist
+ $actual_name_ary = $name_ary;
+ $actual_user_id_ary = [];
+ user_get_id_name($actual_user_id_ary, $actual_name_ary, false, true);
+
+ $display_message = $language->lang('GROUP_USERS_INVALID', implode($language->lang('COMMA_SEPARATOR'), array_udiff($name_ary, $actual_name_ary, 'strcasecmp')));
+ }
+
+ trigger_error($display_message . $return_manage_page);
}
- trigger_error($user->lang['GROUP_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>'));
+ trigger_error($language->lang('GROUP_USERS_ADDED') . $return_manage_page);
}
else
{
@@ -1073,7 +1093,7 @@ class ucp_groups
'action' => $action
);
- confirm_box(false, $user->lang('GROUP_CONFIRM_ADD_USERS', sizeof($name_ary), implode($user->lang['COMMA_SEPARATOR'], $name_ary)), build_hidden_fields($s_hidden_fields));
+ confirm_box(false, $user->lang('GROUP_CONFIRM_ADD_USERS', count($name_ary), implode($user->lang['COMMA_SEPARATOR'], $name_ary)), build_hidden_fields($s_hidden_fields));
}
trigger_error($user->lang['NO_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>'));
diff --git a/phpBB/includes/ucp/ucp_login_link.php b/phpBB/includes/ucp/ucp_login_link.php
index f4d47e30bb..c1f307eeb5 100644
--- a/phpBB/includes/ucp/ucp_login_link.php
+++ b/phpBB/includes/ucp/ucp_login_link.php
@@ -39,7 +39,7 @@ class ucp_login_link
*/
function main($id, $mode)
{
- global $phpbb_container, $request, $template, $user;
+ global $phpbb_container, $request, $template, $user, $phpbb_dispatcher;
global $phpbb_root_path, $phpEx;
// Initialize necessary variables
@@ -108,7 +108,7 @@ class ucp_login_link
}
}
- $template->assign_vars(array(
+ $tpl_ary = array(
// Common template elements
'LOGIN_LINK_ERROR' => $login_link_error,
'PASSWORD_CREDENTIAL' => 'login_password',
@@ -121,7 +121,24 @@ class ucp_login_link
// Login elements
'LOGIN_ERROR' => $login_error,
'LOGIN_USERNAME' => $login_username,
- ));
+ );
+
+ /**
+ * Event to perform additional actions before ucp_login_link is displayed
+ *
+ * @event core.ucp_login_link_template_after
+ * @var array data Login link data
+ * @var \phpbb\auth\provider_interface auth_provider Auth provider
+ * @var string login_link_error Login link error
+ * @var string login_error Login error
+ * @var string login_username Login username
+ * @var array tpl_ary Template variables
+ * @since 3.2.4-RC1
+ */
+ $vars = array('data', 'auth_provider', 'login_link_error', 'login_error', 'login_username', 'tpl_ary');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_login_link_template_after', compact($vars)));
+
+ $template->assign_vars($tpl_ary);
$this->tpl_name = 'ucp_login_link';
$this->page_title = 'UCP_LOGIN_LINK';
diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php
index 77ac1dfb54..36f45f3f46 100644
--- a/phpBB/includes/ucp/ucp_main.php
+++ b/phpBB/includes/ucp/ucp_main.php
@@ -28,9 +28,9 @@ class ucp_main
var $p_master;
var $u_action;
- function ucp_main(&$p_master)
+ function __construct($p_master)
{
- $this->p_master = &$p_master;
+ $this->p_master = $p_master;
}
function main($id, $mode)
@@ -77,6 +77,22 @@ class ucp_main
// If the user can't see any forums, he can't read any posts because fid of 0 is invalid
if (!empty($forum_ary))
{
+ /**
+ * Modify sql variables before query is processed
+ *
+ * @event core.ucp_main_front_modify_sql
+ * @var string sql_select SQL select
+ * @var string sql_from SQL from
+ * @var array forum_ary Forum array
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'sql_select',
+ 'sql_from',
+ 'forum_ary',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.ucp_main_front_modify_sql', compact($vars)));
+
$sql = "SELECT t.* $sql_select
FROM $sql_from
WHERE t.topic_type = " . POST_GLOBAL . '
@@ -144,7 +160,7 @@ class ucp_main
$folder_img .= '_mine';
}
- $template->assign_block_vars('topicrow', array(
+ $topicrow = array(
'FORUM_ID' => $forum_id,
'TOPIC_ID' => $topic_id,
'TOPIC_AUTHOR' => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
@@ -171,8 +187,30 @@ class ucp_main
'U_LAST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;p=" . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'],
'U_LAST_POST_AUTHOR' => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
'U_NEWEST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=unread") . '#unread',
- 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id"))
+ 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id"),
+ );
+
+ /**
+ * Add template variables to a front topics row.
+ *
+ * @event core.ucp_main_front_modify_template_vars
+ * @var array topicrow Array containing the template variables for the row
+ * @var array row Array containing the subscribed forum row data
+ * @var int forum_id Forum ID
+ * @var string folder_img Folder image
+ * @var string folder_alt Alt text for the folder image
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'topicrow',
+ 'row',
+ 'forum_id',
+ 'folder_img',
+ 'folder_alt',
);
+ extract($phpbb_dispatcher->trigger_event('core.ucp_main_front_modify_template_vars', compact($vars)));
+
+ $template->assign_block_vars('topicrow', $topicrow);
}
if ($config['load_user_activity'])
@@ -207,7 +245,10 @@ class ucp_main
case 'subscribed':
- include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ if (!function_exists('topic_status'))
+ {
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
$user->add_lang('viewforum');
@@ -230,10 +271,10 @@ class ucp_main
$forums = array_keys($request->variable('f', array(0 => 0)));
$topics = array_keys($request->variable('t', array(0 => 0)));
- if (sizeof($forums) || sizeof($topics))
+ if (count($forums) || count($topics))
{
$l_unwatch = '';
- if (sizeof($forums))
+ if (count($forums))
{
$sql = 'DELETE FROM ' . FORUMS_WATCH_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forums) . '
@@ -243,7 +284,7 @@ class ucp_main
$l_unwatch .= '_FORUMS';
}
- if (sizeof($topics))
+ if (count($topics))
{
$sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . '
WHERE ' . $db->sql_in_set('topic_id', $topics) . '
@@ -443,7 +484,10 @@ class ucp_main
break;
}
- include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ if (!function_exists('topic_status'))
+ {
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
$user->add_lang('viewforum');
@@ -453,7 +497,7 @@ class ucp_main
$topics = (isset($_POST['t'])) ? array_keys($request->variable('t', array(0 => 0))) : array();
$url = $this->u_action;
- if (!sizeof($topics))
+ if (!count($topics))
{
trigger_error('NO_BOOKMARKS_SELECTED');
}
@@ -502,13 +546,16 @@ class ucp_main
$draft_subject = $draft_message = '';
add_form_key('ucp_draft');
+ include_once($phpbb_root_path . 'includes/message_parser.' . $phpEx);
+ $message_parser = new parse_message();
+
if ($delete)
{
if (check_form_key('ucp_draft'))
{
$drafts = array_keys($request->variable('d', array(0 => 0)));
- if (sizeof($drafts))
+ if (count($drafts))
{
$sql = 'DELETE FROM ' . DRAFTS_TABLE . '
WHERE ' . $db->sql_in_set('draft_id', $drafts) . '
@@ -535,9 +582,19 @@ class ucp_main
{
if ($draft_message && $draft_subject)
{
+ // $auth->acl_gets can't be used here because it will check for global forum permissions in this case
+ // In general we don't need too harsh checking here for permissions, as this will be handled later when submitting
+ $bbcode_status = $auth->acl_get('u_pm_bbcode') || $auth->acl_getf_global('f_bbcode');
+ $smilies_status = $auth->acl_get('u_pm_smilies') || $auth->acl_getf_global('f_smilies');
+ $img_status = $auth->acl_get('u_pm_img') || $auth->acl_getf_global('f_img');
+ $flash_status = $auth->acl_get('u_pm_flash') || $auth->acl_getf_global('f_flash');
+
+ $message_parser->message = $draft_message;
+ $message_parser->parse($bbcode_status, $config['allow_post_links'], $smilies_status, $img_status, $flash_status, true, $config['allow_post_links']);
+
$draft_row = array(
'draft_subject' => $draft_subject,
- 'draft_message' => $draft_message
+ 'draft_message' => $message_parser->message,
);
$sql = 'UPDATE ' . DRAFTS_TABLE . '
@@ -594,7 +651,7 @@ class ucp_main
}
$db->sql_freeresult($result);
- if (sizeof($topic_ids))
+ if (count($topic_ids))
{
$sql = 'SELECT topic_id, forum_id, topic_title
FROM ' . TOPICS_TABLE . '
@@ -639,9 +696,16 @@ class ucp_main
$insert_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=$id&amp;mode=compose&amp;d=" . $draft['draft_id']);
}
+ if (!$submit)
+ {
+ $message_parser->message = $draft['draft_message'];
+ $message_parser->decode_message();
+ $draft_message = $message_parser->message;
+ }
+
$template_row = array(
'DATE' => $user->format_date($draft['save_time']),
- 'DRAFT_MESSAGE' => ($submit) ? $draft_message : $draft['draft_message'],
+ 'DRAFT_MESSAGE' => $draft_message,
'DRAFT_SUBJECT' => ($submit) ? $draft_subject : $draft['draft_subject'],
'TITLE' => $title,
diff --git a/phpBB/includes/ucp/ucp_notifications.php b/phpBB/includes/ucp/ucp_notifications.php
index 029588bb23..a6d925f95e 100644
--- a/phpBB/includes/ucp/ucp_notifications.php
+++ b/phpBB/includes/ucp/ucp_notifications.php
@@ -205,7 +205,7 @@ class ucp_notifications
}
$template->assign_vars(array(
- strtoupper($block) . '_COLS' => sizeof($notification_methods) + 1,
+ strtoupper($block) . '_COLS' => count($notification_methods) + 1,
));
}
diff --git a/phpBB/includes/ucp/ucp_pm.php b/phpBB/includes/ucp/ucp_pm.php
index d145d66f59..4d02620e89 100644
--- a/phpBB/includes/ucp/ucp_pm.php
+++ b/phpBB/includes/ucp/ucp_pm.php
@@ -82,7 +82,10 @@ class ucp_pm
$mode = 'view';
}
- include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
+ if (!function_exists('get_folder'))
+ {
+ include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
+ }
switch ($mode)
{
@@ -104,7 +107,10 @@ class ucp_pm
break;
}
- include($phpbb_root_path . 'includes/ucp/ucp_pm_compose.' . $phpEx);
+ if (!function_exists('compose_pm'))
+ {
+ include($phpbb_root_path . 'includes/ucp/ucp_pm_compose.' . $phpEx);
+ }
compose_pm($id, $mode, $action, $user_folders);
$tpl_file = 'posting_body';
@@ -114,7 +120,10 @@ class ucp_pm
set_user_message_limit();
get_folder($user->data['user_id']);
- include($phpbb_root_path . 'includes/ucp/ucp_pm_options.' . $phpEx);
+ if (!function_exists('message_options'))
+ {
+ include($phpbb_root_path . 'includes/ucp/ucp_pm_options.' . $phpEx);
+ }
message_options($id, $mode, $global_privmsgs_rules, $global_rule_conditions);
$tpl_file = 'ucp_pm_options';
@@ -125,8 +134,10 @@ class ucp_pm
get_folder($user->data['user_id']);
$this->p_name = 'pm';
- // Call another module... please do not try this at home... Hoochie Coochie Man
- include($phpbb_root_path . 'includes/ucp/ucp_main.' . $phpEx);
+ if (!class_exists('ucp_main'))
+ {
+ include($phpbb_root_path . 'includes/ucp/ucp_main.' . $phpEx);
+ }
$module = new ucp_main($this);
$module->u_action = $this->u_action;
@@ -170,6 +181,12 @@ class ucp_pm
trigger_error('NO_AUTH_READ_MESSAGE');
}
+ if ($view == 'print' && (!$config['print_pm'] || !$auth->acl_get('u_pm_printpm')))
+ {
+ send_status_line(403, 'Forbidden');
+ trigger_error('NO_AUTH_PRINT_MESSAGE');
+ }
+
// Do not allow hold messages to be seen
if ($folder_id == PRIVMSGS_HOLD_BOX)
{
@@ -369,7 +386,10 @@ class ucp_pm
if ($action == 'view_folder')
{
- include($phpbb_root_path . 'includes/ucp/ucp_pm_viewfolder.' . $phpEx);
+ if (!function_exists('view_folder'))
+ {
+ include($phpbb_root_path . 'includes/ucp/ucp_pm_viewfolder.' . $phpEx);
+ }
view_folder($id, $mode, $folder_id, $folder);
$tpl_file = 'ucp_pm_viewfolder';
@@ -387,7 +407,10 @@ class ucp_pm
trigger_error('NO_MESSAGE');
}
- include($phpbb_root_path . 'includes/ucp/ucp_pm_viewmessage.' . $phpEx);
+ if (!function_exists('view_message'))
+ {
+ include($phpbb_root_path . 'includes/ucp/ucp_pm_viewmessage.' . $phpEx);
+ }
view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row);
$tpl_file = ($view == 'print') ? 'ucp_pm_viewmessage_print' : 'ucp_pm_viewmessage';
diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php
index 86cdb090c8..cb45112b01 100644
--- a/phpBB/includes/ucp/ucp_pm_compose.php
+++ b/phpBB/includes/ucp/ucp_pm_compose.php
@@ -33,9 +33,20 @@ function compose_pm($id, $mode, $action, $user_folders = array())
// Needed for handle_message_list_actions()
global $refresh, $submit, $preview;
- include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
- include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
- include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
+ if (!function_exists('generate_smilies'))
+ {
+ include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
+ }
+
+ if (!function_exists('display_custom_bbcodes'))
+ {
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
+
+ if (!class_exists('parse_message'))
+ {
+ include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
+ }
if (!$action)
{
@@ -48,7 +59,6 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$to_group_id = $request->variable('g', 0);
$msg_id = $request->variable('p', 0);
$draft_id = $request->variable('d', 0);
- $lastclick = $request->variable('lastclick', 0);
// Reply to all triggered (quote/reply)
$reply_to_all = $request->variable('reply_to_all', 0);
@@ -80,7 +90,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$group_helper = $phpbb_container->get('group_helper');
// Was cancel pressed? If so then redirect to the appropriate page
- if ($cancel || ($current_time - $lastclick < 2 && $submit))
+ if ($cancel)
{
if ($msg_id)
{
@@ -125,7 +135,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
// Add groups to PM box
if ($config['allow_mass_pm'] && $auth->acl_get('u_masspm_group'))
{
- $sql = 'SELECT g.group_id, g.group_name, g.group_type
+ $sql = 'SELECT g.group_id, g.group_name, g.group_type, g.group_colour
FROM ' . GROUPS_TABLE . ' g';
if (!$auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
@@ -148,7 +158,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$group_options = '';
while ($row = $db->sql_fetchrow($result))
{
- $group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '">' . $group_helper->get_name($row['group_name']) . '</option>';
+ $group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '"' . ($row['group_colour'] ? ' style="color: #' . $row['group_colour'] . '"' : '') . '>' . $group_helper->get_name($row['group_name']) . '</option>';
}
$db->sql_freeresult($result);
}
@@ -406,7 +416,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$quote_username = (isset($post['quote_username'])) ? $post['quote_username'] : '';
$icon_id = (isset($post['icon_id'])) ? $post['icon_id'] : 0;
- if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !sizeof($address_list) && !$refresh && !$submit && !$preview)
+ if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !count($address_list) && !$refresh && !$submit && !$preview)
{
// Add the original author as the recipient if quoting a post or only replying and not having checked "reply to all"
if ($action == 'quotepost' || !$reply_to_all)
@@ -428,7 +438,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
}
}
}
- else if ($action == 'edit' && !sizeof($address_list) && !$refresh && !$submit && !$preview)
+ else if ($action == 'edit' && !count($address_list) && !$refresh && !$submit && !$preview)
{
// Rebuild TO and BCC Header
$address_list = rebuild_header(array('to' => $post['to_address'], 'bcc' => $post['bcc_address']));
@@ -561,7 +571,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
unset($list[$user->data['user_id']]);
}
- $max_recipients = ($max_recipients < sizeof($list)) ? sizeof($list) : $max_recipients;
+ $max_recipients = ($max_recipients < count($list)) ? count($list) : $max_recipients;
unset($list);
}
@@ -584,7 +594,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
}
// Check for too many recipients
- if (!empty($address_list['u']) && $max_recipients && sizeof($address_list['u']) > $max_recipients)
+ if (!empty($address_list['u']) && $max_recipients && count($address_list['u']) > $max_recipients)
{
$address_list = get_recipients($address_list, $max_recipients);
$error[] = $user->lang('TOO_MANY_RECIPIENTS', $max_recipients);
@@ -659,13 +669,16 @@ function compose_pm($id, $mode, $action, $user_folders = array())
{
if (confirm_box(true))
{
+ $message_parser->message = $message;
+ $message_parser->parse($bbcode_status, $url_status, $smilies_status, $img_status, $flash_status, true, $url_status);
+
$sql = 'INSERT INTO ' . DRAFTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
'user_id' => $user->data['user_id'],
'topic_id' => 0,
'forum_id' => 0,
'save_time' => $current_time,
'draft_subject' => $subject,
- 'draft_message' => $message
+ 'draft_message' => $message_parser->message,
)
);
$db->sql_query($sql);
@@ -788,7 +801,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
// Parse Attachments - before checksum is calculated
$message_parser->parse_attachments('fileupload', $action, 0, $submit, $preview, $refresh, true);
- if (sizeof($message_parser->warn_msg) && !($remove_u || $remove_g || $add_to || $add_bcc))
+ if (count($message_parser->warn_msg) && !($remove_u || $remove_g || $add_to || $add_bcc))
{
$error[] = implode('<br />', $message_parser->warn_msg);
$message_parser->warn_msg = array();
@@ -798,7 +811,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$message_parser->parse($enable_bbcode, ($config['allow_post_links']) ? $enable_urls : false, $enable_smilies, $img_status, $flash_status, true, $config['allow_post_links']);
// On a refresh we do not care about message parsing errors
- if (sizeof($message_parser->warn_msg) && !$refresh)
+ if (count($message_parser->warn_msg) && !$refresh)
{
$error[] = implode('<br />', $message_parser->warn_msg);
}
@@ -825,14 +838,14 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
}
- if (!sizeof($address_list))
+ if (!count($address_list))
{
$error[] = $user->lang['NO_RECIPIENT'];
}
}
// Store message, sync counters
- if (!sizeof($error) && $submit)
+ if (!count($error) && $submit)
{
$pm_data = array(
'msg_id' => (int) $msg_id,
@@ -889,7 +902,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
}
// Preview
- if (!sizeof($error) && $preview)
+ if (!count($error) && $preview)
{
$preview_message = $message_parser->format_display($enable_bbcode, $enable_urls, $enable_smilies, false);
@@ -909,7 +922,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
}
// Attachment Preview
- if (sizeof($message_parser->attachment_data))
+ if (count($message_parser->attachment_data))
{
$template->assign_var('S_HAS_ATTACHMENTS', true);
@@ -929,7 +942,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$preview_subject = censor_text($subject);
- if (!sizeof($error))
+ if (!count($error))
{
$template->assign_vars(array(
'PREVIEW_SUBJECT' => $preview_subject,
@@ -943,7 +956,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
}
// Decode text for message display
- $bbcode_uid = (($action == 'quote' || $action == 'forward') && !$preview && !$refresh && (!sizeof($error) || (sizeof($error) && !$submit))) ? $bbcode_uid : $message_parser->bbcode_uid;
+ $bbcode_uid = (($action == 'quote' || $action == 'forward') && !$preview && !$refresh && (!count($error) || (count($error) && !$submit))) ? $bbcode_uid : $message_parser->bbcode_uid;
$message_parser->decode_message($bbcode_uid);
@@ -954,7 +967,16 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$post_id = $request->variable('p', 0);
if ($config['allow_post_links'])
{
- $message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}[/url]\n\n";
+ $message_link = generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}";
+ $message_link_subject = "{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}";
+ if ($bbcode_status)
+ {
+ $message_link = "[url=" . $message_link . "]" . $message_link_subject . "[/url]\n\n";
+ }
+ else
+ {
+ $message_link = $message_link . " - " . $message_link_subject . "\n\n";
+ }
}
else
{
@@ -974,16 +996,27 @@ function compose_pm($id, $mode, $action, $user_folders = array())
{
$quote_attributes['post_id'] = $post['msg_id'];
}
- $quote_text = $phpbb_container->get('text_formatter.utils')->generate_quote(
- censor_text($message_parser->message),
- $quote_attributes
- );
- $message_parser->message = $message_link . $quote_text . "\n\n";
+
+ /** @var \phpbb\language\language $language */
+ $language = $phpbb_container->get('language');
+ /** @var \phpbb\textformatter\utils_interface $text_formatter_utils */
+ $text_formatter_utils = $phpbb_container->get('text_formatter.utils');
+ phpbb_format_quote($language, $message_parser, $text_formatter_utils, $bbcode_status, $quote_attributes, $message_link);
}
if (($action == 'reply' || $action == 'quote' || $action == 'quotepost') && !$preview && !$refresh)
{
$message_subject = ((!preg_match('/^Re:/', $message_subject)) ? 'Re: ' : '') . censor_text($message_subject);
+
+ /**
+ * This event allows you to modify the PM subject of the PM being quoted
+ *
+ * @event core.pm_modify_message_subject
+ * @var string message_subject String with the PM subject already censored.
+ * @since 3.2.8-RC1
+ */
+ $vars = array('message_subject');
+ extract($phpbb_dispatcher->trigger_event('core.pm_modify_message_subject', compact($vars)));
}
if ($action == 'forward' && !$preview && !$refresh && !$submit)
@@ -1035,7 +1068,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
// Build address list for display
// array('u' => array($author_id => 'to'));
- if (sizeof($address_list))
+ if (count($address_list))
{
// Get Usernames and Group Names
$result = array();
@@ -1174,8 +1207,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
break;
}
- $s_hidden_fields = '<input type="hidden" name="lastclick" value="' . $current_time . '" />';
- $s_hidden_fields .= (isset($check_value)) ? '<input type="hidden" name="status_switch" value="' . $check_value . '" />' : '';
+ $s_hidden_fields = (isset($check_value)) ? '<input type="hidden" name="status_switch" value="' . $check_value . '" />' : '';
$s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . ((isset($_REQUEST['draft_loaded'])) ? $request->variable('draft_loaded', 0) : $draft_id) . '" />' : '';
$form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_pm_attach'] || !$auth->acl_get('u_pm_attach')) ? '' : ' enctype="multipart/form-data"';
@@ -1184,7 +1216,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$controller_helper = $phpbb_container->get('controller.helper');
// Start assigning vars for main posting page ...
- $template->assign_vars(array(
+ $template_ary = array(
'L_POST_A' => $page_title,
'L_ICON' => $user->lang['PM_ICON'],
'L_MESSAGE_BODY_EXPLAIN' => $user->lang('MESSAGE_BODY_EXPLAIN', (int) $config['max_post_chars']),
@@ -1198,7 +1230,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
'URL_STATUS' => ($url_status) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'],
'MAX_FONT_SIZE' => (int) $config['max_post_font_size'],
'MINI_POST_IMG' => $user->img('icon_post_target', $user->lang['PM']),
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'MAX_RECIPIENTS' => ($config['allow_mass_pm'] && ($auth->acl_get('u_masspm') || $auth->acl_get('u_masspm_group'))) ? $max_recipients : 0,
'S_COMPOSE_PM' => true,
@@ -1229,7 +1261,19 @@ function compose_pm($id, $mode, $action, $user_folders = array())
'S_CLOSE_PROGRESS_WINDOW' => isset($_POST['add_file']),
'U_PROGRESS_BAR' => append_sid("{$phpbb_root_path}posting.$phpEx", 'f=0&amp;mode=popup'),
'UA_PROGRESS_BAR' => addslashes(append_sid("{$phpbb_root_path}posting.$phpEx", 'f=0&amp;mode=popup')),
- ));
+ );
+
+ /**
+ * Modify the default template vars
+ *
+ * @event core.ucp_pm_compose_template
+ * @var array template_ary Template variables
+ * @since 3.2.6-RC1
+ */
+ $vars = array('template_ary');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_pm_compose_template', compact($vars)));
+
+ $template->assign_vars($template_ary);
// Build custom bbcodes array
display_custom_bbcodes();
@@ -1262,7 +1306,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove_g, $add_to, $add_bcc)
{
global $auth, $db, $user;
- global $request;
+ global $request, $phpbb_dispatcher;
// Delete User [TO/BCC]
if ($remove_u && $request->variable('remove_u', array(0 => '')))
@@ -1300,7 +1344,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
}
// If add to or add bcc not pressed, users could still have usernames listed they want to add...
- if (!$add_to && !$add_bcc && (sizeof($group_list) || sizeof($usernames)))
+ if (!$add_to && !$add_bcc && (count($group_list) || count($usernames)))
{
$add_to = true;
@@ -1321,7 +1365,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
{
$type = ($add_to) ? 'to' : 'bcc';
- if (sizeof($group_list))
+ if (count($group_list))
{
foreach ($group_list as $group_id)
{
@@ -1333,13 +1377,13 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
$user_id_ary = array();
// Reveal the correct user_ids
- if (sizeof($usernames))
+ if (count($usernames))
{
$user_id_ary = array();
user_get_id_name($user_id_ary, $usernames, array(USER_NORMAL, USER_FOUNDER, USER_INACTIVE));
// If there are users not existing, we will at least print a notice...
- if (!sizeof($user_id_ary))
+ if (!count($user_id_ary))
{
$error[] = $user->lang['PM_NO_USERS'];
}
@@ -1408,7 +1452,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
$error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
}
- if (!sizeof(array_keys($address_list['u'])))
+ if (!count(array_keys($address_list['u'])))
{
return;
}
@@ -1439,6 +1483,21 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
$error[] = $user->lang['PM_USERS_REMOVED_NO_PERMISSION'];
}
}
+
+ /**
+ * Event for additional message list actions
+ *
+ * @event core.message_list_actions
+ * @var array address_list The assoc array with the recipient user/group ids
+ * @var array error The array containing error data
+ * @var bool remove_u The variable for removing a user
+ * @var bool remove_g The variable for removing a group
+ * @var bool add_to The variable for adding a user to the [TO] field
+ * @var bool add_bcc The variable for adding a user to the [BCC] field
+ * @since 3.2.4-RC1
+ */
+ $vars = array('address_list', 'error', 'remove_u', 'remove_g', 'add_to', 'add_bcc');
+ extract($phpbb_dispatcher->trigger_event('core.message_list_actions', compact($vars)));
}
/**
@@ -1466,7 +1525,7 @@ function num_recipients($address_list)
foreach ($address_list as $field => $adr_ary)
{
- $num_recipients += sizeof($adr_ary);
+ $num_recipients += count($adr_ary);
}
return $num_recipients;
diff --git a/phpBB/includes/ucp/ucp_pm_options.php b/phpBB/includes/ucp/ucp_pm_options.php
index 2458c4118d..3861962516 100644
--- a/phpBB/includes/ucp/ucp_pm_options.php
+++ b/phpBB/includes/ucp/ucp_pm_options.php
@@ -521,7 +521,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
$action_option = $request->variable('action_option', '');
$back = (isset($_REQUEST['back'])) ? $request->variable('back', array('' => 0)) : array();
- if (sizeof($back))
+ if (count($back))
{
if ($action_option)
{
diff --git a/phpBB/includes/ucp/ucp_pm_viewfolder.php b/phpBB/includes/ucp/ucp_pm_viewfolder.php
index b5bb406d7d..09e7bf4d7c 100644
--- a/phpBB/includes/ucp/ucp_pm_viewfolder.php
+++ b/phpBB/includes/ucp/ucp_pm_viewfolder.php
@@ -39,7 +39,7 @@ function view_folder($id, $mode, $folder_id, $folder)
// Grab icons
$icons = $cache->obtain_icons();
- $color_rows = array('marked', 'replied');
+ $color_rows = array('message_reported', 'marked', 'replied');
$_module = new p_master();
$_module->list_modules('ucp');
@@ -114,7 +114,7 @@ function view_folder($id, $mode, $folder_id, $folder)
);
// Okay, lets dump out the page ...
- if (sizeof($folder_info['pm_list']))
+ if (count($folder_info['pm_list']))
{
$address_list = array();
@@ -138,9 +138,9 @@ function view_folder($id, $mode, $folder_id, $folder)
$row_indicator = '';
foreach ($color_rows as $var)
{
- if (($var != 'friend' && $var != 'foe' && $row['pm_' . $var])
+ if (($var !== 'friend' && $var !== 'foe' && $row[($var === 'message_reported') ? $var : "pm_{$var}"])
||
- (($var == 'friend' || $var == 'foe') && isset(${$var}[$row['author_id']]) && ${$var}[$row['author_id']]))
+ (($var === 'friend' || $var === 'foe') && isset(${$var}[$row['author_id']]) && ${$var}[$row['author_id']]))
{
$row_indicator = $var;
break;
@@ -236,7 +236,7 @@ function view_folder($id, $mode, $folder_id, $folder)
$_types = array('u', 'g');
foreach ($_types as $ug_type)
{
- if (isset($address_temp[$message_id][$ug_type]) && sizeof($address_temp[$message_id][$ug_type]))
+ if (isset($address_temp[$message_id][$ug_type]) && count($address_temp[$message_id][$ug_type]))
{
if (!isset($address[$message_id][$ug_type]))
{
@@ -269,8 +269,8 @@ function view_folder($id, $mode, $folder_id, $folder)
// There is the chance that all recipients of the message got deleted. To avoid creating
// exports without recipients, we add a bogus "undisclosed recipient".
- if (!(isset($address[$message_id]['g']) && sizeof($address[$message_id]['g'])) &&
- !(isset($address[$message_id]['u']) && sizeof($address[$message_id]['u'])))
+ if (!(isset($address[$message_id]['g']) && count($address[$message_id]['g'])) &&
+ !(isset($address[$message_id]['u']) && count($address[$message_id]['u'])))
{
$address[$message_id]['u'] = array();
$address[$message_id]['u']['to'] = array();
diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php
index 48d14a133c..7c0091ef47 100644
--- a/phpBB/includes/ucp/ucp_pm_viewmessage.php
+++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php
@@ -113,7 +113,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
$db->sql_freeresult($result);
// No attachments exist, but message table thinks they do so go ahead and reset attach flags
- if (!sizeof($attachments))
+ if (!count($attachments))
{
$sql = 'UPDATE ' . PRIVMSGS_TABLE . "
SET message_attachment = 0
@@ -134,7 +134,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
parse_attachments(false, $message, $attachments, $update_count);
// Update the attachment download counts
- if (sizeof($update_count))
+ if (count($update_count))
{
$sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
SET download_count = download_count + 1
@@ -240,7 +240,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
'U_PM_ACTION' => $url . '&amp;mode=compose&amp;f=' . $folder_id . '&amp;p=' . $message_row['msg_id'],
- 'S_HAS_ATTACHMENTS' => (sizeof($attachments)) ? true : false,
+ 'S_HAS_ATTACHMENTS' => (count($attachments)) ? true : false,
'S_DISPLAY_NOTICE' => $display_notice && $message_row['message_attachment'],
'S_AUTHOR_DELETED' => ($author_id == ANONYMOUS) ? true : false,
'S_SPECIAL_FOLDER' => in_array($folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)),
@@ -267,6 +267,8 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
* @var array user_info User data of the sender
* @since 3.1.0-a1
* @changed 3.1.6-RC1 Added user_info into event
+ * @changed 3.2.2-RC1 Deprecated
+ * @deprecated 4.0.0 Event name is misspelled and is replaced with new event with correct name
*/
$vars = array(
'id',
@@ -281,6 +283,37 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
);
extract($phpbb_dispatcher->trigger_event('core.ucp_pm_view_messsage', compact($vars)));
+ /**
+ * Modify pm and sender data before it is assigned to the template
+ *
+ * @event core.ucp_pm_view_message
+ * @var mixed id Active module category (can be int or string)
+ * @var string mode Active module
+ * @var int folder_id ID of the folder the message is in
+ * @var int msg_id ID of the private message
+ * @var array folder Array with data of user's message folders
+ * @var array message_row Array with message data
+ * @var array cp_row Array with senders custom profile field data
+ * @var array msg_data Template array with message data
+ * @var array user_info User data of the sender
+ * @var array attachments Attachments data
+ * @since 3.2.2-RC1
+ * @changed 3.2.5-RC1 Added attachments
+ */
+ $vars = array(
+ 'id',
+ 'mode',
+ 'folder_id',
+ 'msg_id',
+ 'folder',
+ 'message_row',
+ 'cp_row',
+ 'msg_data',
+ 'user_info',
+ 'attachments',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.ucp_pm_view_message', compact($vars)));
+
$template->assign_vars($msg_data);
$contact_fields = array(
@@ -330,7 +363,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
}
// Display not already displayed Attachments for this post, we already parsed them. ;)
- if (isset($attachments) && sizeof($attachments))
+ if (isset($attachments) && count($attachments))
{
foreach ($attachments as $attachment)
{
diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php
index c2aa910ed0..7785aeb07b 100644
--- a/phpBB/includes/ucp/ucp_prefs.php
+++ b/phpBB/includes/ucp/ucp_prefs.php
@@ -96,7 +96,7 @@ class ucp_prefs
$error[] = 'FORM_INVALID';
}
- if (!sizeof($error))
+ if (!count($error))
{
$sql_ary = array(
'user_allow_pm' => $data['allowpm'],
@@ -188,7 +188,7 @@ class ucp_prefs
$db->sql_freeresult($result);
$template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'S_NOTIFY_EMAIL' => ($data['notifymethod'] == NOTIFY_EMAIL) ? true : false,
'S_NOTIFY_IM' => ($data['notifymethod'] == NOTIFY_IM) ? true : false,
@@ -277,7 +277,7 @@ class ucp_prefs
$error[] = 'FORM_INVALID';
}
- if (!sizeof($error))
+ if (!count($error))
{
$user->optionset('viewimg', $data['images']);
$user->optionset('viewflash', $data['flash']);
@@ -412,7 +412,7 @@ class ucp_prefs
extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_after', compact($vars)));
$template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'S_IMAGES' => $data['images'],
'S_FLASH' => $data['flash'],
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
index b7f8501fe4..36ab3d0463 100644
--- a/phpBB/includes/ucp/ucp_profile.php
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -98,7 +98,7 @@ class ucp_profile
$passwords_manager = $phpbb_container->get('passwords.manager');
// Only check the new password against the previous password if there have been no errors
- if (!sizeof($error) && $auth->acl_get('u_chgpasswd') && $data['new_password'] && $passwords_manager->check($data['new_password'], $user->data['user_password']))
+ if (!count($error) && $auth->acl_get('u_chgpasswd') && $data['new_password'] && $passwords_manager->check($data['new_password'], $user->data['user_password']))
{
$error[] = 'SAME_PASSWORD_ERROR';
}
@@ -125,7 +125,7 @@ class ucp_profile
$vars = array('data', 'submit', 'error');
extract($phpbb_dispatcher->trigger_event('core.ucp_profile_reg_details_validate', compact($vars)));
- if (!sizeof($error))
+ if (!count($error))
{
$sql_ary = array(
'username' => ($auth->acl_get('u_chgname') && $config['allow_namechange']) ? $data['username'] : $user->data['username'],
@@ -133,7 +133,6 @@ class ucp_profile
'user_email' => ($auth->acl_get('u_chgemail')) ? $data['email'] : $user->data['user_email'],
'user_email_hash' => ($auth->acl_get('u_chgemail')) ? phpbb_email_hash($data['email']) : $user->data['user_email_hash'],
'user_password' => ($auth->acl_get('u_chgpasswd') && $data['new_password']) ? $passwords_manager->hash($data['new_password']) : $user->data['user_password'],
- 'user_passchg' => ($auth->acl_get('u_chgpasswd') && $data['new_password']) ? time() : 0,
);
if ($auth->acl_get('u_chgname') && $config['allow_namechange'] && $data['username'] != $user->data['username'])
@@ -147,6 +146,8 @@ class ucp_profile
if ($auth->acl_get('u_chgpasswd') && $data['new_password'] && !$passwords_manager->check($data['new_password'], $user->data['user_password']))
{
+ $sql_ary['user_passchg'] = time();
+
$user->reset_login_keys();
$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_NEW_PASSWORD', false, array(
'reportee_id' => $user->data['user_id'],
@@ -159,7 +160,7 @@ class ucp_profile
$phpbb_log->add('user', $user->data['user_id'], $user->ip, 'LOG_USER_UPDATE_EMAIL', false, array(
'reportee_id' => $user->data['user_id'],
$user->data['username'],
- $data['user_email'],
+ $user->data['user_email'],
$data['email']
));
}
@@ -220,7 +221,7 @@ class ucp_profile
$vars = array('data', 'sql_ary');
extract($phpbb_dispatcher->trigger_event('core.ucp_profile_reg_details_sql_ary', compact($vars)));
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
@@ -257,7 +258,7 @@ class ucp_profile
}
$template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'USERNAME' => $data['username'],
'EMAIL' => $data['email'],
@@ -343,7 +344,7 @@ class ucp_profile
// validate custom profile fields
$cp->submit_cp_field('profile', $user->get_iso_lang_id(), $cp_data, $cp_error);
- if (sizeof($cp_error))
+ if (count($cp_error))
{
$error = array_merge($error, $cp_error);
}
@@ -365,7 +366,7 @@ class ucp_profile
$vars = array('data', 'submit', 'error');
extract($phpbb_dispatcher->trigger_event('core.ucp_profile_validate_profile_info', compact($vars)));
- if (!sizeof($error))
+ if (!count($error))
{
$data['notify'] = $user->data['user_notify_type'];
@@ -449,7 +450,7 @@ class ucp_profile
}
$template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'S_JABBER_ENABLED' => $config['jab_enable'],
'JABBER' => $data['jabber'],
));
@@ -469,8 +470,15 @@ class ucp_profile
trigger_error('NO_AUTH_SIGNATURE');
}
- include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
- include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ if (!function_exists('generate_smilies'))
+ {
+ include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
+ }
+
+ if (!function_exists('display_custom_bbcodes'))
+ {
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
$preview = $request->is_set_post('preview');
@@ -537,7 +545,7 @@ class ucp_profile
'sig'
);
- if (sizeof($warn_msg))
+ if (count($warn_msg))
{
$error += $warn_msg;
}
@@ -549,7 +557,7 @@ class ucp_profile
}
else
{
- if (!sizeof($error))
+ if (!count($error))
{
$user->optionset('sig_bbcode', $enable_bbcode);
$user->optionset('sig_smilies', $enable_smilies);
@@ -594,7 +602,7 @@ class ucp_profile
$controller_helper = $phpbb_container->get('controller.helper');
$template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'SIGNATURE' => $decoded_message['text'],
'SIGNATURE_PREVIEW' => $signature_preview,
@@ -753,7 +761,7 @@ class ucp_profile
$avatar = phpbb_get_user_avatar($user->data, 'USER_AVATAR', true);
$template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'AVATAR' => $avatar,
'S_FORM_ENCTYPE' => ' enctype="multipart/form-data"',
@@ -778,7 +786,7 @@ class ucp_profile
$error[] = 'FORM_INVALID';
}
- if (!sizeof($error))
+ if (!count($error))
{
if (!empty($keys))
{
@@ -825,7 +833,7 @@ class ucp_profile
}
$template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'L_TITLE' => $user->lang['UCP_PROFILE_' . strtoupper($mode)],
diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php
index 594100ac65..0e673cb692 100644
--- a/phpBB/includes/ucp/ucp_register.php
+++ b/phpBB/includes/ucp/ucp_register.php
@@ -166,8 +166,8 @@ class ucp_register
->format($user->lang['DATE_FORMAT'], true);
unset($now);
- $template->assign_vars(array(
- 'S_LANG_OPTIONS' => (sizeof($lang_row) > 1) ? language_select($user_lang) : '',
+ $template_vars = array(
+ 'S_LANG_OPTIONS' => (count($lang_row) > 1) ? language_select($user_lang) : '',
'L_COPPA_NO' => sprintf($user->lang['UCP_COPPA_BEFORE'], $coppa_birthday),
'L_COPPA_YES' => sprintf($user->lang['UCP_COPPA_ON_AFTER'], $coppa_birthday),
@@ -180,12 +180,12 @@ class ucp_register
'COOKIE_NAME' => $config['cookie_name'],
'COOKIE_PATH' => $config['cookie_path'],
- ));
+ );
}
else
{
- $template->assign_vars(array(
- 'S_LANG_OPTIONS' => (sizeof($lang_row) > 1) ? language_select($user_lang) : '',
+ $template_vars = array(
+ 'S_LANG_OPTIONS' => (count($lang_row) > 1) ? language_select($user_lang) : '',
'L_TERMS_OF_USE' => sprintf($user->lang['TERMS_OF_USE_CONTENT'], $config['sitename'], generate_board_url()),
'S_SHOW_COPPA' => false,
@@ -195,11 +195,32 @@ class ucp_register
'COOKIE_NAME' => $config['cookie_name'],
'COOKIE_PATH' => $config['cookie_path'],
- )
);
}
+
+ $tpl_name = 'ucp_agreement';
+
+ /**
+ * Allows to modify the agreements.
+ *
+ * @event core.ucp_register_agreement_modify_template_data
+ * @var string tpl_name Template file
+ * @var array template_vars Array with data about to be assigned to the template
+ * @var array s_hidden_fields Array with hidden form elements
+ * @var array lang_row Array with available languages, read only
+ * @since 3.2.2-RC1
+ */
+ $vars = array('tpl_name', 'template_vars', 's_hidden_fields', 'lang_row');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_register_agreement_modify_template_data', compact($vars)));
+
unset($lang_row);
+ $template_vars = array_merge($template_vars, array(
+ 'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields),
+ ));
+
+ $template->assign_vars($template_vars);
+
/**
* Allows to modify the agreements.
*
@@ -207,10 +228,11 @@ class ucp_register
*
* @event core.ucp_register_agreement
* @since 3.1.6-RC1
+ * @deprecated 3.2.2-RC1 Replaced by core.ucp_register_agreement_modify_template_data and to be removed in 3.3.0-RC1
*/
$phpbb_dispatcher->dispatch('core.ucp_register_agreement');
- $this->tpl_name = 'ucp_agreement';
+ $this->tpl_name = $tpl_name;
return;
}
@@ -297,7 +319,7 @@ class ucp_register
// validate custom profile fields
$cp->submit_cp_field('register', $user->get_iso_lang_id(), $cp_data, $error);
- if (!sizeof($error))
+ if (!count($error))
{
if ($data['new_password'] != $data['password_confirm'])
{
@@ -318,7 +340,7 @@ class ucp_register
$vars = array('submit', 'data', 'cp_data', 'error');
extract($phpbb_dispatcher->trigger_event('core.ucp_register_data_after', compact($vars)));
- if (!sizeof($error))
+ if (!count($error))
{
$server_url = generate_board_url();
@@ -459,6 +481,32 @@ class ucp_register
);
}
+ /**
+ * Modify messenger data before welcome mail is sent
+ *
+ * @event core.ucp_register_welcome_email_before
+ * @var array user_row Array with user registration data
+ * @var array cp_data Array with custom profile fields data
+ * @var array data Array with current ucp registration data
+ * @var string message Message to be displayed to the user after registration
+ * @var string server_url Server URL
+ * @var int user_id New user ID
+ * @var string user_actkey User activation key
+ * @var messenger messenger phpBB Messenger
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'user_row',
+ 'cp_data',
+ 'data',
+ 'message',
+ 'server_url',
+ 'user_id',
+ 'user_actkey',
+ 'messenger',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.ucp_register_welcome_email_before', compact($vars)));
+
$messenger->send(NOTIFY_EMAIL);
}
@@ -486,6 +534,30 @@ class ucp_register
}
}
+ /**
+ * Perform additional actions after user registration
+ *
+ * @event core.ucp_register_register_after
+ * @var array user_row Array with user registration data
+ * @var array cp_data Array with custom profile fields data
+ * @var array data Array with current ucp registration data
+ * @var string message Message to be displayed to the user after registration
+ * @var string server_url Server URL
+ * @var int user_id New user ID
+ * @var string user_actkey User activation key
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'user_row',
+ 'cp_data',
+ 'data',
+ 'message',
+ 'server_url',
+ 'user_id',
+ 'user_actkey',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.ucp_register_register_after', compact($vars)));
+
$message = $message . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
trigger_error($message);
}
@@ -505,7 +577,6 @@ class ucp_register
{
$s_hidden_fields = array_merge($s_hidden_fields, $captcha->get_hidden_fields());
}
- $s_hidden_fields = build_hidden_fields($s_hidden_fields);
// Visual Confirmation - Show images
if ($config['enable_confirm'])
@@ -531,8 +602,7 @@ class ucp_register
// Assign template vars for timezone select
phpbb_timezone_select($template, $user, $data['tz'], true);
- $template->assign_vars(array(
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ $template_vars = array(
'USERNAME' => $data['username'],
'PASSWORD' => $data['new_password'],
'PASSWORD_CONFIRM' => $data['password_confirm'],
@@ -547,13 +617,41 @@ class ucp_register
'S_CONFIRM_REFRESH' => ($config['enable_confirm'] && $config['confirm_refresh']) ? true : false,
'S_REGISTRATION' => true,
'S_COPPA' => $coppa,
- 'S_HIDDEN_FIELDS' => $s_hidden_fields,
'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
'COOKIE_NAME' => $config['cookie_name'],
'COOKIE_PATH' => $config['cookie_path'],
+ );
+
+ $tpl_name = 'ucp_register';
+
+ /**
+ * Modify template data on the registration page
+ *
+ * @event core.ucp_register_modify_template_data
+ * @var array template_vars Array with template data
+ * @var array data Array with user data, read only
+ * @var array error Array with errors
+ * @var array s_hidden_fields Array with hidden field elements
+ * @var string tpl_name Template name
+ * @since 3.2.2-RC1
+ */
+ $vars = array(
+ 'template_vars',
+ 'data',
+ 'error',
+ 's_hidden_fields',
+ 'tpl_name',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.ucp_register_modify_template_data', compact($vars)));
+
+ $template_vars = array_merge($template_vars, array(
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
+ 'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields),
));
+ $template->assign_vars($template_vars);
+
//
$user->profile_fields = array();
@@ -561,8 +659,7 @@ class ucp_register
$cp->generate_profile_fields('register', $user->get_iso_lang_id());
//
- $this->tpl_name = 'ucp_register';
- $this->page_title = 'UCP_REGISTRATION';
+ $this->tpl_name = $tpl_name;
}
/**
diff --git a/phpBB/includes/ucp/ucp_remind.php b/phpBB/includes/ucp/ucp_remind.php
index f46df99edb..e50428bfea 100644
--- a/phpBB/includes/ucp/ucp_remind.php
+++ b/phpBB/includes/ucp/ucp_remind.php
@@ -50,11 +50,16 @@ class ucp_remind
trigger_error('FORM_INVALID');
}
+ if (empty($email))
+ {
+ trigger_error('NO_EMAIL_USER');
+ }
+
$sql_array = array(
'SELECT' => 'user_id, username, user_permissions, user_email, user_jabber, user_notify_type, user_type, user_lang, user_inactive_reason',
'FROM' => array(USERS_TABLE => 'u'),
- 'WHERE' => "user_email_hash = '" . $db->sql_escape(phpbb_email_hash($email)) . "'
- AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'"
+ 'WHERE' => "user_email_hash = '" . $db->sql_escape(phpbb_email_hash($email)) . "'" .
+ (!empty($username) ? " AND username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'" : ''),
);
/**
@@ -74,82 +79,87 @@ class ucp_remind
extract($phpbb_dispatcher->trigger_event('core.ucp_remind_modify_select_sql', compact($vars)));
$sql = $db->sql_build_query('SELECT', $sql_array);
- $result = $db->sql_query($sql);
- $user_row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
+ $result = $db->sql_query_limit($sql, 2); // don't waste resources on more rows than we need
+ $rowset = $db->sql_fetchrowset($result);
- if (!$user_row)
+ if (count($rowset) > 1)
{
- trigger_error('NO_EMAIL_USER');
- }
+ $db->sql_freeresult($result);
- if ($user_row['user_type'] == USER_IGNORE)
- {
- trigger_error('NO_USER');
+ $template->assign_vars(array(
+ 'USERNAME_REQUIRED' => true,
+ 'EMAIL' => $email,
+ ));
}
-
- if ($user_row['user_type'] == USER_INACTIVE)
+ else
{
- if ($user_row['user_inactive_reason'] == INACTIVE_MANUAL)
+ $message = $user->lang['PASSWORD_UPDATED_IF_EXISTED'] . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
+
+ if (empty($rowset))
{
- trigger_error('ACCOUNT_DEACTIVATED');
+ trigger_error($message);
}
- else
+
+ $user_row = $rowset[0];
+ $db->sql_freeresult($result);
+
+ if (!$user_row)
{
- trigger_error('ACCOUNT_NOT_ACTIVATED');
+ trigger_error($message);
}
- }
- // Check users permissions
- $auth2 = new \phpbb\auth\auth();
- $auth2->acl($user_row);
+ if ($user_row['user_type'] == USER_IGNORE || $user_row['user_type'] == USER_INACTIVE)
+ {
+ trigger_error($message);
+ }
- if (!$auth2->acl_get('u_chgpasswd'))
- {
- send_status_line(403, 'Forbidden');
- trigger_error('NO_AUTH_PASSWORD_REMINDER');
- }
+ // Check users permissions
+ $auth2 = new \phpbb\auth\auth();
+ $auth2->acl($user_row);
- $server_url = generate_board_url();
+ if (!$auth2->acl_get('u_chgpasswd'))
+ {
+ trigger_error($message);
+ }
- // Make password at least 8 characters long, make it longer if admin wants to.
- // gen_rand_string() however has a limit of 12 or 13.
- $user_password = gen_rand_string_friendly(max(8, mt_rand((int) $config['min_pass_chars'], (int) $config['max_pass_chars'])));
+ $server_url = generate_board_url();
- // For the activation key a random length between 6 and 10 will do.
- $user_actkey = gen_rand_string(mt_rand(6, 10));
+ // Make password at least 8 characters long, make it longer if admin wants to.
+ // gen_rand_string() however has a limit of 12 or 13.
+ $user_password = gen_rand_string_friendly(max(8, mt_rand((int) $config['min_pass_chars'], (int) $config['max_pass_chars'])));
- // Instantiate passwords manager
- /* @var $manager \phpbb\passwords\manager */
- $passwords_manager = $phpbb_container->get('passwords.manager');
+ // For the activation key a random length between 6 and 10 will do.
+ $user_actkey = gen_rand_string(mt_rand(6, 10));
- $sql = 'UPDATE ' . USERS_TABLE . "
- SET user_newpasswd = '" . $db->sql_escape($passwords_manager->hash($user_password)) . "', user_actkey = '" . $db->sql_escape($user_actkey) . "'
- WHERE user_id = " . $user_row['user_id'];
- $db->sql_query($sql);
+ // Instantiate passwords manager
+ /* @var $manager \phpbb\passwords\manager */
+ $passwords_manager = $phpbb_container->get('passwords.manager');
- include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+ $sql = 'UPDATE ' . USERS_TABLE . "
+ SET user_newpasswd = '" . $db->sql_escape($passwords_manager->hash($user_password)) . "', user_actkey = '" . $db->sql_escape($user_actkey) . "'
+ WHERE user_id = " . $user_row['user_id'];
+ $db->sql_query($sql);
- $messenger = new messenger(false);
+ include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
- $messenger->template('user_activate_passwd', $user_row['user_lang']);
+ $messenger = new messenger(false);
- $messenger->set_addresses($user_row);
+ $messenger->template('user_activate_passwd', $user_row['user_lang']);
- $messenger->anti_abuse_headers($config, $user);
+ $messenger->set_addresses($user_row);
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($user_row['username']),
- 'PASSWORD' => htmlspecialchars_decode($user_password),
- 'U_ACTIVATE' => "$server_url/ucp.$phpEx?mode=activate&u={$user_row['user_id']}&k=$user_actkey")
- );
+ $messenger->anti_abuse_headers($config, $user);
- $messenger->send($user_row['user_notify_type']);
+ $messenger->assign_vars(array(
+ 'USERNAME' => htmlspecialchars_decode($user_row['username']),
+ 'PASSWORD' => htmlspecialchars_decode($user_password),
+ 'U_ACTIVATE' => "$server_url/ucp.$phpEx?mode=activate&u={$user_row['user_id']}&k=$user_actkey")
+ );
- meta_refresh(3, append_sid("{$phpbb_root_path}index.$phpEx"));
+ $messenger->send($user_row['user_notify_type']);
- $message = $user->lang['PASSWORD_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
- trigger_error($message);
+ trigger_error($message);
+ }
}
$template->assign_vars(array(
diff --git a/phpBB/includes/ucp/ucp_zebra.php b/phpBB/includes/ucp/ucp_zebra.php
index fa6a03f87c..b4c561fc76 100644
--- a/phpBB/includes/ucp/ucp_zebra.php
+++ b/phpBB/includes/ucp/ucp_zebra.php
@@ -47,7 +47,7 @@ class ucp_zebra
$data[$var] = $request->variable($var, $default, true);
}
- if (!empty($data['add']) || sizeof($data['usernames']))
+ if (!empty($data['add']) || count($data['usernames']))
{
if (confirm_box(true))
{
@@ -105,35 +105,35 @@ class ucp_zebra
$db->sql_freeresult($result);
// remove friends from the username array
- $n = sizeof($data['add']);
+ $n = count($data['add']);
$data['add'] = array_diff($data['add'], $friends);
- if (sizeof($data['add']) < $n && $mode == 'foes')
+ if (count($data['add']) < $n && $mode == 'foes')
{
$error[] = $user->lang['NOT_ADDED_FOES_FRIENDS'];
}
// remove foes from the username array
- $n = sizeof($data['add']);
+ $n = count($data['add']);
$data['add'] = array_diff($data['add'], $foes);
- if (sizeof($data['add']) < $n && $mode == 'friends')
+ if (count($data['add']) < $n && $mode == 'friends')
{
$error[] = $user->lang['NOT_ADDED_FRIENDS_FOES'];
}
// remove the user himself from the username array
- $n = sizeof($data['add']);
+ $n = count($data['add']);
$data['add'] = array_diff($data['add'], array(utf8_clean_string($user->data['username'])));
- if (sizeof($data['add']) < $n)
+ if (count($data['add']) < $n)
{
$error[] = $user->lang['NOT_ADDED_' . $l_mode . '_SELF'];
}
unset($friends, $foes, $n);
- if (sizeof($data['add']))
+ if (count($data['add']))
{
$sql = 'SELECT user_id, user_type
FROM ' . USERS_TABLE . '
@@ -159,7 +159,7 @@ class ucp_zebra
}
$db->sql_freeresult($result);
- if (sizeof($user_id_ary))
+ if (count($user_id_ary))
{
// Remove users from foe list if they are admins or moderators
if ($mode == 'foes')
@@ -175,7 +175,7 @@ class ucp_zebra
$perms = array_unique($perms);
- if (sizeof($perms))
+ if (count($perms))
{
$error[] = $user->lang['NOT_ADDED_FOES_MOD_ADMIN'];
}
@@ -185,7 +185,7 @@ class ucp_zebra
unset($perms);
}
- if (sizeof($user_id_ary))
+ if (count($user_id_ary))
{
$sql_mode = ($mode == 'friends') ? 'friend' : 'foe';
@@ -218,7 +218,7 @@ class ucp_zebra
}
unset($user_id_ary);
}
- else if (!sizeof($error))
+ else if (!count($error))
{
$error[] = $user->lang['USER_NOT_FOUND_OR_INACTIVE'];
}
@@ -244,7 +244,7 @@ class ucp_zebra
else if ($updated)
{
meta_refresh(3, $this->u_action);
- $message = $user->lang[$l_mode . '_UPDATED'] . '<br />' . implode('<br />', $error) . ((sizeof($error)) ? '<br />' : '') . '<br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+ $message = $user->lang[$l_mode . '_UPDATED'] . '<br />' . implode('<br />', $error) . ((count($error)) ? '<br />' : '') . '<br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
trigger_error($message);
}
else
diff --git a/phpBB/includes/utf/utf_tools.php b/phpBB/includes/utf/utf_tools.php
index 01caf47349..89de454427 100644
--- a/phpBB/includes/utf/utf_tools.php
+++ b/phpBB/includes/utf/utf_tools.php
@@ -1390,7 +1390,7 @@ function utf8_wordwrap($string, $width = 75, $break = "\n", $cut = false)
{
$words = explode(' ', $line);
- for ($i = 0, $size = sizeof($words); $i < $size; $i++)
+ for ($i = 0, $size = count($words); $i < $size; $i++)
{
$word = $words[$i];
diff --git a/phpBB/index.php b/phpBB/index.php
index 4e37782206..13b914abd3 100644
--- a/phpBB/index.php
+++ b/phpBB/index.php
@@ -55,6 +55,17 @@ if (($mark_notification = $request->variable('mark_notification', 0)))
$notification->mark_read();
+ /**
+ * You can use this event to perform additional tasks or redirect user elsewhere.
+ *
+ * @event core.index_mark_notification_after
+ * @var int mark_notification Notification ID
+ * @var \phpbb\notification\type\type_interface notification Notification instance
+ * @since 3.2.6-RC1
+ */
+ $vars = array('mark_notification', 'notification');
+ extract($phpbb_dispatcher->trigger_event('core.index_mark_notification_after', compact($vars)));
+
if ($request->is_ajax())
{
$json_response = new \phpbb\json_response();
diff --git a/phpBB/install/app.php b/phpBB/install/app.php
index ef59689a65..710f49570b 100644
--- a/phpBB/install/app.php
+++ b/phpBB/install/app.php
@@ -20,9 +20,9 @@ define('PHPBB_ENVIRONMENT', 'production');
$phpbb_root_path = '../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
-if (version_compare(PHP_VERSION, '5.4') < 0)
+if (version_compare(PHP_VERSION, '5.4.7', '<') || version_compare(PHP_VERSION, '7.3-dev', '>='))
{
- die('You are running an unsupported PHP version. Please upgrade to PHP 5.4.0 or higher before trying to install or update to phpBB 3.2');
+ die('You are running an unsupported PHP version. Please upgrade to PHP equal to or greater than 5.4.7 but less than 7.3-dev in order to install or update to phpBB 3.2');
}
$startup_new_path = $phpbb_root_path . 'install/update/update/new/install/startup.' . $phpEx;
diff --git a/phpBB/install/convert/controller/convertor.php b/phpBB/install/convert/controller/convertor.php
index 7b2a00d7b9..3639b10dc5 100644
--- a/phpBB/install/convert/controller/convertor.php
+++ b/phpBB/install/convert/controller/convertor.php
@@ -537,7 +537,7 @@ class convertor
foreach ($prefixes as $prefix => $count)
{
- if ($count >= sizeof($tables))
+ if ($count >= count($tables))
{
$possible_prefix = $prefix;
break;
@@ -730,7 +730,7 @@ class convertor
include_once($this->phpbb_root_path . 'install/convertors/' . $entry);
if (isset($convertor_data))
{
- $sort[strtolower($convertor_data['forum_name'])] = sizeof($convertors);
+ $sort[strtolower($convertor_data['forum_name'])] = count($convertors);
$convertors[] = array(
'tag' => $m[1],
diff --git a/phpBB/install/convert/convertor.php b/phpBB/install/convert/convertor.php
index f7f05ebdae..5118651b71 100644
--- a/phpBB/install/convert/convertor.php
+++ b/phpBB/install/convert/convertor.php
@@ -312,9 +312,9 @@ class convertor
}
}
- if (sizeof($bad_folders))
+ if (count($bad_folders))
{
- $msg = (sizeof($bad_folders) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE'];
+ $msg = (count($bad_folders) == 1) ? $user->lang['MAKE_FOLDER_WRITABLE'] : $user->lang['MAKE_FOLDERS_WRITABLE'];
sort($bad_folders);
$this->error(sprintf($msg, implode('<br />', $bad_folders)), __LINE__, __FILE__, true);
@@ -371,7 +371,7 @@ class convertor
$val = array($val);
}
- for ($j = 0, $size = sizeof($val); $j < $size; ++$j)
+ for ($j = 0, $size = count($val); $j < $size; ++$j)
{
if (preg_match('/LEFT JOIN ([a-z0-9_]+) AS ([a-z0-9_]+)/i', $val[$j], $m))
{
@@ -412,11 +412,11 @@ class convertor
// Throw an error if some tables are missing
// We used to do some guessing here, but since we have a suggestion of possible values earlier, I don't see it adding anything here to do it again
- if (sizeof($missing_tables) == sizeof($tables_list))
+ if (count($missing_tables) == count($tables_list))
{
$this->error($user->lang['NO_TABLES_FOUND'] . ' ' . $user->lang['CHECK_TABLE_PREFIX'], __LINE__, __FILE__);
}
- else if (sizeof($missing_tables))
+ else if (count($missing_tables))
{
$this->error(sprintf($user->lang['TABLES_MISSING'], implode($user->lang['COMMA_SEPARATOR'], $missing_tables)) . '<br /><br />' . $user->lang['CHECK_TABLE_PREFIX'], __LINE__, __FILE__);
}
@@ -514,7 +514,7 @@ class convertor
));
// This loop takes one target table and processes it
- while ($current_table < sizeof($convert->convertor['schema']))
+ while ($current_table < count($convert->convertor['schema']))
{
$schema = $convert->convertor['schema'][$current_table];
@@ -753,7 +753,7 @@ class convertor
case 'mysqli':
$waiting_rows[] = '(' . implode(', ', $insert_values) . ')';
- if (sizeof($waiting_rows) >= $convert->num_wait_rows)
+ if (count($waiting_rows) >= $convert->num_wait_rows)
{
$errored = false;
@@ -809,7 +809,7 @@ class convertor
$src_db->sql_freeresult($___result);
// We might still have some rows waiting
- if (sizeof($waiting_rows))
+ if (count($waiting_rows))
{
$errored = false;
$db->sql_return_on_error(true);
@@ -888,7 +888,7 @@ class convertor
$current_table++;
// $percentage = ($skip_rows == 0) ? 0 : floor(100 / ($total_rows / $skip_rows));
- $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $current_table, sizeof($convert->convertor['schema']));
+ $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $current_table, count($convert->convertor['schema']));
$this->template->assign_vars(array(
'BODY' => $msg,
@@ -1126,7 +1126,7 @@ class convertor
}
else
{
- while ($last_statement < sizeof($convert->convertor['execute_last']))
+ while ($last_statement < count($convert->convertor['execute_last']))
{
// @codingStandardsIgnoreStart
eval($convert->convertor['execute_last'][$last_statement]);
@@ -1140,8 +1140,8 @@ class convertor
$last_statement++;
$url = $this->save_convert_progress($converter, 'jump=1&amp;last=' . $last_statement);
- $percentage = ($last_statement == 0) ? 0 : floor(100 / (sizeof($convert->convertor['execute_last']) / $last_statement));
- $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $last_statement, sizeof($convert->convertor['execute_last']), $percentage);
+ $percentage = ($last_statement == 0) ? 0 : floor(100 / (count($convert->convertor['execute_last']) / $last_statement));
+ $msg = sprintf($user->lang['STEP_PERCENT_COMPLETED'], $last_statement, count($convert->convertor['execute_last']), $percentage);
$this->template->assign_vars(array(
'L_SUBMIT' => $user->lang['CONTINUE_LAST'],
diff --git a/phpBB/install/convertors/convert_phpbb20.php b/phpBB/install/convertors/convert_phpbb20.php
index aff9eef55b..654f705967 100644
--- a/phpBB/install/convertors/convert_phpbb20.php
+++ b/phpBB/install/convertors/convert_phpbb20.php
@@ -38,7 +38,7 @@ $dbms = $phpbb_config_php_file->convert_30_dbms_to_31($dbms);
$convertor_data = array(
'forum_name' => 'phpBB 2.0.x',
'version' => '1.0.3',
- 'phpbb_version' => '3.2.1',
+ 'phpbb_version' => '3.2.8',
'author' => '<a href="https://www.phpbb.com/">phpBB Limited</a>',
'dbms' => $dbms,
'dbhost' => $dbhost,
diff --git a/phpBB/install/convertors/functions_phpbb20.php b/phpBB/install/convertors/functions_phpbb20.php
index 6f43e1915e..2da901d3de 100644
--- a/phpBB/install/convertors/functions_phpbb20.php
+++ b/phpBB/install/convertors/functions_phpbb20.php
@@ -1071,7 +1071,7 @@ function phpbb_convert_authentication($mode)
}
}
- if (sizeof($forum_ids))
+ if (count($forum_ids))
{
// Now make sure the user is able to read these forums
$hold_ary = $auth->acl_group_raw_data(false, 'f_list', $forum_ids);
@@ -1267,7 +1267,7 @@ function phpbb_prepare_message($message)
// parse($allow_bbcode, $allow_magic_url, $allow_smilies, $allow_img_bbcode = true, $allow_flash_bbcode = true, $allow_quote_bbcode = true, $allow_url_bbcode = true, $update_this_message = true, $mode = 'post')
$message_parser->parse($enable_bbcode, $enable_magic_url, $enable_smilies);
- if (sizeof($message_parser->warn_msg))
+ if (count($message_parser->warn_msg))
{
$msg_id = isset($convert->row['post_id']) ? $convert->row['post_id'] : $convert->row['privmsgs_id'];
$convert->p_master->error('<span style="color:red">' . $user->lang['POST_ID'] . ': ' . $msg_id . ' ' . $user->lang['CONV_ERROR_MESSAGE_PARSER'] . ': <br /><br />' . implode('<br />', $message_parser->warn_msg), __LINE__, __FILE__, true);
@@ -1495,7 +1495,7 @@ function phpbb_attachment_forum_perms($forum_permissions)
$forum_ids[] = (int) $forum_id;
}
- if (sizeof($forum_ids))
+ if (count($forum_ids))
{
return attachment_forum_perms($forum_ids);
}
@@ -1694,7 +1694,6 @@ function phpbb_import_attach_config()
$config->set('img_create_thumbnail', $attach_config['img_create_thumbnail']);
$config->set('img_max_thumb_width', 400);
$config->set('img_min_thumb_filesize', $attach_config['img_min_thumb_filesize']);
- $config->set('img_imagick', $attach_config['img_imagick']);
}
/**
@@ -1860,7 +1859,7 @@ function phpbb_check_username_collisions()
$db->sql_freeresult($result);
// there was at least one collision, the admin will have to solve it before conversion can continue
- if (sizeof($colliding_names))
+ if (count($colliding_names))
{
$sql = 'SELECT user_id, username_clean
FROM ' . USERCONV_TABLE . '
diff --git a/phpBB/install/phpbbcli.php b/phpBB/install/phpbbcli.php
index afc70f3302..7659b13f56 100755
--- a/phpBB/install/phpbbcli.php
+++ b/phpBB/install/phpbbcli.php
@@ -23,7 +23,7 @@ if (php_sapi_name() !== 'cli')
define('IN_PHPBB', true);
define('IN_INSTALL', true);
define('PHPBB_ENVIRONMENT', 'production');
-define('PHPBB_VERSION', '3.2.1-RC1');
+define('PHPBB_VERSION', '3.2.8-RC1');
$phpbb_root_path = __DIR__ . '/../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
diff --git a/phpBB/install/schemas/schema_data.sql b/phpBB/install/schemas/schema_data.sql
index ca0e8bd614..d614579f3d 100644
--- a/phpBB/install/schemas/schema_data.sql
+++ b/phpBB/install/schemas/schema_data.sql
@@ -103,9 +103,10 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('extension_force_un
INSERT INTO phpbb_config (config_name, config_value) VALUES ('delete_time', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_check_mx', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_enable', '1');
-INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_function_name', 'mail');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_force_sender', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_max_chunk_size', '50');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('email_package_size', '20');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_accurate_pm_button', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_confirm', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('enable_mod_rewrite', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('allow_board_notifications', '1');
@@ -148,7 +149,6 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('hot_threshold', '2
INSERT INTO phpbb_config (config_name, config_value) VALUES ('icons_path', 'images/icons');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_create_thumbnail', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_display_inlined', '1');
-INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_imagick', '');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_link_height', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_link_width', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('img_max_height', '0');
@@ -269,9 +269,9 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('smilies_per_page',
INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_auth_method', 'PLAIN');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_delivery', '0');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_host', '');
-INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_password', '');
+INSERT INTO phpbb_config (config_name, config_value, is_dynamic) VALUES ('smtp_password', '', 1);
INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_port', '25');
-INSERT INTO phpbb_config (config_name, config_value) VALUES ('smtp_username', '');
+INSERT INTO phpbb_config (config_name, config_value, is_dynamic) VALUES ('smtp_username', '', 1);
INSERT INTO phpbb_config (config_name, config_value) VALUES ('teampage_memberships', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('teampage_forums', '1');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('topics_per_page', '25');
@@ -279,7 +279,7 @@ INSERT INTO phpbb_config (config_name, config_value) VALUES ('tpl_allow_php', '0
INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_icons_path', 'images/upload_icons');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('upload_path', 'files');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('use_system_cron', '0');
-INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.2.2-dev');
+INSERT INTO phpbb_config (config_name, config_value) VALUES ('version', '3.2.9-dev');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_expire_days', '90');
INSERT INTO phpbb_config (config_name, config_value) VALUES ('warnings_gc', '14400');
@@ -328,6 +328,7 @@ INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_icons', 1);
INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_ignoreflood', 1);
INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_img', 1);
INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_list', 1);
+INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_list_topics', 1);
INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_noapprove', 1);
INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_poll', 1);
INSERT INTO phpbb_acl_options (auth_option, is_local) VALUES ('f_post', 1);
@@ -477,7 +478,7 @@ INSERT INTO phpbb_acl_roles (role_name, role_description, role_type, role_order)
INSERT INTO phpbb_acl_roles (role_name, role_description, role_type, role_order) VALUES ('ROLE_FORUM_NEW_MEMBER', 'ROLE_DESCRIPTION_FORUM_NEW_MEMBER', 'f_', 10);
# -- phpbb_styles
-INSERT INTO phpbb_styles (style_name, style_copyright, style_active, style_path, bbcode_bitfield, style_parent_id, style_parent_tree) VALUES ('prosilver', '&copy; phpBB Limited', 1, 'prosilver', 'kNg=', 0, '');
+INSERT INTO phpbb_styles (style_name, style_copyright, style_active, style_path, bbcode_bitfield, style_parent_id, style_parent_tree) VALUES ('prosilver', '&copy; phpBB Limited', 1, 'prosilver', '//g=', 0, '');
# -- Forums
INSERT INTO phpbb_forums (forum_name, forum_desc, left_id, right_id, parent_id, forum_type, forum_posts_approved, forum_posts_unapproved, forum_posts_softdeleted, forum_topics_approved, forum_topics_unapproved, forum_topics_softdeleted, forum_last_post_id, forum_last_poster_id, forum_last_poster_name, forum_last_poster_colour, forum_last_post_time, forum_link, forum_password, forum_image, forum_rules, forum_rules_link, forum_rules_uid, forum_desc_uid, prune_days, prune_viewed, forum_parents) VALUES ('{L_FORUMS_FIRST_CATEGORY}', '', 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 'Admin', 'AA0000', 972086460, '', '', '', '', '', '', '', 0, 0, '');
@@ -565,13 +566,13 @@ INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT
INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 16, auth_option_id, 0 FROM phpbb_acl_options WHERE auth_option = 'f_';
# Read Only Access (f_)
-INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 17, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_', 'f_download', 'f_list', 'f_read', 'f_search', 'f_subscribe', 'f_print');
+INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 17, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_', 'f_download', 'f_list', 'f_list_topics', 'f_read', 'f_search', 'f_subscribe', 'f_print');
# Limited Access (f_)
INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 18, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_announce_global', 'f_attach', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock', 'f_votechg');
# Bot Access (f_)
-INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 19, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_', 'f_download', 'f_list', 'f_read', 'f_print');
+INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 19, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_', 'f_download', 'f_list', 'f_list_topics', 'f_read', 'f_print');
# On Moderation Queue (f_)
INSERT INTO phpbb_acl_roles_data (role_id, auth_option_id, auth_setting) SELECT 20, auth_option_id, 1 FROM phpbb_acl_options WHERE auth_option LIKE 'f_%' AND auth_option NOT IN ('f_announce', 'f_announce_global', 'f_bump', 'f_delete', 'f_flash', 'f_icons', 'f_ignoreflood', 'f_poll', 'f_sticky', 'f_user_lock', 'f_votechg', 'f_noapprove');
diff --git a/phpBB/language/en/acp/attachments.php b/phpBB/language/en/acp/attachments.php
index 123c35a502..86430f46bd 100644
--- a/phpBB/language/en/acp/attachments.php
+++ b/phpBB/language/en/acp/attachments.php
@@ -111,8 +111,6 @@ $lang = array_merge($lang, array(
'IMAGE_LINK_SIZE' => 'Image link dimensions',
'IMAGE_LINK_SIZE_EXPLAIN' => 'Display image attachment as an inline text link if image is larger than this. To disable this behaviour, set the values to 0px by 0px.',
- 'IMAGICK_PATH' => 'ImageMagick path',
- 'IMAGICK_PATH_EXPLAIN' => 'Full path to the imagemagick convert application, e.g. <samp>/usr/bin/</samp>.',
'MAX_ATTACHMENTS' => 'Maximum number of attachments per post',
'MAX_ATTACHMENTS_PM' => 'Maximum number of attachments per private message',
@@ -135,7 +133,6 @@ $lang = array_merge($lang, array(
'NO_EXT_GROUP_SPECIFIED' => 'No extension group specified.',
'NO_FILE_CAT' => 'None',
'NO_IMAGE' => 'No image',
- 'NO_THUMBNAIL_SUPPORT' => 'Thumbnail support has been disabled. For proper functionality either the GD extension need to be available or imagemagick being installed. Both were not found.',
'NO_UPLOAD_DIR' => 'The upload directory you specified does not exist.',
'NO_WRITE_UPLOAD' => 'The upload directory you specified cannot be written to. Please alter the permissions to allow the webserver to write to it.',
@@ -147,7 +144,6 @@ $lang = array_merge($lang, array(
'REMOVE_DISALLOWED_IPS' => 'Remove or un-exclude <em>disallowed</em> IPs/hostnames',
'RESYNC_FILES_STATS_CONFIRM' => 'Are you sure you wish to resynchronise file statistics?',
- 'SEARCH_IMAGICK' => 'Search for ImageMagick',
'SECURE_ALLOW_DENY' => 'Allow/Deny list',
'SECURE_ALLOW_DENY_EXPLAIN' => 'Change the default behaviour when secure downloads are enabled of the Allow/Deny list to that of a <strong>whitelist</strong> (Allow) or a <strong>blacklist</strong> (Deny).',
'SECURE_DOWNLOADS' => 'Enable secure downloads',
diff --git a/phpBB/language/en/acp/board.php b/phpBB/language/en/acp/board.php
index e6c56a5bbb..651b76625d 100644
--- a/phpBB/language/en/acp/board.php
+++ b/phpBB/language/en/acp/board.php
@@ -44,7 +44,7 @@ $lang = array_merge($lang, array(
'BOARD_STYLE' => 'Board style',
'CUSTOM_DATEFORMAT' => 'Custom…',
'DEFAULT_DATE_FORMAT' => 'Date format',
- 'DEFAULT_DATE_FORMAT_EXPLAIN' => 'The date format is the same as the PHP <code>date</code> function.',
+ 'DEFAULT_DATE_FORMAT_EXPLAIN' => 'The date format is the same as the PHP <code><a href="https://secure.php.net/manual/function.date.php">date()</a></code> function.',
'DEFAULT_LANGUAGE' => 'Default language',
'DEFAULT_STYLE' => 'Default style',
'DEFAULT_STYLE_EXPLAIN' => 'The default style for new users.',
@@ -107,18 +107,18 @@ $lang = array_merge($lang, array(
'ACP_AVATAR_SETTINGS_EXPLAIN' => 'Avatars are generally small, unique images a user can associate with themselves. Depending on the style they are usually displayed below the username when viewing topics. Here you can determine how users can define their avatars. Please note that in order to upload avatars you need to have created the directory you name below and ensure it can be written to by the web server. Please also note that file size limits are only imposed on uploaded avatars, they do not apply to remotely linked images.',
'ALLOW_AVATARS' => 'Enable avatars',
- 'ALLOW_AVATARS_EXPLAIN' => 'Allow general usage of avatars;<br />If you disable avatars in general or avatars of a certain mode, the disabled avatars will no longer be shown on the board, but users will still be able to download their own avatars in the User Control Panel.',
+ 'ALLOW_AVATARS_EXPLAIN' => 'Allow general usage of avatars;<br>If you disable avatars in general or avatars of a certain mode, the disabled avatars will no longer be shown on the board, but users will still be able to download their own avatars in the User Control Panel.',
'ALLOW_GRAVATAR' => 'Enable gravatar avatars',
'ALLOW_LOCAL' => 'Enable gallery avatars',
'ALLOW_REMOTE' => 'Enable remote avatars',
- 'ALLOW_REMOTE_EXPLAIN' => 'Avatars linked to from another website.',
+ 'ALLOW_REMOTE_EXPLAIN' => 'Avatars linked to from another website.<br><em><strong class="error">Warning:</strong> Enabling this feature might allow users to check for the existence of files and services that are only accessible on the local network.</em>',
'ALLOW_REMOTE_UPLOAD' => 'Enable remote avatar uploading',
- 'ALLOW_REMOTE_UPLOAD_EXPLAIN' => 'Allow uploading of avatars from another website.',
+ 'ALLOW_REMOTE_UPLOAD_EXPLAIN' => 'Allow uploading of avatars from another website.<br><em><strong class="error">Warning:</strong> Enabling this feature might allow users to check for the existence of files and services that are only accessible on the local network.</em>',
'ALLOW_UPLOAD' => 'Enable avatar uploading',
'AVATAR_GALLERY_PATH' => 'Avatar gallery path',
- 'AVATAR_GALLERY_PATH_EXPLAIN' => 'Path under your phpBB root directory for pre-loaded images, e.g. <samp>images/avatars/gallery</samp>.<br />Double dots like <samp>../</samp> will be stripped from the path for security reasons.',
+ 'AVATAR_GALLERY_PATH_EXPLAIN' => 'Path under your phpBB root directory for pre-loaded images, e.g. <samp>images/avatars/gallery</samp>.<br>Double dots like <samp>../</samp> will be stripped from the path for security reasons.',
'AVATAR_STORAGE_PATH' => 'Avatar storage path',
- 'AVATAR_STORAGE_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/avatars/upload</samp>.<br />Avatar uploading <strong>will not be available</strong> if this path is not writable.<br />Double dots like <samp>../</samp> will be stripped from the path for security reasons.',
+ 'AVATAR_STORAGE_PATH_EXPLAIN' => 'Path under your phpBB root directory, e.g. <samp>images/avatars/upload</samp>.<br>Avatar uploading <strong>will not be available</strong> if this path is not writable.<br>Double dots like <samp>../</samp> will be stripped from the path for security reasons.',
'MAX_AVATAR_SIZE' => 'Maximum avatar dimensions',
'MAX_AVATAR_SIZE_EXPLAIN' => 'Width x Height in pixels.',
'MAX_FILESIZE' => 'Maximum avatar file size',
@@ -274,7 +274,7 @@ $lang = array_merge($lang, array(
'ACP_FEED_SETTINGS_OTHER' => 'Other feeds and settings',
'ACP_FEED_ENABLE' => 'Enable feeds',
- 'ACP_FEED_ENABLE_EXPLAIN' => 'Turns on or off ATOM feeds for the entire board.<br />Disabling this switches off all feeds, no matter how the options below are set.',
+ 'ACP_FEED_ENABLE_EXPLAIN' => 'Turns on or off ATOM feeds for the entire board.<br>Disabling this switches off all feeds, no matter how the options below are set.',
'ACP_FEED_LIMIT' => 'Number of items',
'ACP_FEED_LIMIT_EXPLAIN' => 'The maximum number of feed items to display.',
@@ -290,7 +290,7 @@ $lang = array_merge($lang, array(
'ACP_FEED_TOPICS_ACTIVE' => 'Enable active topics feed',
'ACP_FEED_TOPICS_ACTIVE_EXPLAIN' => 'Enables the “Active Topics” feed, which displays the last active topics including the last post.',
'ACP_FEED_NEWS' => 'News feed',
- 'ACP_FEED_NEWS_EXPLAIN' => 'Pull the first post from these forums. Select no forums to disable news feed.<br />Select multiple forums by holding <samp>CTRL</samp> and clicking.',
+ 'ACP_FEED_NEWS_EXPLAIN' => 'Pull the first post from these forums. Select no forums to disable news feed.<br>Select multiple forums by holding <samp>CTRL</samp> and clicking.',
'ACP_FEED_OVERALL_FORUMS' => 'Enable forums feed',
'ACP_FEED_OVERALL_FORUMS_EXPLAIN' => 'Enables the “All forums” feed, which displays a list of forums.',
@@ -298,9 +298,9 @@ $lang = array_merge($lang, array(
'ACP_FEED_HTTP_AUTH' => 'Allow HTTP Authentication',
'ACP_FEED_HTTP_AUTH_EXPLAIN' => 'Enables HTTP authentication, which allows users to receive content that is hidden to guest users by adding the <samp>auth=http</samp> parameter to the feed URL. Please note that some PHP setups require additional changes to the .htaccess file. Instructions can be found in that file.',
'ACP_FEED_ITEM_STATISTICS' => 'Item statistics',
- 'ACP_FEED_ITEM_STATISTICS_EXPLAIN' => 'Display individual statistics underneath feed items<br />(e.g. posted by, date and time, replies, views)',
+ 'ACP_FEED_ITEM_STATISTICS_EXPLAIN' => 'Display individual statistics underneath feed items<br>(e.g. posted by, date and time, replies, views)',
'ACP_FEED_EXCLUDE_ID' => 'Exclude these forums',
- 'ACP_FEED_EXCLUDE_ID_EXPLAIN' => 'Content from these will be <strong>not included in feeds</strong>. Select no forum to pull data from all forums.<br />Select/Deselect multiple forums by holding <samp>CTRL</samp> and clicking.',
+ 'ACP_FEED_EXCLUDE_ID_EXPLAIN' => 'Content from these will be <strong>not included in feeds</strong>. Select no forum to pull data from all forums.<br>Select/Deselect multiple forums by holding <samp>CTRL</samp> and clicking.',
));
// Visual Confirmation Settings
@@ -348,16 +348,16 @@ $lang = array_merge($lang, array(
// Cookie Settings
$lang = array_merge($lang, array(
- 'ACP_COOKIE_SETTINGS_EXPLAIN' => 'These details define the data used to send cookies to your users browsers. In most cases the default values for the cookie settings should be sufficient. If you do need to change any do so with care, incorrect settings can prevent users logging in. If you have problems with users staying logging in to your board, visit the <b><a href="https://www.phpbb.com/support/go/cookie-settings/">phpBB.com Knowledge Base - Fixing incorrect cookie settings</a></b>.',
+ 'ACP_COOKIE_SETTINGS_EXPLAIN' => 'These details define the data used to send cookies to your users browsers. In most cases the default values for the cookie settings should be sufficient. If you do need to change any do so with care, incorrect settings can prevent users logging in. If you have problems with users staying logging in to your board, visit the <strong><a href="https://www.phpbb.com/support/go/cookie-settings">phpBB.com Knowledge Base - Fixing incorrect cookie settings</a></strong>.',
'COOKIE_DOMAIN' => 'Cookie domain',
- 'COOKIE_DOMAIN_EXPLAIN' => 'In most cases the cookie domain is optional. Leave it blank if you are unsure.<br /><br /> In the case where you have a board integrated with other software or have multiple domains, then to determine the cookie domain you need to do the following. If you have something like <i>example.com</i> and <i>forums.example.com</i>, or perhaps <i>forums.example.com</i> and <i>blog.example.com</i>. Remove the subdomains until you find the common domain, <i>example.com</i>. Now add a dot in front of the common domain and you would enter .example.com (note the dot at the beginning).',
+ 'COOKIE_DOMAIN_EXPLAIN' => 'In most cases the cookie domain is optional. Leave it blank if you are unsure.<br><br> In the case where you have a board integrated with other software or have multiple domains, then to determine the cookie domain you need to do the following. If you have something like <i>example.com</i> and <i>forums.example.com</i>, or perhaps <i>forums.example.com</i> and <i>blog.example.com</i>. Remove the subdomains until you find the common domain, <i>example.com</i>. Now add a dot in front of the common domain and you would enter .example.com (note the dot at the beginning).',
'COOKIE_NAME' => 'Cookie name',
'COOKIE_NAME_EXPLAIN' => 'This can be anything what you want, make it original. Whenever the cookie settings are changed the name of the cookie should be changed.',
'COOKIE_NOTICE' => 'Cookie notice',
'COOKIE_NOTICE_EXPLAIN' => 'If enabled a cookie notice will be displayed to users when visiting your board. This might be required by law depending on the content of your board and enabled extensions.',
'COOKIE_PATH' => 'Cookie path',
- 'COOKIE_PATH_EXPLAIN' => 'Note that this is always a slash, it does not matter what your board URL is.',
+ 'COOKIE_PATH_EXPLAIN' => 'This will usually be the same as your script path or simply a slash to make the cookie accessible across the site domain.',
'COOKIE_SECURE' => 'Cookie secure',
'COOKIE_SECURE_EXPLAIN' => 'If your server is running via SSL set this to enabled else leave as disabled. Having this enabled and not running via SSL will result in server errors during redirects.',
'ONLINE_LENGTH' => 'View online time span',
@@ -371,7 +371,7 @@ $lang = array_merge($lang, array(
'ACP_CONTACT_SETTINGS_EXPLAIN' => 'Here you can enable and disable the contact page and also add a text that is displayed on the page.',
'CONTACT_US_ENABLE' => 'Enable contact page',
- 'CONTACT_US_ENABLE_EXPLAIN' => 'This page allows users to send emails to board administrators',
+ 'CONTACT_US_ENABLE_EXPLAIN' => 'This page allows users to send emails to board administrators. Please note that board-wide emails option must be enabled as well. You can find this option in General &gt; Client Communication &gt; Email settings.',
'CONTACT_US_INFO' => 'Contact information',
'CONTACT_US_INFO_EXPLAIN' => 'The message is displayed on the contact page',
@@ -404,6 +404,8 @@ $lang = array_merge($lang, array(
'READ_NOTIFICATION_EXPIRE_DAYS_EXPLAIN' => 'Number of days that will elapse before a read notification will automatically be deleted. Set this value to 0 to make notifications permanent.',
'RECOMPILE_STYLES' => 'Recompile stale style components',
'RECOMPILE_STYLES_EXPLAIN' => 'Check for updated style components on filesystem and recompile.',
+ 'YES_ACCURATE_PM_BUTTON' => 'Enable permission specific PM button in topic pages',
+ 'YES_ACCURATE_PM_BUTTON_EXPLAIN' => 'If this setting is enabled, only post profiles of users who are permitted to read private messages will have a private message button.',
'YES_ANON_READ_MARKING' => 'Enable topic marking for guests',
'YES_ANON_READ_MARKING_EXPLAIN' => 'Stores read/unread status information for guests. If disabled, posts are always marked read for guests.',
'YES_BIRTHDAYS' => 'Enable birthday listing',
@@ -430,7 +432,7 @@ $lang = array_merge($lang, array(
'AUTH_METHOD' => 'Select an authentication method',
'AUTH_PROVIDER_OAUTH_ERROR_ELEMENT_MISSING' => 'Both the key and secret of each enabled OAuth service provider must be provided. Only one was provided for an OAuth service provider.',
- 'AUTH_PROVIDER_OAUTH_EXPLAIN' => 'Each OAuth provider requires a unique secret and key in order to authenticate with the external server. These should be supplied by the OAuth service when you register your website with them and should be entered exactly as provided to you.<br />Any service that does not have both a key and a secret entered here will not be available for use by the forum users. Also note, that user can still register and login using the DB authentication plug-in.',
+ 'AUTH_PROVIDER_OAUTH_EXPLAIN' => 'Each OAuth provider requires a unique secret and key in order to authenticate with the external server. These should be supplied by the OAuth service when you register your website with them and should be entered exactly as provided to you.<br>Any service that does not have both a key and a secret entered here will not be available for use by the forum users. Also note, that user can still register and login using the DB authentication plug-in.',
'AUTH_PROVIDER_OAUTH_KEY' => 'Key',
'AUTH_PROVIDER_OAUTH_TITLE' => 'OAuth',
'AUTH_PROVIDER_OAUTH_SECRET' => 'Secret',
@@ -446,7 +448,7 @@ $lang = array_merge($lang, array(
'LDAP_NO_EMAIL' => 'The specified email attribute does not exist.',
'LDAP_NO_IDENTITY' => 'Could not find a login identity for %s.',
'LDAP_PASSWORD' => 'LDAP password',
- 'LDAP_PASSWORD_EXPLAIN' => 'Leave blank to use anonymous binding, otherwise fill in the password for the above user. Required for Active Directory Servers.<br /><em><strong>Warning:</strong> This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.</em>',
+ 'LDAP_PASSWORD_EXPLAIN' => 'Leave blank to use anonymous binding, otherwise fill in the password for the above user. Required for Active Directory Servers.<br><em><strong>Warning:</strong> This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.</em>',
'LDAP_PORT' => 'LDAP server port',
'LDAP_PORT_EXPLAIN' => 'Optionally you can specify a port which should be used to connect to the LDAP server instead of the default port 389.',
'LDAP_SERVER' => 'LDAP server name',
@@ -527,7 +529,7 @@ $lang = array_merge($lang, array(
'IP_LOGIN_LIMIT_TIME' => 'IP address login attempt expiration time',
'IP_LOGIN_LIMIT_TIME_EXPLAIN' => 'Login attempts expire after this period.',
'IP_LOGIN_LIMIT_USE_FORWARDED' => 'Limit login attempts by <var>X_FORWARDED_FOR</var> header',
- 'IP_LOGIN_LIMIT_USE_FORWARDED_EXPLAIN' => 'Instead of limiting login attempts by IP address they are limited by <var>X_FORWARDED_FOR</var> values. <br /><em><strong>Warning:</strong> Only enable this if you are operating a proxy server that sets <var>X_FORWARDED_FOR</var> to trustworthy values.</em>',
+ 'IP_LOGIN_LIMIT_USE_FORWARDED_EXPLAIN' => 'Instead of limiting login attempts by IP address they are limited by <var>X_FORWARDED_FOR</var> values. <br><em><strong>Warning:</strong> Only enable this if you are operating a proxy server that sets <var>X_FORWARDED_FOR</var> to trustworthy values.</em>',
'MAX_LOGIN_ATTEMPTS' => 'Maximum number of login attempts per username',
'MAX_LOGIN_ATTEMPTS_EXPLAIN' => 'The number of login attempts allowed for a single account before the anti-spambot task is triggered. Enter 0 to prevent the anti-spambot task from being triggered for distinct user accounts.',
'NO_IP_VALIDATION' => 'None',
@@ -552,8 +554,8 @@ $lang = array_merge($lang, array(
$lang = array_merge($lang, array(
'ACP_EMAIL_SETTINGS_EXPLAIN' => 'This information is used when the board sends emails to your users. Please ensure the email address you specify is valid, any bounced or undeliverable messages will likely be sent to that address. If your host does not provide a native (PHP based) email service you can instead send messages directly using SMTP. This requires the address of an appropriate server (ask your provider if necessary). If the server requires authentication (and only if it does) enter the necessary username, password and authentication method.',
- 'ADMIN_EMAIL' => 'Return email address',
- 'ADMIN_EMAIL_EXPLAIN' => 'This will be used as the return address on all emails, the technical contact email address. It will always be used as the <samp>Return-Path</samp> and <samp>Sender</samp> address in emails.',
+ 'ADMIN_EMAIL' => 'From email address',
+ 'ADMIN_EMAIL_EXPLAIN' => 'This will be used as the from address on all emails, the technical contact email address. It will always be used as the <samp>Sender</samp> address in emails.',
'BOARD_EMAIL_FORM' => 'Users send email via board',
'BOARD_EMAIL_FORM_EXPLAIN' => 'Instead of showing the users email address users are able to send emails via the board.',
'BOARD_HIDE_EMAILS' => 'Hide email addresses',
@@ -562,10 +564,12 @@ $lang = array_merge($lang, array(
'CONTACT_EMAIL_EXPLAIN' => 'This address will be used whenever a specific contact point is needed, e.g. spam, error output, etc. It will always be used as the <samp>From</samp> and <samp>Reply-To</samp> address in emails.',
'CONTACT_EMAIL_NAME' => 'Contact name',
'CONTACT_EMAIL_NAME_EXPLAIN' => 'This is the contact name that e-mail recipients will see. If you don’t want to have a contact name, leave this field empty.',
- 'EMAIL_FUNCTION_NAME' => 'Email function name',
- 'EMAIL_FUNCTION_NAME_EXPLAIN' => 'The email function used to send mails through PHP.',
+ 'EMAIL_FORCE_SENDER' => 'Force from email address',
+ 'EMAIL_FORCE_SENDER_EXPLAIN' => 'This will set the <samp>Return-Path</samp> to the from email address instead of using the local user and hostname of the server. This setting does not apply when using SMTP.<br><em><strong>Warning:</strong> Requires the user that the webserver runs as to be added as trusted user to the sendmail configuration.</em>',
'EMAIL_PACKAGE_SIZE' => 'Email package size',
'EMAIL_PACKAGE_SIZE_EXPLAIN' => 'This is the number of maximum emails sent out in one package. This setting is applied to the internal message queue; set this value to 0 if you have problems with non-delivered notification emails.',
+ 'EMAIL_MAX_CHUNK_SIZE' => 'Maximum allowed email recipients',
+ 'EMAIL_MAX_CHUNK_SIZE_EXPLAIN' => 'If necessary, set this to not exceed the maximum number of recipients that your email server will allow in one email message.',
'EMAIL_SIG' => 'Email signature',
'EMAIL_SIG_EXPLAIN' => 'This text will be attached to all emails the board sends.',
'ENABLE_EMAIL' => 'Enable board-wide emails',
@@ -573,28 +577,28 @@ $lang = array_merge($lang, array(
'SEND_TEST_EMAIL' => 'Send a test email',
'SEND_TEST_EMAIL_EXPLAIN' => 'This will send a test email to the address defined in your account.',
'SMTP_ALLOW_SELF_SIGNED' => 'Allow self-signed SSL certificates',
- 'SMTP_ALLOW_SELF_SIGNED_EXPLAIN'=> 'Allow connections to SMTP server with self-signed SSL certificate.<em><strong>Warning:</strong> Allowing self-signed SSL certificates may cause security implications.</em>',
+ 'SMTP_ALLOW_SELF_SIGNED_EXPLAIN'=> 'Allow connections to SMTP server with self-signed SSL certificate. <br><em><strong>Warning:</strong> Allowing self-signed SSL certificates may cause security implications.</em>',
'SMTP_AUTH_METHOD' => 'Authentication method for SMTP',
'SMTP_AUTH_METHOD_EXPLAIN' => 'Only used if a username/password is set, ask your provider if you are unsure which method to use.',
'SMTP_CRAM_MD5' => 'CRAM-MD5',
'SMTP_DIGEST_MD5' => 'DIGEST-MD5',
'SMTP_LOGIN' => 'LOGIN',
'SMTP_PASSWORD' => 'SMTP password',
- 'SMTP_PASSWORD_EXPLAIN' => 'Only enter a password if your SMTP server requires it.<br /><em><strong>Warning:</strong> This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.</em>',
+ 'SMTP_PASSWORD_EXPLAIN' => 'Only enter a password if your SMTP server requires it.<br><em><strong>Warning:</strong> This password will be stored as plain text in the database, visible to everybody who can access your database or who can view this configuration page.</em>',
'SMTP_PLAIN' => 'PLAIN',
'SMTP_POP_BEFORE_SMTP' => 'POP-BEFORE-SMTP',
'SMTP_PORT' => 'SMTP server port',
'SMTP_PORT_EXPLAIN' => 'Only change this if you know your SMTP server is on a different port.',
'SMTP_SERVER' => 'SMTP server address',
- 'SMTP_SERVER_EXPLAIN' => 'Note that you have to provide the protocol that your server uses. If you are using SSL, this has to be "ssl://your.mailserver.com"',
+ 'SMTP_SERVER_EXPLAIN' => 'Do not provide a protocol (<samp>ssl://</samp> or <samp>tsl://</samp>) unless your mail host tells you to do so.',
'SMTP_SETTINGS' => 'SMTP settings',
'SMTP_USERNAME' => 'SMTP username',
'SMTP_USERNAME_EXPLAIN' => 'Only enter a username if your SMTP server requires it.',
'SMTP_VERIFY_PEER' => 'Verify SSL certificate',
- 'SMTP_VERIFY_PEER_EXPLAIN' => 'Require verification of SSL certificate used by SMTP server.<em><strong>Warning:</strong> Connecting peers with unverified SSL certificates may cause security implications.</em>',
+ 'SMTP_VERIFY_PEER_EXPLAIN' => 'Require verification of SSL certificate used by SMTP server. <br><em><strong>Warning:</strong> Connecting peers with unverified SSL certificates may cause security implications.</em>',
'SMTP_VERIFY_PEER_NAME' => 'Verify SMTP peer name',
- 'SMTP_VERIFY_PEER_NAME_EXPLAIN' => 'Require verification of peer name for SMTP servers using SSL / TLS connections.<em><strong>Warning:</strong> Connecting to unverified peers may cause security implications.</em>',
- 'TEST_EMAIL_SENT' => 'The test email has been sent.<br />If you don’t receive it, please check your emails configuration.<br /><br />If you require assistance, please visit the <a href="https://www.phpbb.com/community/">phpBB support forums</a>.',
+ 'SMTP_VERIFY_PEER_NAME_EXPLAIN' => 'Require verification of peer name for SMTP servers using SSL / TLS connections. <br><em><strong>Warning:</strong> Connecting to unverified peers may cause security implications.</em>',
+ 'TEST_EMAIL_SENT' => 'The test email has been sent.<br>If you don’t receive it, please check your emails configuration.<br><br>If you require assistance, please visit the <a href="https://www.phpbb.com/community/">phpBB support forums</a>.',
'USE_SMTP' => 'Use SMTP server for email',
'USE_SMTP_EXPLAIN' => 'Select “Yes” if you want or have to send email via a named server instead of the local mail function.',
@@ -605,7 +609,7 @@ $lang = array_merge($lang, array(
'ACP_JABBER_SETTINGS_EXPLAIN' => 'Here you can enable and control the use of Jabber for instant messaging and board notifications. Jabber is an open source protocol and therefore available for use by anyone. Some Jabber servers include gateways or transports which allow you to contact users on other networks. Not all servers offer all transports and changes in protocols can prevent transports from operating. Please be sure to enter already registered account details - phpBB will use the details you enter here as is.',
'JAB_ALLOW_SELF_SIGNED' => 'Allow self-signed SSL certificates',
- 'JAB_ALLOW_SELF_SIGNED_EXPLAIN' => 'Allow connections to Jabber server with self-signed SSL certificate.<em><strong>Warning:</strong> Allowing self-signed SSL certificates may cause security implications.</em>',
+ 'JAB_ALLOW_SELF_SIGNED_EXPLAIN' => 'Allow connections to Jabber server with self-signed SSL certificate. <br><em><strong>Warning:</strong> Allowing self-signed SSL certificates may cause security implications.</em>',
'JAB_ENABLE' => 'Enable Jabber',
'JAB_ENABLE_EXPLAIN' => 'Enables use of Jabber messaging and notifications.',
'JAB_GTALK_NOTE' => 'Please note that GTalk will not work because the <samp>dns_get_record</samp> function could not be found. This function is not available in PHP4, and is not implemented on Windows platforms. It currently does not work on BSD-based systems, including Mac OS.',
@@ -623,7 +627,7 @@ $lang = array_merge($lang, array(
'JAB_USERNAME' => 'Jabber username or JID',
'JAB_USERNAME_EXPLAIN' => 'Specify a registered username or a valid JID. The username will not be checked for validity. If you only specify a username, then your JID will be the username and the server you specified above. Else, specify a valid JID, for example user@jabber.org.',
'JAB_VERIFY_PEER' => 'Verify SSL certificate',
- 'JAB_VERIFY_PEER_EXPLAIN' => 'Require verification of SSL certificate used by Jabber server.<em><strong>Warning:</strong> Connecting peers with unverified SSL certificates may cause security implications.</em>',
+ 'JAB_VERIFY_PEER_EXPLAIN' => 'Require verification of SSL certificate used by Jabber server. <br><em><strong>Warning:</strong> Connecting peers with unverified SSL certificates may cause security implications.</em>',
'JAB_VERIFY_PEER_NAME' => 'Verify Jabber peer name',
- 'JAB_VERIFY_PEER_NAME_EXPLAIN' => 'Require verification of peer name for Jabber servers using SSL / TLS connections.<em><strong>Warning:</strong> Connecting to unverified peers may cause security implications.</em>',
+ 'JAB_VERIFY_PEER_NAME_EXPLAIN' => 'Require verification of peer name for Jabber servers using SSL / TLS connections. <br><em><strong>Warning:</strong> Connecting to unverified peers may cause security implications.</em>',
));
diff --git a/phpBB/language/en/acp/common.php b/phpBB/language/en/acp/common.php
index de5039f047..1c2253542c 100644
--- a/phpBB/language/en/acp/common.php
+++ b/phpBB/language/en/acp/common.php
@@ -325,6 +325,7 @@ $lang = array_merge($lang, array(
'TOTAL_SIZE' => 'Total size',
'UCP' => 'User Control Panel',
+ 'URL_INVALID' => 'The provided URL for the setting “%1$s” is invalid.',
'USERNAMES_EXPLAIN' => 'Place each username on a separate line.',
'USER_CONTROL_PANEL' => 'User Control Panel',
@@ -552,6 +553,7 @@ $lang = array_merge($lang, array(
'LOG_BBCODE_ADD' => '<strong>Added new BBCode</strong><br />» %s',
'LOG_BBCODE_EDIT' => '<strong>Edited BBCode</strong><br />» %s',
'LOG_BBCODE_DELETE' => '<strong>Deleted BBCode</strong><br />» %s',
+ 'LOG_BBCODE_CONFIGURATION_ERROR' => '<strong>Error while configuring BBCode</strong>: %1$s<br />» %2$s',
'LOG_BOT_ADDED' => '<strong>New bot added</strong><br />» %s',
'LOG_BOT_DELETE' => '<strong>Deleted bot</strong><br />» %s',
diff --git a/phpBB/language/en/acp/database.php b/phpBB/language/en/acp/database.php
index ab85701eaa..302aaee570 100644
--- a/phpBB/language/en/acp/database.php
+++ b/phpBB/language/en/acp/database.php
@@ -38,14 +38,15 @@ if (empty($lang) || !is_array($lang))
// Database Backup/Restore
$lang = array_merge($lang, array(
- 'ACP_BACKUP_EXPLAIN' => 'Here you can backup all your phpBB related data. You may store the resulting archive in your <samp>store/</samp> folder or download it directly. Depending on your server configuration you may be able to compress the file in a number of formats.',
+ 'ACP_BACKUP_EXPLAIN' => 'Here you can backup all your phpBB related data. The resulting archive will be stored in your <samp>store/</samp> folder. Depending on your server configuration you may be able to compress the file in a number of formats.',
'ACP_RESTORE_EXPLAIN' => 'This will perform a full restore of all phpBB tables from a saved file. If your server supports it you may use a gzip or bzip2 compressed text file and it will automatically be decompressed. <strong>WARNING</strong> This will overwrite any existing data. The restore may take a long time to process please do not move from this page till it is complete. Backups are stored in the <samp>store/</samp> folder and are assumed to be generated by phpBB’s backup functionality. Restoring backups that were not created by the built in system may or may not work.',
- 'BACKUP_DELETE' => 'The backup file has been deleted successfully.',
- 'BACKUP_INVALID' => 'The selected file to backup is invalid.',
- 'BACKUP_OPTIONS' => 'Backup options',
- 'BACKUP_SUCCESS' => 'The backup file has been created successfully.',
- 'BACKUP_TYPE' => 'Backup type',
+ 'BACKUP_DELETE' => 'The backup file has been deleted successfully.',
+ 'BACKUP_INVALID' => 'The selected file to backup is invalid.',
+ 'BACKUP_NOT_SUPPORTED' => 'The selected backup is not supported',
+ 'BACKUP_OPTIONS' => 'Backup options',
+ 'BACKUP_SUCCESS' => 'The backup file has been created successfully.',
+ 'BACKUP_TYPE' => 'Backup type',
'DATABASE' => 'Database utilities',
'DATA_ONLY' => 'Data only',
diff --git a/phpBB/language/en/acp/forums.php b/phpBB/language/en/acp/forums.php
index 7a7176369f..d92d3f8c9e 100644
--- a/phpBB/language/en/acp/forums.php
+++ b/phpBB/language/en/acp/forums.php
@@ -97,6 +97,7 @@ $lang = array_merge($lang, array(
'FORUM_LINK_TRACK_EXPLAIN' => 'Records the number of times a forum link was clicked.',
'FORUM_NAME' => 'Forum name',
'FORUM_NAME_EMPTY' => 'You must enter a name for this forum.',
+ 'FORUM_NAME_EMOJI' => 'The forum name you entered is invalid.<br>It contains the following unsupported characters:<br>%s',
'FORUM_PARENT' => 'Parent forum',
'FORUM_PASSWORD' => 'Forum password',
'FORUM_PASSWORD_CONFIRM' => 'Confirm forum password',
diff --git a/phpBB/language/en/acp/groups.php b/phpBB/language/en/acp/groups.php
index 9d0bb5f8b9..5d68132a34 100644
--- a/phpBB/language/en/acp/groups.php
+++ b/phpBB/language/en/acp/groups.php
@@ -92,7 +92,7 @@ $lang = array_merge($lang, array(
'GROUP_OPEN' => 'Open',
'GROUP_PENDING' => 'Pending members',
'GROUP_MAX_RECIPIENTS' => 'Maximum number of allowed recipients per private message',
- 'GROUP_MAX_RECIPIENTS_EXPLAIN' => 'The maximum number of allowed recipients in a private message. The maximum for all groups of the user is used to determine the actual value.<br />Set this value to 0 to overwrite the setting for all users of this group with the board-wide setting.',
+ 'GROUP_MAX_RECIPIENTS_EXPLAIN' => 'The maximum number of allowed recipients in a private message. The maximum for all groups of the user is used to determine the actual value.<br />Set this value to 0 to overwrite the setting for all users of this group with the board-wide setting.',
'GROUP_OPTIONS_SAVE' => 'Group wide options',
'GROUP_PROMOTE' => 'Promote to group leader',
'GROUP_RANK' => 'Group rank',
@@ -111,6 +111,7 @@ $lang = array_merge($lang, array(
'GROUP_USERS_ADDED' => 'New users added to group successfully.',
'GROUP_USERS_EXIST' => 'The selected users are already members.',
'GROUP_USERS_REMOVE' => 'Users removed from group and new defaults set successfully.',
+ 'GROUP_USERS_INVALID' => 'No users were added to the group as the following usernames do not exist: %s',
'LEGEND_EXPLAIN' => 'These are the groups which are displayed in the group legend:',
'LEGEND_SETTINGS' => 'Legend settings',
diff --git a/phpBB/language/en/acp/permissions.php b/phpBB/language/en/acp/permissions.php
index 1ade2d6eb8..54d968cdaa 100644
--- a/phpBB/language/en/acp/permissions.php
+++ b/phpBB/language/en/acp/permissions.php
@@ -54,7 +54,7 @@ $lang = array_merge($lang, array(
<br />
- <p>For further information on setting up and managing permissions on your phpBB3 board, please see the section on <a href="https://www.phpbb.com/support/docs/en/3.1/ug/quickstart/permissions/">Setting permissions of our Quick Start Guide</a>.</p>
+ <p>For further information on setting up and managing permissions on your phpBB3 board, please see the section on <a href="https://www.phpbb.com/support/docs/en/3.2/ug/quickstart/permissions/">Setting permissions of our Quick Start Guide</a>.</p>
',
'ACL_NEVER' => 'Never',
diff --git a/phpBB/language/en/acp/permissions_phpbb.php b/phpBB/language/en/acp/permissions_phpbb.php
index f986eced38..2c7b3d3aee 100644
--- a/phpBB/language/en/acp/permissions_phpbb.php
+++ b/phpBB/language/en/acp/permissions_phpbb.php
@@ -81,8 +81,8 @@ $lang = array_merge($lang, array(
'ACL_U_SIG' => 'Can use signature',
'ACL_U_SENDPM' => 'Can send private messages',
- 'ACL_U_MASSPM' => 'Can send messages to multiple users',
- 'ACL_U_MASSPM_GROUP'=> 'Can send messages to groups',
+ 'ACL_U_MASSPM' => 'Can send private messages to multiple users',
+ 'ACL_U_MASSPM_GROUP'=> 'Can send private messages to groups',
'ACL_U_READPM' => 'Can read private messages',
'ACL_U_PM_EDIT' => 'Can edit own private messages',
'ACL_U_PM_DELETE' => 'Can remove private messages from own folder',
@@ -107,6 +107,7 @@ $lang = array_merge($lang, array(
// Forum Permissions
$lang = array_merge($lang, array(
'ACL_F_LIST' => 'Can see forum',
+ 'ACL_F_LIST_TOPICS' => 'Can see topics',
'ACL_F_READ' => 'Can read forum',
'ACL_F_SEARCH' => 'Can search the forum',
'ACL_F_SUBSCRIBE' => 'Can subscribe forum',
diff --git a/phpBB/language/en/acp/profile.php b/phpBB/language/en/acp/profile.php
index d365aeb183..87c950581e 100644
--- a/phpBB/language/en/acp/profile.php
+++ b/phpBB/language/en/acp/profile.php
@@ -111,7 +111,7 @@ $lang = array_merge($lang, array(
'FIRST_OPTION' => 'First option',
'HIDE_PROFILE_FIELD' => 'Hide profile field',
- 'HIDE_PROFILE_FIELD_EXPLAIN' => 'Hide the profile field from all other users except the user, administrators and moderators who are still able to see this field. If the Display in user control panel option is disabled, the user will not be able to see or change this field and the field can only be changed by administrators.',
+ 'HIDE_PROFILE_FIELD_EXPLAIN' => 'Hide the profile field from all users except administrators and moderators, who are still able to see this field. If the Display in user control panel option is disabled, the user will not be able to see or change this field and the field can only be changed by administrators.',
'INVALID_CHARS_FIELD_IDENT' => 'Field identification can only contain lowercase a-z and _',
'INVALID_FIELD_IDENT_LEN' => 'Field identification can only be 17 characters long',
@@ -161,8 +161,8 @@ $lang = array_merge($lang, array(
'STEP_2_EXPLAIN_EDIT' => 'Here you are able to change some common options.<br /><strong>Please note that changes to profile fields will not affect existing profile fields entered by your users.</strong>',
'STEP_2_TITLE_CREATE' => 'Profile type specific options',
'STEP_2_TITLE_EDIT' => 'Profile type specific options',
- 'STEP_3_EXPLAIN_CREATE' => 'Since you have more than one board language installed, you have to fill out the remaining language items too. The profile field will work with the default language enabled, you are able to fill out the remaining language items later too.',
- 'STEP_3_EXPLAIN_EDIT' => 'Since you have more than one board language installed, you now can change or add the remaining language items too. The profile field will work with the default language enabled.',
+ 'STEP_3_EXPLAIN_CREATE' => 'Since you have more than one board language installed, you have to fill out the remaining language items too. If you don’t, then default language setting for this custom profile field will be used, you are able to fill out the remaining language items later too.',
+ 'STEP_3_EXPLAIN_EDIT' => 'Since you have more than one board language installed, you now can change or add the remaining language items too. If you don’t, then default language setting for this custom profile field will be used.',
'STEP_3_TITLE_CREATE' => 'Remaining language definitions',
'STEP_3_TITLE_EDIT' => 'Language definitions',
'STRING_DEFAULT_VALUE_EXPLAIN' => 'Enter a default phrase to be displayed, a default value. Leave empty if you want to show it empty at the first place.',
diff --git a/phpBB/language/en/acp/search.php b/phpBB/language/en/acp/search.php
index c52b71c121..443dbb7fb7 100644
--- a/phpBB/language/en/acp/search.php
+++ b/phpBB/language/en/acp/search.php
@@ -116,7 +116,10 @@ $lang = array_merge($lang, array(
2 => 'The current rate of indexing is approximately %1$.1f posts per second.<br />Indexing in progress…',
),
'SEARCH_INDEX_DELETE_REDIRECT' => array(
- 2 => 'All posts up to post id %2$d have been removed from the search index.<br />Deleting in progress…',
+ 2 => 'All posts up to post id %2$d have been removed from the search index, of which %1$d posts were within this step.<br />',
+ ),
+ 'SEARCH_INDEX_DELETE_REDIRECT_RATE' => array(
+ 2 => 'The current rate of deleting is approximately %1$.1f posts per second.<br />Deleting in progress…',
),
'SEARCH_INDEX_CREATED' => 'Successfully indexed all posts in the board database.',
'SEARCH_INDEX_REMOVED' => 'Successfully deleted the search index for this backend.',
diff --git a/phpBB/language/en/acp/styles.php b/phpBB/language/en/acp/styles.php
index 9293d67ecc..44be3c11cd 100644
--- a/phpBB/language/en/acp/styles.php
+++ b/phpBB/language/en/acp/styles.php
@@ -21,7 +21,7 @@ if (!defined('IN_PHPBB'))
if (empty($lang) || !is_array($lang))
{
- $lang = array();
+ $lang = [];
}
// DEVELOPERS PLEASE NOTE
@@ -36,54 +36,56 @@ if (empty($lang) || !is_array($lang))
// equally where a string contains only two placeholders which are used to wrap text
// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
-$lang = array_merge($lang, array(
- 'ACP_STYLES_EXPLAIN' => 'Here you can manage the available styles on your board. You may alter existing styles, delete, deactivate, reactivate, install new ones. You can also see what a style will look like using the preview function. Also listed is the total user count for each style, note that overriding user styles will not be reflected here.',
+$lang = array_merge($lang, [
+ 'ACP_STYLES_EXPLAIN' => 'Here you can manage the styles available on your board.<br>Please note you cannot uninstall the “<strong>prosilver</strong>” style as it is phpBB’s default and primary parent style.',
- 'CANNOT_BE_INSTALLED' => 'Cannot be installed',
- 'CONFIRM_UNINSTALL_STYLES' => 'Are you sure you wish to uninstall selected styles?',
- 'COPYRIGHT' => 'Copyright',
+ 'CANNOT_BE_INSTALLED' => 'Cannot be installed',
+ 'CONFIRM_UNINSTALL_STYLES' => 'Are you sure you wish to uninstall selected styles?',
+ 'COPYRIGHT' => 'Copyright',
- 'DEACTIVATE_DEFAULT' => 'You cannot deactivate the default style.',
- 'DELETE_FROM_FS' => 'Delete from filesystem',
- 'DELETE_STYLE_FILES_FAILED' => 'Error deleting files for style "%s".',
- 'DELETE_STYLE_FILES_SUCCESS' => 'Files for style "%s" have been deleted.',
- 'DETAILS' => 'Details',
+ 'DEACTIVATE_DEFAULT' => 'You cannot deactivate the default style.',
+ 'DELETE_FROM_FS' => 'Delete from filesystem',
+ 'DELETE_STYLE_FILES_FAILED' => 'Error deleting files for style "%s".',
+ 'DELETE_STYLE_FILES_SUCCESS' => 'Files for style "%s" have been deleted.',
+ 'DETAILS' => 'Details',
- 'INHERITING_FROM' => 'Inherits from',
- 'INSTALL_STYLE' => 'Install style',
- 'INSTALL_STYLES' => 'Install styles',
- 'INSTALL_STYLES_EXPLAIN' => 'Here you can install new styles.<br />If you cannot find a specific style in list below, check to make sure style is already installed. If it is not installed, check if it was uploaded correctly.',
- 'INVALID_STYLE_ID' => 'Invalid style ID.',
+ 'INHERITING_FROM' => 'Inherits from',
+ 'INSTALL_STYLE' => 'Install style',
+ 'INSTALL_STYLES' => 'Install styles',
+ 'INSTALL_STYLES_EXPLAIN' => 'Here you can install new styles.<br>If you cannot find a specific style in list below, check to make sure style is already installed. If it is not installed, check if it was uploaded correctly.',
+ 'INVALID_STYLE_ID' => 'Invalid style ID.',
- 'NO_MATCHING_STYLES_FOUND' => 'No styles match your query.',
- 'NO_UNINSTALLED_STYLE' => 'No uninstalled styles detected.',
+ 'NO_MATCHING_STYLES_FOUND' => 'No styles match your query.',
+ 'NO_UNINSTALLED_STYLE' => 'No uninstalled styles detected.',
- 'PURGED_CACHE' => 'Cache was purged.',
+ 'PURGED_CACHE' => 'Cache was purged.',
- 'REQUIRES_STYLE' => 'This style requires the style "%s" to be installed.',
+ 'REQUIRES_STYLE' => 'This style requires the style "%s" to be installed.',
- 'STYLE_ACTIVATE' => 'Activate',
- 'STYLE_ACTIVE' => 'Active',
- 'STYLE_DEACTIVATE' => 'Deactivate',
- 'STYLE_DEFAULT' => 'Make default style',
- 'STYLE_DEFAULT_CHANGE_INACTIVE' => 'You must activate style before making it default style.',
- 'STYLE_ERR_INVALID_PARENT' => 'Invalid parent style.',
- 'STYLE_ERR_NAME_EXIST' => 'A style with that name already exists.',
- 'STYLE_ERR_STYLE_NAME' => 'You must supply a name for this style.',
- 'STYLE_INSTALLED' => 'Style "%s" has been installed.',
+ 'STYLE_ACTIVATE' => 'Activate',
+ 'STYLE_ACTIVE' => 'Active',
+ 'STYLE_DEACTIVATE' => 'Deactivate',
+ 'STYLE_DEFAULT' => 'Make default style',
+ 'STYLE_DEFAULT_CHANGE_INACTIVE' => 'You must activate style before making it default style.',
+ 'STYLE_ERR_INVALID_PARENT' => 'Invalid parent style.',
+ 'STYLE_ERR_NAME_EXIST' => 'A style with that name already exists.',
+ 'STYLE_ERR_STYLE_NAME' => 'You must supply a name for this style.',
+ 'STYLE_INSTALLED' => 'Style "%s" has been installed.',
'STYLE_INSTALLED_RETURN_INSTALLED_STYLES' => 'Return to installed styles list',
'STYLE_INSTALLED_RETURN_UNINSTALLED_STYLES' => 'Install more styles',
- 'STYLE_NAME' => 'Style name',
- 'STYLE_NAME_RESERVED' => 'Style "%s" can not be installed, because the name is reserved.',
- 'STYLE_NOT_INSTALLED' => 'Style "%s" was not installed.',
- 'STYLE_PATH' => 'Style path',
- 'STYLE_UNINSTALL' => 'Uninstall',
- 'STYLE_UNINSTALL_DEPENDENT' => 'Style "%s" cannot be uninstalled because it has one or more child styles.',
- 'STYLE_UNINSTALLED' => 'Style "%s" uninstalled successfully.',
- 'STYLE_USED_BY' => 'Used by (including robots)',
- 'STYLE_VERSION' => 'Style version',
+ 'STYLE_NAME' => 'Style name',
+ 'STYLE_NAME_RESERVED' => 'Style "%s" can not be installed, because the name is reserved.',
+ 'STYLE_NOT_INSTALLED' => 'Style "%s" was not installed.',
+ 'STYLE_PATH' => 'Style path',
+ 'STYLE_UNINSTALL' => 'Uninstall',
+ 'STYLE_UNINSTALL_DEPENDENT' => 'Style "%s" cannot be uninstalled because it has one or more child styles.',
+ 'STYLE_UNINSTALLED' => 'Style "%s" uninstalled successfully.',
+ 'STYLE_PHPBB_VERSION' => 'phpBB Version',
+ 'STYLE_USED_BY' => 'Used by (including robots)',
+ 'STYLE_VERSION' => 'Style version',
- 'UNINSTALL_DEFAULT' => 'You cannot uninstall the default style.',
+ 'UNINSTALL_PROSILVER' => 'You cannot uninstall the style “prosilver”.',
+ 'UNINSTALL_DEFAULT' => 'You cannot uninstall the default style.',
- 'BROWSE_STYLES_DATABASE' => 'Browse styles database',
-));
+ 'BROWSE_STYLES_DATABASE' => 'Browse styles database',
+]);
diff --git a/phpBB/language/en/captcha_qa.php b/phpBB/language/en/captcha_qa.php
index 28011eb636..637c4e035e 100644
--- a/phpBB/language/en/captcha_qa.php
+++ b/phpBB/language/en/captcha_qa.php
@@ -49,7 +49,7 @@ $lang = array_merge($lang, array(
'ANSWER' => 'Answer',
'EDIT_QUESTION' => 'Edit Question',
'QUESTIONS' => 'Questions',
- 'QUESTIONS_EXPLAIN' => 'For every form submission where you have enabled the Q&amp;A plugin, users will be asked one of the questions specified here. To use this plugin at least one question must be set in the default language. These questions should be easy for your target audience to answer but beyond the ability of a bot capable of running a Google™ search. Using a large and regularly changed set of questions will yield the best results. Enable the strict setting if your question relies on mixed case, punctuation or whitespace.',
+ 'QUESTIONS_EXPLAIN' => 'For every form submission where you have enabled the Q&amp;A plugin, users will be asked one of the questions specified here. To use this plugin at least one question must be set in the default language. These questions should be easy for your target audience to answer but beyond the ability of a bot capable of running a Google™ search. Only a single proper question is necessary. If you start receiving spam registrations, the question should be changed. Enable the strict setting if your question relies on mixed case, punctuation or whitespace.',
'QUESTION_DELETED' => 'Question deleted',
'QUESTION_LANG' => 'Language',
'QUESTION_LANG_EXPLAIN' => 'The language this question and its answers are written in.',
diff --git a/phpBB/language/en/captcha_recaptcha.php b/phpBB/language/en/captcha_recaptcha.php
index 0acf850043..dde2a4ba08 100644
--- a/phpBB/language/en/captcha_recaptcha.php
+++ b/phpBB/language/en/captcha_recaptcha.php
@@ -37,7 +37,7 @@ if (empty($lang) || !is_array($lang))
// in a url you again do not need to specify an order e.g., 'Click %sHERE%s' is fine
$lang = array_merge($lang, array(
- 'RECAPTCHA_LANG' => 'en',
+ 'RECAPTCHA_LANG' => 'en-GB', // Find the language/country code on https://developers.google.com/recaptcha/docs/language - If no code exists for your language you can use "en" or leave the string empty
'RECAPTCHA_NOT_AVAILABLE' => 'In order to use reCaptcha, you must create an account on <a href="http://www.google.com/recaptcha">www.google.com/recaptcha</a>.',
'CAPTCHA_RECAPTCHA' => 'reCaptcha',
'RECAPTCHA_INCORRECT' => 'The solution you provided was incorrect',
diff --git a/phpBB/language/en/cli.php b/phpBB/language/en/cli.php
index 1655855edb..505d12e8ff 100644
--- a/phpBB/language/en/cli.php
+++ b/phpBB/language/en/cli.php
@@ -117,6 +117,7 @@ $lang = array_merge($lang, array(
'CLI_EXTENSION_ENABLE_FAILURE' => 'Could not enable extension %s',
'CLI_EXTENSION_ENABLE_SUCCESS' => 'Successfully enabled extension %s',
'CLI_EXTENSION_ENABLED' => 'Extension %s is already enabled',
+ 'CLI_EXTENSION_NOT_EXIST' => 'Extension %s does not exist',
'CLI_EXTENSION_NAME' => 'Name of the extension',
'CLI_EXTENSION_PURGE_FAILURE' => 'Could not purge extension %s',
'CLI_EXTENSION_PURGE_SUCCESS' => 'Successfully purged extension %s',
diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php
index d7a1ce8e71..8df8fc630b 100644
--- a/phpBB/language/en/common.php
+++ b/phpBB/language/en/common.php
@@ -62,7 +62,6 @@ $lang = array_merge($lang, array(
'ACCOUNT_ALREADY_ACTIVATED' => 'Your account has already been activated.',
'ACCOUNT_DEACTIVATED' => 'Your account has been manually deactivated and is only able to be reactivated by an administrator.',
- 'ACCOUNT_NOT_ACTIVATED' => 'Your account has not been activated yet.',
'ACP' => 'Administration Control Panel',
'ACP_SHORT' => 'ACP',
'ACTIVE' => 'active',
@@ -92,6 +91,7 @@ $lang = array_merge($lang, array(
'ATTACHED_IMAGE_NOT_IMAGE' => 'The image file you tried to attach is invalid.',
'AUTHOR' => 'Author',
'AUTH_NO_PROFILE_CREATED' => 'The creation of a user profile was unsuccessful.',
+ 'AUTH_PROVIDER_OAUTH_ERROR_ALREADY_LINKED' => 'The account is already linked with other user.',
'AUTH_PROVIDER_OAUTH_ERROR_INVALID_ENTRY' => 'Invalid database entry.',
'AUTH_PROVIDER_OAUTH_ERROR_INVALID_SERVICE_TYPE' => 'Invalid service type provided to OAuth service handler.',
'AUTH_PROVIDER_OAUTH_ERROR_SERVICE_NOT_CREATED' => 'OAuth service not created',
@@ -138,8 +138,10 @@ $lang = array_merge($lang, array(
1 => 'Users browsing this forum: %2$s and %1$d guest',
2 => 'Users browsing this forum: %2$s and %1$d guests',
),
+ 'BUTTON_DELETE' => 'Delete',
'BUTTON_EDIT' => 'Edit',
'BUTTON_FORUM_LOCKED' => 'Locked',
+ 'BUTTON_INFORMATION' => 'Information',
'BUTTON_NEW_TOPIC' => 'New Topic',
'BUTTON_PM' => 'PM',
'BUTTON_PM_FORWARD' => 'Forward',
@@ -148,7 +150,9 @@ $lang = array_merge($lang, array(
'BUTTON_PM_REPLY_ALL' => 'Reply All',
'BUTTON_POST_REPLY' => 'Post Reply',
'BUTTON_QUOTE' => 'Quote',
+ 'BUTTON_REPORT' => 'Report',
'BUTTON_TOPIC_LOCKED' => 'Locked',
+ 'BUTTON_WARN' => 'Warn',
'BYTES' => 'Bytes',
'BYTES_SHORT' => 'B',
@@ -189,7 +193,7 @@ $lang = array_merge($lang, array(
'DAYS' => 'Days',
'DELETE' => 'Delete',
'DELETE_ALL' => 'Delete all',
- 'DELETE_COOKIES' => 'Delete all board cookies',
+ 'DELETE_COOKIES' => 'Delete cookies',
'DELETE_MARKED' => 'Delete marked',
'DELETE_POST' => 'Delete post',
'DELIMITER' => 'Delimiter',
@@ -516,6 +520,7 @@ $lang = array_merge($lang, array(
'NO_FEED_ENABLED' => 'Feeds are not available on this board.',
'NO_FEED' => 'The requested feed is not available.',
'NO_STYLE_DATA' => 'Could not get style data',
+ 'NO_STYLE_CFG' => 'Could not get the style configuration file for: %s',
'NO_SUBJECT' => 'No subject specified', // Used for posts having no subject defined but displayed within management pages.
'NO_SUCH_SEARCH_MODULE' => 'The specified search backend doesn’t exist.',
'NO_SUPPORTED_AUTH_METHODS' => 'No supported authentication methods.',
@@ -604,6 +609,7 @@ $lang = array_merge($lang, array(
'PREVIOUS' => 'Previous', // Used in pagination
'PREVIOUS_STEP' => 'Previous',
'PRIVACY' => 'Privacy policy',
+ 'PRIVACY_LINK' => 'Privacy',
'PRIVATE_MESSAGE' => 'Private message',
'PRIVATE_MESSAGES' => 'Private messages',
'PRIVATE_MESSAGING' => 'Private messaging',
@@ -728,6 +734,7 @@ $lang = array_merge($lang, array(
'SUBMIT' => 'Submit',
'TB' => 'TB',
+ 'TERMS_LINK' => 'Terms',
'TERMS_USE' => 'Terms of use',
'TEST_CONNECTION' => 'Test connection',
'THE_TEAM' => 'The team',
@@ -775,6 +782,10 @@ $lang = array_merge($lang, array(
'TOPIC_REVIEW' => 'Topic review',
'TOPIC_TITLE' => 'Topic title',
'TOPIC_UNAPPROVED' => 'This topic has not been approved.',
+ 'TOPIC_UNAPPROVED_FORUM' => array(
+ 1 => 'Topic awaiting approval',
+ 2 => 'Topics awaiting approval',
+ ),
'TOPIC_DELETED' => 'This topic has been deleted.',
'TOTAL_ATTACHMENTS' => 'Attachment(s)',
'TOTAL_LOGS' => array(
diff --git a/phpBB/language/en/email/admin_activate.txt b/phpBB/language/en/email/admin_activate.txt
index a53ab1269e..71faca70b2 100644
--- a/phpBB/language/en/email/admin_activate.txt
+++ b/phpBB/language/en/email/admin_activate.txt
@@ -7,7 +7,7 @@ The account owned by "{USERNAME}" has been deactivated or newly created, you sho
Use this link to view the user's profile:
{U_USER_DETAILS}
-Use this link to activate the account:
+You may activate the account immediately by clicking on this link:
{U_ACTIVATE}
{EMAIL_SIG}
diff --git a/phpBB/language/en/email/forum_notify.txt b/phpBB/language/en/email/forum_notify.txt
index ccae82c862..1dfe8c652d 100644
--- a/phpBB/language/en/email/forum_notify.txt
+++ b/phpBB/language/en/email/forum_notify.txt
@@ -1,4 +1,5 @@
Subject: Forum post notification - "{FORUM_NAME}"
+List-Unsubscribe: <{U_STOP_WATCHING_FORUM}>
Hello {USERNAME},
diff --git a/phpBB/language/en/email/newtopic_notify.txt b/phpBB/language/en/email/newtopic_notify.txt
index b9416d8e40..0dfc9e43b4 100644
--- a/phpBB/language/en/email/newtopic_notify.txt
+++ b/phpBB/language/en/email/newtopic_notify.txt
@@ -1,4 +1,5 @@
Subject: New topic notification - "{FORUM_NAME}"
+List-Unsubscribe: <{U_STOP_WATCHING_FORUM}>
Hello {USERNAME},
@@ -6,6 +7,10 @@ You are receiving this notification because you are watching the forum "{FORUM_N
{U_FORUM}
+To see new topic directly, visit the following link:
+
+{U_TOPIC}
+
If you no longer wish to watch this forum you can either click the "Unsubscribe forum" link found in the forum above, or by clicking the following link:
{U_STOP_WATCHING_FORUM}
diff --git a/phpBB/language/en/email/report_pm.txt b/phpBB/language/en/email/report_pm.txt
index a101a014ff..a6b8086a9a 100644
--- a/phpBB/language/en/email/report_pm.txt
+++ b/phpBB/language/en/email/report_pm.txt
@@ -1,4 +1,4 @@
-Subject: Private Message report - "{TOPIC_TITLE}"
+Subject: Private Message report - "{SUBJECT}"
Hello {USERNAME},
diff --git a/phpBB/language/en/email/topic_notify.txt b/phpBB/language/en/email/topic_notify.txt
index 20b86ee729..92bf85806e 100644
--- a/phpBB/language/en/email/topic_notify.txt
+++ b/phpBB/language/en/email/topic_notify.txt
@@ -1,4 +1,5 @@
Subject: Topic reply notification - "{TOPIC_TITLE}"
+List-Unsubscribe: <{U_STOP_WATCHING_TOPIC}>
Hello {USERNAME},
diff --git a/phpBB/language/en/help/faq.php b/phpBB/language/en/help/faq.php
index e59d950948..6b165da0f8 100644
--- a/phpBB/language/en/help/faq.php
+++ b/phpBB/language/en/help/faq.php
@@ -111,8 +111,8 @@ $lang = array_merge($lang, array(
'HELP_FAQ_LOGIN_CANNOT_REGISTER_QUESTION' => 'Why can’t I register?',
'HELP_FAQ_LOGIN_COPPA_ANSWER' => 'COPPA, or the Children’s Online Privacy Protection Act of 1998, is a law in the United States requiring websites which can potentially collect information from minors under the age of 13 to have written parental consent or some other method of legal guardian acknowledgment, allowing the collection of personally identifiable information from a minor under the age of 13. If you are unsure if this applies to you as someone trying to register or to the website you are trying to register on, contact legal counsel for assistance. Please note that phpBB Limited and the owners of this board cannot provide legal advice and is not a point of contact for legal concerns of any kind, except as outlined in question “Who do I contact about abusive and/or legal matters related to this board?”.',
'HELP_FAQ_LOGIN_COPPA_QUESTION' => 'What is COPPA?',
- 'HELP_FAQ_LOGIN_DELETE_COOKIES_ANSWER' => '“Delete all board cookies” deletes the cookies created by phpBB which keep you authenticated and logged into the board. Cookies also provide functions such as read tracking if they have been enabled by a board administrator. If you are having login or logout problems, deleting board cookies may help.',
- 'HELP_FAQ_LOGIN_DELETE_COOKIES_QUESTION' => 'What does the “Delete all board cookies” do?',
+ 'HELP_FAQ_LOGIN_DELETE_COOKIES_ANSWER' => '“Delete cookies” deletes the cookies created by phpBB which keep you authenticated and logged into the board. Cookies also provide functions such as read tracking if they have been enabled by a board administrator. If you are having login or logout problems, deleting board cookies may help.',
+ 'HELP_FAQ_LOGIN_DELETE_COOKIES_QUESTION' => 'What does the “Delete cookies” do?',
'HELP_FAQ_LOGIN_LOST_PASSWORD_ANSWER' => 'Don’t panic! While your password cannot be retrieved, it can easily be reset. Visit the login page and click <em>I forgot my password</em>. Follow the instructions and you should be able to log in again shortly.<br />However, if you are not able to reset your password, contact a board administrator.',
'HELP_FAQ_LOGIN_LOST_PASSWORD_QUESTION' => 'I’ve lost my password!',
'HELP_FAQ_LOGIN_REGISTER_ANSWER' => 'You may not have to, it is up to the administrator of the board as to whether you need to register in order to post messages. However; registration will give you access to additional features not available to guest users such as definable avatar images, private messaging, emailing of fellow users, usergroup subscription, etc. It only takes a few moments to register so it is recommended you do so.',
diff --git a/phpBB/language/en/install.php b/phpBB/language/en/install.php
index f7d9f58d43..9bceeccde7 100644
--- a/phpBB/language/en/install.php
+++ b/phpBB/language/en/install.php
@@ -49,7 +49,7 @@ $lang = array_merge($lang, array(
// Support page
'SUPPORT_TITLE' => 'Support',
- 'SUPPORT_BODY' => 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/community/viewtopic.php?f=14&amp;t=571070">The phpBB Welcome Package</a><br /><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/docs/en/3.1/ug/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, why not <a href="https://www.phpbb.com/support/">subscribe to our mailing list</a>?<br /><br />',
+ 'SUPPORT_BODY' => 'Full support will be provided for the current stable release of phpBB3, free of charge. This includes:</p><ul><li>installation</li><li>configuration</li><li>technical questions</li><li>problems relating to potential bugs in the software</li><li>updating from Release Candidate (RC) versions to the latest stable version</li><li>converting from phpBB 2.0.x to phpBB3</li><li>converting from other discussion board software to phpBB3 (please see the <a href="https://www.phpbb.com/community/viewforum.php?f=486">Convertors Forum</a>)</li></ul><p>We encourage users still running beta versions of phpBB3 to replace their installation with a fresh copy of the latest version.</p><h2>Extensions / Styles</h2><p>For issues relating to Extensions, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=451">Extensions Forum</a>.<br />For issues relating to styles, templates and themes, please post in the appropriate <a href="https://www.phpbb.com/community/viewforum.php?f=471">Styles Forum</a>.<br /><br />If your question relates to a specific package, please post directly in the topic dedicated to the package.</p><h2>Obtaining Support</h2><p><a href="https://www.phpbb.com/support/">Support Section</a><br /><a href="https://www.phpbb.com/support/docs/en/3.2/ug/quickstart/">Quick Start Guide</a><br /><br />To ensure you stay up to date with the latest news and releases, follow us on <a href="https://www.twitter.com/phpbb/">Twitter</a> and <a href="https://www.facebook.com/phpbb/">Facebook</a><br /><br />',
// License
'LICENSE_TITLE' => 'General Public License',
@@ -193,6 +193,7 @@ $lang = array_merge($lang, array(
'DB_OPTION_SQLITE3' => 'SQLite 3',
// Errors
+ 'INST_ERR_DB' => 'Database installation error',
'INST_ERR_NO_DB' => 'Cannot load the PHP module for the selected database type.',
'INST_ERR_DB_INVALID_PREFIX' => 'The prefix you entered is invalid. It must start with a letter and must only contain letters, numbers and underscores.',
'INST_ERR_PREFIX_TOO_LONG' => 'The table prefix you have specified is too long. The maximum length is %d characters.',
@@ -354,17 +355,40 @@ $lang = array_merge($lang, array(
<br />
+ <h1>How to update your installation with the Full Package</h1>
+
+ <p>The recommended way of updating your installation is using the full package. If core phpBB files have been modified in your installation you may wish to use the automatic update package in order to not lose these changes. You are also able to update your installation using the other methods listed within the INSTALL.html document. The steps for updating phpBB3 using the full package are:</p>
+
+ <ol style="margin-left: 20px; font-size: 1.1em;">
+ <li><strong class="error">Backup all board files and the database.</strong></li>
+ <li>Go to the <a href="https://www.phpbb.com/downloads/" title="https://www.phpbb.com/downloads/">phpBB.com downloads page</a> and download the latest "Full Package" archive.</li>
+ <li>Unpack the archive.</li>
+ <li>Remove (delete) the <code class="inline">config.php</code> file, and the <code class="inline">/images</code>, <code class="inline">/store</code> and <code class="inline">/files</code> folders <em>from the package</em> (not your site).</li>
+ <li>Go to the ACP, Board settings, and make sure prosilver is set as the default style. If not, set it to prosilver.</li>
+ <li>Delete the <code class="inline">/vendor</code> and <code class="inline">/cache</code> folders from the board’s root folder on the host.</li>
+ <li>Via FTP or SSH upload the remaining files and folders (that is, the remaining CONTENTS of the phpBB3 folder) to the root folder of your board installation on the server, overwriting the existing files. (Note: take care not to delete any extensions in your <code class="inline">/ext</code> folder when uploading the new phpBB3 contents.)</li>
+ <li><strong><a href="%1$s" title="%1$s">Now start the update process by pointing your browser to the install folder</a>.</strong></li>
+ <li>Follow the steps to update the database and let that run to completion.</li>
+ <li>Via FTP or SSH delete the <code class="inline">/install</code> folder from the root of your board installation.<br><br></li>
+ </ol>
+
+ <p>You now have a new up to date board containing all your users and posts. Follow up tasks:</p>
+ <ul style="margin-left: 20px; font-size: 1.1em;">
+ <li>Update your language pack</li>
+ <li>Update your style<br><br></li>
+ </ul>
+
<h1>How to update your installation with the Automatic Update Package</h1>
- <p>The recommended way of updating your installation listed here is only valid for the automatic update package. You are also able to update your installation using the methods listed within the INSTALL.html document. The steps for updating phpBB3 automatically are:</p>
+ <p>The automatic update package is only recommended in case core phpBB files have been modified in your installation. You are also able to update your installation using the methods listed within the INSTALL.html document. The steps for updating phpBB3 using the automatic update package are:</p>
- <ul style="margin-left: 20px; font-size: 1.1em;">
- <li>Go to the <a href="https://www.phpbb.com/downloads/" title="https://www.phpbb.com/downloads/">phpBB.com downloads page</a> and download the "Automatic Update Package" archive.<br /><br /></li>
- <li>Unpack the archive.<br /><br /></li>
- <li>Upload the complete uncompressed "install" and "vendor" folders to your phpBB root directory (where your config.php file is).<br /><br /></li>
- </ul>
+ <ol style="margin-left: 20px; font-size: 1.1em;">
+ <li>Go to the <a href="https://www.phpbb.com/downloads/" title="https://www.phpbb.com/downloads/">phpBB.com downloads page</a> and download the "Automatic Update Package" archive.</li>
+ <li>Unpack the archive.</li>
+ <li>Upload the complete uncompressed "install" and "vendor" folders to your phpBB root directory (where your config.php file is).<br><br></li>
+ </ol>
- <p>Once uploaded your board will be offline for normal users due to the install directory you uploaded now present.<br /><br />
+ <p>Once uploaded your board will be offline for normal users due to the install directory you uploaded now being present.<br /><br />
<strong><a href="%1$s" title="%1$s">Now start the update process by pointing your browser to the install folder</a>.</strong><br />
<br />
You will then be guided through the update process. You will be notified once the update is complete.
diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php
index 7c415b3457..426475e77a 100644
--- a/phpBB/language/en/posting.php
+++ b/phpBB/language/en/posting.php
@@ -43,6 +43,7 @@ $lang = array_merge($lang, array(
'ADD_POLL' => 'Poll creation',
'ADD_POLL_EXPLAIN' => 'If you do not want to add a poll to your topic leave the fields blank.',
'ALREADY_DELETED' => 'Sorry but this message is already deleted.',
+ 'ATTACH_COMMENT_NO_EMOJIS' => 'The attachment comment contains forbidden characters (Emoji).',
'ATTACH_DISK_FULL' => 'There is not enough free disk space to post this attachment.',
'ATTACH_QUOTA_REACHED' => 'Sorry, the board attachment quota has been reached.',
'ATTACH_SIG' => 'Attach a signature (signatures can be altered via the UCP)',
@@ -145,6 +146,7 @@ $lang = array_merge($lang, array(
'LOAD_DRAFT_EXPLAIN' => 'Here you are able to select the draft you want to continue writing. Your current post will be cancelled, all current post contents will be deleted. View, edit and delete drafts within your User Control Panel.',
'LOGIN_EXPLAIN_BUMP' => 'You need to login in order to bump topics within this forum.',
'LOGIN_EXPLAIN_DELETE' => 'You need to login in order to delete posts within this forum.',
+ 'LOGIN_EXPLAIN_SOFT_DELETE' => 'You need to login in order to soft-delete posts within this forum.',
'LOGIN_EXPLAIN_POST' => 'You need to login in order to post within this forum.',
'LOGIN_EXPLAIN_QUOTE' => 'You need to login in order to quote posts within this forum.',
'LOGIN_EXPLAIN_REPLY' => 'You need to login in order to reply to topics within this forum.',
diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php
index 5056e23d24..8549230b9f 100644
--- a/phpBB/language/en/ucp.php
+++ b/phpBB/language/en/ucp.php
@@ -89,6 +89,7 @@ $lang = array_merge($lang, array(
'ATTACHMENTS_EXPLAIN' => 'This is a list of attachments you have made in posts to this board.',
'ATTACHMENTS_DELETED' => 'Attachments successfully deleted.',
'ATTACHMENT_DELETED' => 'Attachment successfully deleted.',
+ 'ATTACHMENT_LOCKED' => 'This topic is locked, you cannot delete the attachment.',
'AUTOLOGIN_SESSION_KEYS_DELETED'=> 'The selected "Remember Me" login keys were successfully deleted.',
'AVATAR_CATEGORY' => 'Category',
'AVATAR_DRIVER_GRAVATAR_TITLE' => 'Gravatar',
@@ -115,7 +116,7 @@ $lang = array_merge($lang, array(
'BIRTHDAY' => 'Birthday',
'BIRTHDAY_EXPLAIN' => 'Setting a year will list your age when it is your birthday.',
'BOARD_DATE_FORMAT' => 'My date format',
- 'BOARD_DATE_FORMAT_EXPLAIN' => 'The syntax used is identical to the PHP <a href="http://www.php.net/date">date()</a> function.',
+ 'BOARD_DATE_FORMAT_EXPLAIN' => 'The syntax used is identical to the PHP <a href="https://secure.php.net/manual/function.date.php">date()</a> function.',
'BOARD_LANGUAGE' => 'My language',
'BOARD_STYLE' => 'My board style',
'BOARD_TIMEZONE' => 'My timezone',
@@ -272,6 +273,7 @@ $lang = array_merge($lang, array(
'IMPORTANT_NEWS' => 'Important announcements',
'INVALID_USER_BIRTHDAY' => 'The entered birthday is not a valid date.',
'INVALID_CHARS_USERNAME' => 'The username contains forbidden characters.',
+ 'INVALID_EMOJIS_USERNAME' => 'The username contains forbidden characters (Emoji).',
'INVALID_CHARS_NEW_PASSWORD'=> 'The password does not contain the required characters.',
'ITEMS_REQUIRED' => 'The items marked with * are required profile fields and need to be filled out.',
@@ -302,6 +304,7 @@ $lang = array_merge($lang, array(
'MESSAGE_EDITED' => 'Message successfully edited.',
'MESSAGE_HISTORY' => 'Message history',
'MESSAGE_REMOVED_FROM_OUTBOX' => 'This message was deleted by its author.',
+ 'MESSAGE_REPORTED_MESSAGE' => 'Reported message',
'MESSAGE_SENT_ON' => 'on',
'MESSAGE_STORED' => 'This message has been sent successfully.',
'MESSAGE_TO' => 'To',
@@ -373,10 +376,10 @@ $lang = array_merge($lang, array(
'NO_AUTH_EDIT_MESSAGE' => 'You are not authorised to edit private messages.',
'NO_AUTH_FORWARD_MESSAGE' => 'You are not authorised to forward private messages.',
'NO_AUTH_GROUP_MESSAGE' => 'You are not authorised to send private messages to groups.',
- 'NO_AUTH_PASSWORD_REMINDER' => 'You are not authorised to request a new password.',
'NO_AUTH_PROFILEINFO' => 'You are not authorised to change your profile information.',
'NO_AUTH_READ_HOLD_MESSAGE' => 'You are not authorised to read private messages that are on hold.',
'NO_AUTH_READ_MESSAGE' => 'You are not authorised to read private messages.',
+ 'NO_AUTH_PRINT_MESSAGE' => 'You are not authorised to print private messages.',
'NO_AUTH_READ_REMOVED_MESSAGE' => 'You are not able to read this message because it was removed by the author.',
'NO_AUTH_SEND_MESSAGE' => 'You are not authorised to send private messages.',
'NO_AUTH_SIGNATURE' => 'You are not authorised to define a signature.',
@@ -386,6 +389,7 @@ $lang = array_merge($lang, array(
'NO_BOOKMARKS_SELECTED' => 'You have selected no bookmarks.',
'NO_EDIT_READ_MESSAGE' => 'Private message cannot be edited because it has already been read.',
'NO_EMAIL_USER' => 'The email/username information submitted could not be found.',
+ 'EMAIL_NOT_UNIQUE' => 'Email you specified is used by multiple users. You must specify username as well.',
'NO_FOES' => 'No foes currently defined',
'NO_FRIENDS' => 'No friends currently defined',
'NO_FRIENDS_OFFLINE' => 'No friends offline',
@@ -411,7 +415,7 @@ $lang = array_merge($lang, array(
'PASS_TYPE_SYMBOL_EXPLAIN' => 'Password must be between %1$s and %2$s long, must contain letters in mixed case, must contain numbers and must contain symbols.',
'PASSWORD' => 'Password',
'PASSWORD_ACTIVATED' => 'Your new password has been activated.',
- 'PASSWORD_UPDATED' => 'A new password was sent to your registered email address.',
+ 'PASSWORD_UPDATED_IF_EXISTED' => 'If your account exists, a new password was sent to your registered email address. If you do not receive an email, it may be because you are banned, your account is not activated, or you are not allowed to change your password. Contact admin if any of those reasons apply. Also, check your spam filter.',
'PERMISSIONS_RESTORED' => 'Successfully restored original permissions.',
'PERMISSIONS_TRANSFERRED' => 'Successfully transferred permissions from <strong>%s</strong>, you are now able to browse the board with this user’s permissions.<br />Please note that admin permissions were not transferred. You are able to revert to your permission set at any time.',
'PM_DISABLED' => 'Private messaging has been disabled on this board.',
diff --git a/phpBB/language/en/viewforum.php b/phpBB/language/en/viewforum.php
index 9946a3eda4..e2a6e2a718 100644
--- a/phpBB/language/en/viewforum.php
+++ b/phpBB/language/en/viewforum.php
@@ -53,7 +53,8 @@ $lang = array_merge($lang, array(
'NEW_POSTS_LOCKED' => 'New posts [ Locked ]', // Not used anymore
'NO_NEW_POSTS_HOT' => 'No new posts [ Popular ]', // Not used anymore
'NO_NEW_POSTS_LOCKED' => 'No new posts [ Locked ]', // Not used anymore
- 'NO_READ_ACCESS' => 'You do not have the required permissions to read topics within this forum.',
+ 'NO_READ_ACCESS' => 'You do not have the required permissions to view or read topics within this forum.',
+ 'NO_FORUMS_IN_CATEGORY' => 'This category has no forums.',
'NO_UNREAD_POSTS_HOT' => 'No unread posts [ Popular ]',
'NO_UNREAD_POSTS_LOCKED' => 'No unread posts [ Locked ]',
diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php
index 5890eecdb6..5d127acb3d 100644
--- a/phpBB/language/en/viewtopic.php
+++ b/phpBB/language/en/viewtopic.php
@@ -88,6 +88,7 @@ $lang = array_merge($lang, array(
'NO_UNREAD_POSTS' => 'There are no new unread posts for this topic.',
'NO_VOTE_OPTION' => 'You must specify an option when voting.',
'NO_VOTES' => 'No votes',
+ 'NO_AUTH_PRINT_TOPIC' => 'You are not authorised to print topics.',
'POLL_ENDED_AT' => 'Poll ended at %s',
'POLL_RUN_TILL' => 'Poll runs till %s',
diff --git a/phpBB/mcp.php b/phpBB/mcp.php
index a5464f4a73..c4a8a66c18 100644
--- a/phpBB/mcp.php
+++ b/phpBB/mcp.php
@@ -36,7 +36,7 @@ $template->assign_var('S_IN_MCP', true);
$id = $request->variable('i', '');
$mode = $request->variable('mode', array(''));
-$mode = sizeof($mode) ? array_shift($mode) : $request->variable('mode', '');
+$mode = count($mode) ? array_shift($mode) : $request->variable('mode', '');
// Only Moderators can go beyond this point
if (!$user->data['is_registered'])
@@ -59,7 +59,7 @@ if ($forum_action !== '' && $request->variable('sort', false, false, \phpbb\requ
$action = $forum_action;
}
-if (sizeof($action_ary))
+if (count($action_ary))
{
list($action, ) = each($action_ary);
}
diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php
index 985b45acf7..ce7159c150 100644
--- a/phpBB/memberlist.php
+++ b/phpBB/memberlist.php
@@ -173,7 +173,7 @@ switch ($mode)
'LEFT_JOIN' => array(
array(
'FROM' => array(USERS_TABLE => 'u'),
- 'ON' => 'ug.user_id = u.user_id AND ug.user_pending = 0',
+ 'ON' => 'ug.user_id = u.user_id',
),
array(
'FROM' => array(GROUPS_TABLE => 'g'),
@@ -181,7 +181,7 @@ switch ($mode)
),
),
- 'WHERE' => $db->sql_in_set('g.group_id', $group_ids, false, true),
+ 'WHERE' => $db->sql_in_set('g.group_id', $group_ids, false, true) . ' AND ug.user_pending = 0',
'ORDER_BY' => 'u.username_clean ASC',
);
@@ -489,9 +489,31 @@ switch ($mode)
}
// Get user...
- $sql = 'SELECT *
- FROM ' . USERS_TABLE . '
- WHERE ' . (($username) ? "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'" : "user_id = $user_id");
+ $sql_array = array(
+ 'SELECT' => 'u.*',
+ 'FROM' => array(
+ USERS_TABLE => 'u'
+ ),
+ 'WHERE' => (($username) ? "u.username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'" : "u.user_id = $user_id"),
+ );
+
+ /**
+ * Modify user data SQL before member profile row is created
+ *
+ * @event core.memberlist_modify_viewprofile_sql
+ * @var int user_id The user ID
+ * @var string username The username
+ * @var array sql_array Array containing the main query
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'user_id',
+ 'username',
+ 'sql_array',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.memberlist_modify_viewprofile_sql', compact($vars)));
+
+ $sql = $db->sql_build_query('SELECT', $sql_array);
$result = $db->sql_query($sql);
$member = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
@@ -523,12 +545,37 @@ switch ($mode)
$sql_uid_ary = ($auth_hidden_groups) ? array($user_id) : array($user_id, (int) $user->data['user_id']);
// Do the SQL thang
- $sql = 'SELECT g.group_id, g.group_name, g.group_type, ug.user_id
- FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
- WHERE ' . $db->sql_in_set('ug.user_id', $sql_uid_ary) . '
- AND g.group_id = ug.group_id
- AND ug.user_pending = 0';
- $result = $db->sql_query($sql);
+ $sql_ary = [
+ 'SELECT' => 'g.group_id, g.group_name, g.group_type, ug.user_id',
+
+ 'FROM' => [
+ GROUPS_TABLE => 'g',
+ ],
+
+ 'LEFT_JOIN' => [
+ [
+ 'FROM' => [USER_GROUP_TABLE => 'ug'],
+ 'ON' => 'g.group_id = ug.group_id',
+ ],
+ ],
+
+ 'WHERE' => $db->sql_in_set('ug.user_id', $sql_uid_ary) . '
+ AND ug.user_pending = 0',
+ ];
+
+ /**
+ * Modify the query used to get the group data
+ *
+ * @event core.modify_memberlist_viewprofile_group_sql
+ * @var array sql_ary Array containing the query
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'sql_ary',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.modify_memberlist_viewprofile_group_sql', compact($vars)));
+
+ $result = $db->sql_query($db->sql_build_query('SELECT', $sql_ary));
// Divide data into profile data and current user data
$profile_groups = $user_groups = array();
@@ -567,6 +614,20 @@ switch ($mode)
unset($user_groups);
asort($group_sort);
+ /**
+ * Modify group data before options is created and data is unset
+ *
+ * @event core.modify_memberlist_viewprofile_group_data
+ * @var array group_data Array containing the group data
+ * @var array group_sort Array containing the sorted group data
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'group_data',
+ 'group_sort',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.modify_memberlist_viewprofile_group_data', compact($vars)));
+
$group_options = '';
foreach ($group_sort as $group_id => $null)
{
@@ -702,42 +763,58 @@ switch ($mode)
$member['posts_in_queue'] = 0;
}
- $template->assign_vars(array(
- 'L_POSTS_IN_QUEUE' => $user->lang('NUM_POSTS_IN_QUEUE', $member['posts_in_queue']),
+ // Define the main array of vars to assign to memberlist_view.html
+ $template_ary = array(
+ 'L_POSTS_IN_QUEUE' => $user->lang('NUM_POSTS_IN_QUEUE', $member['posts_in_queue']),
- 'POSTS_DAY' => $user->lang('POST_DAY', $posts_per_day),
- 'POSTS_PCT' => $user->lang('POST_PCT', $percentage),
+ 'POSTS_DAY' => $user->lang('POST_DAY', $posts_per_day),
+ 'POSTS_PCT' => $user->lang('POST_PCT', $percentage),
- 'SIGNATURE' => $member['user_sig'],
- 'POSTS_IN_QUEUE'=> $member['posts_in_queue'],
+ 'SIGNATURE' => $member['user_sig'],
+ 'POSTS_IN_QUEUE' => $member['posts_in_queue'],
- 'PM_IMG' => $user->img('icon_contact_pm', $user->lang['SEND_PRIVATE_MESSAGE']),
- 'L_SEND_EMAIL_USER' => $user->lang('SEND_EMAIL_USER', $member['username']),
- 'EMAIL_IMG' => $user->img('icon_contact_email', $user->lang['EMAIL']),
- 'JABBER_IMG' => $user->img('icon_contact_jabber', $user->lang['JABBER']),
- 'SEARCH_IMG' => $user->img('icon_user_search', $user->lang['SEARCH']),
+ 'PM_IMG' => $user->img('icon_contact_pm', $user->lang['SEND_PRIVATE_MESSAGE']),
+ 'L_SEND_EMAIL_USER' => $user->lang('SEND_EMAIL_USER', $member['username']),
+ 'EMAIL_IMG' => $user->img('icon_contact_email', $user->lang['EMAIL']),
+ 'JABBER_IMG' => $user->img('icon_contact_jabber', $user->lang['JABBER']),
+ 'SEARCH_IMG' => $user->img('icon_user_search', $user->lang['SEARCH']),
- 'S_PROFILE_ACTION' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group'),
- 'S_GROUP_OPTIONS' => $group_options,
- 'S_CUSTOM_FIELDS' => (isset($profile_fields['row']) && sizeof($profile_fields['row'])) ? true : false,
+ 'S_PROFILE_ACTION' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group'),
+ 'S_GROUP_OPTIONS' => $group_options,
+ 'S_CUSTOM_FIELDS' => (isset($profile_fields['row']) && count($profile_fields['row'])) ? true : false,
- 'U_USER_ADMIN' => ($auth->acl_get('a_user')) ? append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=overview&amp;u=' . $user_id, true, $user->session_id) : '',
- 'U_USER_BAN' => ($auth->acl_get('m_ban') && $user_id != $user->data['user_id']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=ban&amp;mode=user&amp;u=' . $user_id, true, $user->session_id) : '',
- 'U_MCP_QUEUE' => ($auth->acl_getf_global('m_approve')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue', true, $user->session_id) : '',
+ 'U_USER_ADMIN' => ($auth->acl_get('a_user')) ? append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=overview&amp;u=' . $user_id, true, $user->session_id) : '',
+ 'U_USER_BAN' => ($auth->acl_get('m_ban') && $user_id != $user->data['user_id']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=ban&amp;mode=user&amp;u=' . $user_id, true, $user->session_id) : '',
+ 'U_MCP_QUEUE' => ($auth->acl_getf_global('m_approve')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue', true, $user->session_id) : '',
- 'U_SWITCH_PERMISSIONS' => ($auth->acl_get('a_switchperm') && $user->data['user_id'] != $user_id) ? append_sid("{$phpbb_root_path}ucp.$phpEx", "mode=switch_perm&amp;u={$user_id}&amp;hash=" . generate_link_hash('switchperm')) : '',
- 'U_EDIT_SELF' => ($user_id == $user->data['user_id'] && $auth->acl_get('u_chgprofileinfo')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_profile&amp;mode=profile_info') : '',
+ 'U_SWITCH_PERMISSIONS' => ($auth->acl_get('a_switchperm') && $user->data['user_id'] != $user_id) ? append_sid("{$phpbb_root_path}ucp.$phpEx", "mode=switch_perm&amp;u={$user_id}&amp;hash=" . generate_link_hash('switchperm')) : '',
+ 'U_EDIT_SELF' => ($user_id == $user->data['user_id'] && $auth->acl_get('u_chgprofileinfo')) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_profile&amp;mode=profile_info') : '',
- 'S_USER_NOTES' => ($user_notes_enabled) ? true : false,
- 'S_WARN_USER' => ($warn_user_enabled) ? true : false,
- 'S_ZEBRA' => ($user->data['user_id'] != $user_id && $user->data['is_registered'] && $zebra_enabled) ? true : false,
- 'U_ADD_FRIEND' => (!$friend && !$foe && $friends_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
- 'U_ADD_FOE' => (!$friend && !$foe && $foes_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;mode=foes&amp;add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
- 'U_REMOVE_FRIEND' => ($friend && $friends_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;remove=1&amp;usernames[]=' . $user_id) : '',
- 'U_REMOVE_FOE' => ($foe && $foes_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;remove=1&amp;mode=foes&amp;usernames[]=' . $user_id) : '',
+ 'S_USER_NOTES' => ($user_notes_enabled) ? true : false,
+ 'S_WARN_USER' => ($warn_user_enabled) ? true : false,
+ 'S_ZEBRA' => ($user->data['user_id'] != $user_id && $user->data['is_registered'] && $zebra_enabled) ? true : false,
+ 'U_ADD_FRIEND' => (!$friend && !$foe && $friends_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
+ 'U_ADD_FOE' => (!$friend && !$foe && $foes_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;mode=foes&amp;add=' . urlencode(htmlspecialchars_decode($member['username']))) : '',
+ 'U_REMOVE_FRIEND' => ($friend && $friends_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;remove=1&amp;usernames[]=' . $user_id) : '',
+ 'U_REMOVE_FOE' => ($foe && $foes_enabled) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=zebra&amp;remove=1&amp;mode=foes&amp;usernames[]=' . $user_id) : '',
- 'U_CANONICAL' => generate_board_url() . '/' . append_sid("memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $user_id, true, ''),
- ));
+ 'U_CANONICAL' => generate_board_url() . '/' . append_sid("memberlist.$phpEx", 'mode=viewprofile&amp;u=' . $user_id, true, ''),
+ );
+
+ /**
+ * Modify user's template vars before we display the profile
+ *
+ * @event core.memberlist_modify_view_profile_template_vars
+ * @var array template_ary Array with user's template vars
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'template_ary',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.memberlist_modify_view_profile_template_vars', compact($vars)));
+
+ // Assign vars to memberlist_view.html
+ $template->assign_vars($template_ary);
if (!empty($profile_fields['row']))
{
@@ -933,7 +1010,7 @@ switch ($mode)
// We validate form and field here, only id/class allowed
$form = (!preg_match('/^[a-z0-9_-]+$/i', $form)) ? '' : $form;
$field = (!preg_match('/^[a-z0-9_-]+$/i', $field)) ? '' : $field;
- if ((($mode == '' || $mode == 'searchuser') || sizeof(array_intersect($request->variable_names(\phpbb\request\request_interface::GET), $search_params)) > 0) && ($config['load_search'] || $auth->acl_get('a_')))
+ if ((($mode == '' || $mode == 'searchuser') || count(array_intersect($request->variable_names(\phpbb\request\request_interface::GET), $search_params)) > 0) && ($config['load_search'] || $auth->acl_get('a_')))
{
$username = $request->variable('username', '', true);
$email = strtolower($request->variable('email', ''));
@@ -980,7 +1057,7 @@ switch ($mode)
$sql_where .= ($jabber) ? ' AND u.user_jabber ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), $jabber)) . ' ' : '';
$sql_where .= (is_numeric($count) && isset($find_key_match[$count_select])) ? ' AND u.user_posts ' . $find_key_match[$count_select] . ' ' . (int) $count . ' ' : '';
- if (isset($find_key_match[$joined_select]) && sizeof($joined) == 3)
+ if (isset($find_key_match[$joined_select]) && count($joined) == 3)
{
$joined_time = gmmktime(0, 0, 0, (int) $joined[1], (int) $joined[2], (int) $joined[0]);
@@ -990,13 +1067,24 @@ switch ($mode)
}
}
- if (isset($find_key_match[$active_select]) && sizeof($active) == 3 && $auth->acl_get('u_viewonline'))
+ if (isset($find_key_match[$active_select]) && count($active) == 3 && $auth->acl_get('u_viewonline'))
{
$active_time = gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]);
if ($active_time !== false)
{
- $sql_where .= " AND u.user_lastvisit " . $find_key_match[$active_select] . ' ' . $active_time;
+ if ($active_select === 'lt' && (int) $active[0] == 0 && (int) $active[1] == 0 && (int) $active[2] == 0)
+ {
+ $sql_where .= ' AND u.user_lastvisit = 0';
+ }
+ else if ($active_select === 'gt')
+ {
+ $sql_where .= ' AND u.user_lastvisit ' . $find_key_match[$active_select] . ' ' . $active_time;
+ }
+ else
+ {
+ $sql_where .= ' AND (u.user_lastvisit > 0 AND u.user_lastvisit < ' . $active_time . ')';
+ }
}
}
@@ -1146,18 +1234,18 @@ switch ($mode)
$avatar_img = phpbb_get_group_avatar($group_row);
// ... same for group rank
- $user_rank_data = array(
+ $group_rank_data = array(
'title' => null,
'img' => null,
'img_src' => null,
);
if ($group_row['group_rank'])
{
- $user_rank_data = phpbb_get_user_rank($group_row, false);
+ $group_rank_data = $group_helper->get_rank($group_row);
- if ($user_rank_data['img'])
+ if ($group_rank_data['img'])
{
- $user_rank_data['img'] .= '<br />';
+ $group_rank_data['img'] .= '<br />';
}
}
// include modules for manage groups link display or not
@@ -1184,11 +1272,11 @@ switch ($mode)
'GROUP_NAME' => $group_helper->get_name($group_row['group_name']),
'GROUP_COLOR' => $group_row['group_colour'],
'GROUP_TYPE' => $user->lang['GROUP_IS_' . $group_row['l_group_type']],
- 'GROUP_RANK' => $user_rank_data['title'],
+ 'GROUP_RANK' => $group_rank_data['title'],
'AVATAR_IMG' => $avatar_img,
- 'RANK_IMG' => $user_rank_data['img'],
- 'RANK_IMG_SRC' => $user_rank_data['img_src'],
+ 'RANK_IMG' => $group_rank_data['img'],
+ 'RANK_IMG_SRC' => $group_rank_data['img_src'],
'U_PM' => ($auth->acl_get('u_sendpm') && $auth->acl_get('u_masspm_group') && $group_row['group_receive_pm'] && $config['allow_privmsg'] && $config['allow_mass_pm']) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;g=' . $group_id) : '',
'U_MANAGE' => ($can_manage_group) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=ucp_groups&amp;mode=manage') : false,)
@@ -1308,11 +1396,6 @@ switch ($mode)
}
$sort_params[] = "mode=$mode";
- $pagination_url = append_sid("{$phpbb_root_path}memberlist.$phpEx", implode('&amp;', $params));
- $sort_url = append_sid("{$phpbb_root_path}memberlist.$phpEx", implode('&amp;', $sort_params));
-
- unset($search_params, $sort_params);
-
$u_first_char_params = implode('&amp;', $u_first_char_params);
$u_first_char_params .= ($u_first_char_params) ? '&amp;' : '';
@@ -1324,16 +1407,47 @@ switch ($mode)
}
$first_characters['other'] = $user->lang['OTHER'];
+ $first_char_block_vars = [];
+
foreach ($first_characters as $char => $desc)
{
- $template->assign_block_vars('first_char', array(
+ $first_char_block_vars[] = [
'DESC' => $desc,
'VALUE' => $char,
'S_SELECTED' => ($first_char == $char) ? true : false,
'U_SORT' => append_sid("{$phpbb_root_path}memberlist.$phpEx", $u_first_char_params . 'first_char=' . $char) . '#memberlist',
- ));
+ ];
}
+ /**
+ * Modify memberlist sort and pagination parameters
+ *
+ * @event core.memberlist_modify_sort_pagination_params
+ * @var array sort_params Array with URL parameters for sorting
+ * @var array params Array with URL parameters for pagination
+ * @var array first_characters Array that maps each letter in a-z, 'other' and the empty string to their display representation
+ * @var string u_first_char_params Concatenated URL parameters for first character search links
+ * @var array first_char_block_vars Template block variables for each first character
+ * @var int total_users Total number of users found in this search
+ * @since 3.2.6-RC1
+ */
+ $vars = [
+ 'sort_params',
+ 'params',
+ 'first_characters',
+ 'u_first_char_params',
+ 'first_char_block_vars',
+ 'total_users',
+ ];
+ extract($phpbb_dispatcher->trigger_event('core.memberlist_modify_sort_pagination_params', compact($vars)));
+
+ $template->assign_block_vars_array('first_char', $first_char_block_vars);
+
+ $pagination_url = append_sid("{$phpbb_root_path}memberlist.$phpEx", implode('&amp;', $params));
+ $sort_url = append_sid("{$phpbb_root_path}memberlist.$phpEx", implode('&amp;', $sort_params));
+
+ unset($search_params, $sort_params);
+
// Some search user specific data
if (($mode == '' || $mode == 'searchuser') && ($config['load_search'] || $auth->acl_get('a_')))
{
@@ -1449,7 +1563,7 @@ switch ($mode)
$leaders_set = false;
// So, did we get any users?
- if (sizeof($user_list))
+ if (count($user_list))
{
// Session time?! Session time...
$sql = 'SELECT session_user_id, MAX(session_time) AS session_time
@@ -1469,19 +1583,58 @@ switch ($mode)
// Do the SQL thang
if ($mode == 'group')
{
- $sql = "SELECT u.*
- $sql_select
- FROM " . USERS_TABLE . " u
- $sql_from
- WHERE " . $db->sql_in_set('u.user_id', $user_list) . "
- $sql_where_data";
+ $sql_from_ary = explode(',', $sql_from);
+ $extra_tables = [];
+ foreach ($sql_from_ary as $entry)
+ {
+ $table_data = explode(' ', trim($entry));
+
+ if (empty($table_data[0]) || empty($table_data[1]))
+ {
+ continue;
+ }
+
+ $extra_tables[$table_data[0]] = $table_data[1];
+ }
+
+ $sql_array = array(
+ 'SELECT' => 'u.*' . $sql_select,
+ 'FROM' => array_merge([USERS_TABLE => 'u'], $extra_tables),
+ 'WHERE' => $db->sql_in_set('u.user_id', $user_list) . $sql_where_data . '',
+ );
}
else
{
- $sql = 'SELECT *
- FROM ' . USERS_TABLE . '
- WHERE ' . $db->sql_in_set('user_id', $user_list);
+ $sql_array = array(
+ 'SELECT' => 'u.*',
+ 'FROM' => array(
+ USERS_TABLE => 'u'
+ ),
+ 'WHERE' => $db->sql_in_set('u.user_id', $user_list),
+ );
}
+
+ /**
+ * Modify user data SQL before member row is created
+ *
+ * @event core.memberlist_modify_memberrow_sql
+ * @var string mode Memberlist mode
+ * @var string sql_select Additional select statement
+ * @var string sql_from Additional from statement
+ * @var array sql_array Array containing the main query
+ * @var array user_list Array containing list of users
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'mode',
+ 'sql_select',
+ 'sql_from',
+ 'sql_array',
+ 'user_list',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.memberlist_modify_memberrow_sql', compact($vars)));
+
+ $sql = $db->sql_build_query('SELECT', $sql_array);
$result = $db->sql_query($sql);
$id_cache = array();
@@ -1492,9 +1645,10 @@ switch ($mode)
$id_cache[$row['user_id']] = $row;
}
+
$db->sql_freeresult($result);
- // Load custom profile fields
+ // Load custom profile fields if required
if ($config['load_cpf_memberlist'])
{
// Grab all profile fields from users in id cache for later use - similar to the poster cache
@@ -1534,7 +1688,7 @@ switch ($mode)
$vars = array('user_list', 'use_contact_fields');
extract($phpbb_dispatcher->trigger_event('core.memberlist_memberrow_before', compact($vars)));
- for ($i = 0, $end = sizeof($user_list); $i < $end; ++$i)
+ for ($i = 0, $end = count($user_list); $i < $end; ++$i)
{
$user_id = $user_list[$i];
$row = $id_cache[$user_id];
@@ -1550,21 +1704,21 @@ switch ($mode)
$memberrow = array_merge(phpbb_show_profile($row, false, false, false), array(
'ROW_NUMBER' => $i + ($start + 1),
- 'S_CUSTOM_PROFILE' => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
+ 'S_CUSTOM_PROFILE' => (isset($cp_row['row']) && count($cp_row['row'])) ? true : false,
'S_GROUP_LEADER' => $is_leader,
'S_INACTIVE' => $row['user_type'] == USER_INACTIVE,
'U_VIEW_PROFILE' => get_username_string('profile', $user_id, $row['username']),
));
- if (isset($cp_row['row']) && sizeof($cp_row['row']))
+ if (isset($cp_row['row']) && count($cp_row['row']))
{
$memberrow = array_merge($memberrow, $cp_row['row']);
}
$template->assign_block_vars('memberrow', $memberrow);
- if (isset($cp_row['blockrow']) && sizeof($cp_row['blockrow']))
+ if (isset($cp_row['blockrow']) && count($cp_row['blockrow']))
{
foreach ($cp_row['blockrow'] as $field_data)
{
diff --git a/phpBB/phpbb/attachment/delete.php b/phpBB/phpbb/attachment/delete.php
index 922f24b5dc..3c98e21587 100644
--- a/phpBB/phpbb/attachment/delete.php
+++ b/phpBB/phpbb/attachment/delete.php
@@ -104,6 +104,8 @@ class delete
$this->set_sql_constraints($mode);
+ $sql_id = $this->sql_id;
+
/**
* Perform additional actions before collecting data for attachment(s) deletion
*
@@ -122,11 +124,21 @@ class delete
);
extract($this->dispatcher->trigger_event('core.delete_attachments_collect_data_before', compact($vars)));
+ $this->sql_id = $sql_id;
+ unset($sql_id);
+
// Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled)
$this->collect_attachment_info($resync);
// Delete attachments from database
- $this->delete_attachments_from_db();
+ $this->delete_attachments_from_db($mode, $ids, $resync);
+
+ $sql_id = $this->sql_id;
+ $post_ids = $this->post_ids;
+ $topic_ids = $this->topic_ids;
+ $message_ids = $this->message_ids;
+ $physical = $this->physical;
+ $num_deleted = $this->num_deleted;
/**
* Perform additional actions after attachment(s) deletion from the database
@@ -156,13 +168,21 @@ class delete
);
extract($this->dispatcher->trigger_event('core.delete_attachments_from_database_after', compact($vars)));
+ $this->sql_id = $sql_id;
+ $this->post_ids = $post_ids;
+ $this->topic_ids = $topic_ids;
+ $this->message_ids = $message_ids;
+ $this->physical = $physical;
+ $this->num_deleted = $num_deleted;
+ unset($sql_id, $post_ids, $topic_ids, $message_ids, $physical, $num_deleted);
+
if (!$this->num_deleted)
{
return 0;
}
// Delete attachments from filesystem
- $this->remove_from_filesystem();
+ $this->remove_from_filesystem($mode, $ids, $resync);
// If we do not resync, we do not need to adjust any message, post, topic or user entries
if (!$resync)
@@ -288,8 +308,14 @@ class delete
/**
* Delete attachments from database table
*/
- protected function delete_attachments_from_db()
+ protected function delete_attachments_from_db($mode, $ids, $resync)
{
+ $sql_id = $this->sql_id;
+ $post_ids = $this->post_ids;
+ $topic_ids = $this->topic_ids;
+ $message_ids = $this->message_ids;
+ $physical = $this->physical;
+
/**
* Perform additional actions before attachment(s) deletion
*
@@ -316,6 +342,13 @@ class delete
);
extract($this->dispatcher->trigger_event('core.delete_attachments_before', compact($vars)));
+ $this->sql_id = $sql_id;
+ $this->post_ids = $post_ids;
+ $this->topic_ids = $topic_ids;
+ $this->message_ids = $message_ids;
+ $this->physical = $physical;
+ unset($sql_id, $post_ids, $topic_ids, $message_ids, $physical);
+
// Delete attachments
$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
WHERE ' . $this->db->sql_in_set($this->sql_id, $this->ids);
@@ -329,7 +362,7 @@ class delete
/**
* Delete attachments from filesystem
*/
- protected function remove_from_filesystem()
+ protected function remove_from_filesystem($mode, $ids, $resync)
{
$space_removed = $files_removed = 0;
@@ -348,6 +381,13 @@ class delete
}
}
+ $sql_id = $this->sql_id;
+ $post_ids = $this->post_ids;
+ $topic_ids = $this->topic_ids;
+ $message_ids = $this->message_ids;
+ $physical = $this->physical;
+ $num_deleted = $this->num_deleted;
+
/**
* Perform additional actions after attachment(s) deletion from the filesystem
*
@@ -380,6 +420,14 @@ class delete
);
extract($this->dispatcher->trigger_event('core.delete_attachments_from_filesystem_after', compact($vars)));
+ $this->sql_id = $sql_id;
+ $this->post_ids = $post_ids;
+ $this->topic_ids = $topic_ids;
+ $this->message_ids = $message_ids;
+ $this->physical = $physical;
+ $this->num_deleted = $num_deleted;
+ unset($sql_id, $post_ids, $topic_ids, $message_ids, $physical, $num_deleted);
+
if ($space_removed || $files_removed)
{
$this->config->increment('upload_dir_size', $space_removed * (-1), false);
diff --git a/phpBB/phpbb/attachment/resync.php b/phpBB/phpbb/attachment/resync.php
index 6c2e0a8b0d..aeacf82511 100644
--- a/phpBB/phpbb/attachment/resync.php
+++ b/phpBB/phpbb/attachment/resync.php
@@ -87,7 +87,7 @@ class resync
*/
public function resync($type, $ids)
{
- if (empty($type) || !is_array($ids) || !sizeof($ids) || !in_array($type, array('post', 'topic', 'message')))
+ if (empty($type) || !is_array($ids) || !count($ids) || !in_array($type, array('post', 'topic', 'message')))
{
return;
}
@@ -112,7 +112,7 @@ class resync
// Now only unset those ids remaining
$ids = array_diff($ids, $remaining_ids);
- if (sizeof($ids))
+ if (count($ids))
{
$sql = 'UPDATE ' . $this->resync_table . '
SET ' . $type . '_attachment = 0
diff --git a/phpBB/phpbb/attachment/upload.php b/phpBB/phpbb/attachment/upload.php
index f9863b372c..b9d32058db 100644
--- a/phpBB/phpbb/attachment/upload.php
+++ b/phpBB/phpbb/attachment/upload.php
@@ -162,7 +162,7 @@ class upload
// Make sure the image category only holds valid images...
$this->check_image($is_image);
- if (sizeof($this->file->error))
+ if (count($this->file->error))
{
$this->file->remove();
$this->file_data['error'] = array_merge($this->file_data['error'], $this->file->error);
diff --git a/phpBB/phpbb/auth/auth.php b/phpBB/phpbb/auth/auth.php
index dbd83f1eb0..f46a21a8ae 100644
--- a/phpBB/phpbb/auth/auth.php
+++ b/phpBB/phpbb/auth/auth.php
@@ -72,8 +72,8 @@ class auth
// Verify bitstring length with options provided...
$renew = false;
- $global_length = sizeof($this->acl_options['global']);
- $local_length = sizeof($this->acl_options['local']);
+ $global_length = count($this->acl_options['global']);
+ $local_length = count($this->acl_options['local']);
// Specify comparing length (bitstring is padded to 31 bits)
$global_length = ($global_length % 31) ? ($global_length - ($global_length % 31) + 31) : $global_length;
@@ -236,7 +236,7 @@ class auth
$sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE;
- if (sizeof($this->acl))
+ if (count($this->acl))
{
$sql .= ' WHERE ' . $db->sql_in_set('forum_id', array_keys($this->acl), true);
}
@@ -278,7 +278,7 @@ class auth
}
// If we get forum_ids not having this permission, we need to fill the remaining parts
- if ($negate && sizeof($this->acl_forum_ids))
+ if ($negate && count($this->acl_forum_ids))
{
foreach ($this->acl_forum_ids as $f)
{
@@ -455,7 +455,7 @@ class auth
{
$hold_str = '';
- if (sizeof($hold_ary))
+ if (count($hold_ary))
{
ksort($hold_ary);
diff --git a/phpBB/phpbb/auth/provider/ldap.php b/phpBB/phpbb/auth/provider/ldap.php
index c48b771ab0..0789a6234d 100644
--- a/phpBB/phpbb/auth/provider/ldap.php
+++ b/phpBB/phpbb/auth/provider/ldap.php
@@ -99,7 +99,7 @@ class ldap extends \phpbb\auth\provider\base
@ldap_close($ldap);
- if (!is_array($result) || sizeof($result) < 2)
+ if (!is_array($result) || count($result) < 2)
{
return sprintf($this->user->lang['LDAP_NO_IDENTITY'], $this->user->data['username']);
}
@@ -192,7 +192,7 @@ class ldap extends \phpbb\auth\provider\base
$ldap_result = @ldap_get_entries($ldap, $search);
- if (is_array($ldap_result) && sizeof($ldap_result) > 1)
+ if (is_array($ldap_result) && count($ldap_result) > 1)
{
if (@ldap_bind($ldap, $ldap_result[0]['dn'], htmlspecialchars_decode($password)))
{
diff --git a/phpBB/phpbb/auth/provider/oauth/oauth.php b/phpBB/phpbb/auth/provider/oauth/oauth.php
index fdc5f57df0..0d94acfbca 100644
--- a/phpBB/phpbb/auth/provider/oauth/oauth.php
+++ b/phpBB/phpbb/auth/provider/oauth/oauth.php
@@ -191,7 +191,7 @@ class oauth extends \phpbb\auth\provider\base
return $provider->login($username, $password);
}
- // Requst the name of the OAuth service
+ // Request the name of the OAuth service
$service_name_original = $this->request->variable('oauth_service', '', false);
$service_name = 'auth.provider.oauth.service.' . strtolower($service_name_original);
if ($service_name_original === '' || !array_key_exists($service_name, $this->service_providers))
@@ -221,12 +221,37 @@ class oauth extends \phpbb\auth\provider\base
'provider' => $service_name_original,
'oauth_provider_id' => $unique_id
);
+
$sql = 'SELECT user_id FROM ' . $this->auth_provider_oauth_token_account_assoc . '
WHERE ' . $this->db->sql_build_array('SELECT', $data);
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
+ $redirect_data = array(
+ 'auth_provider' => 'oauth',
+ 'login_link_oauth_service' => $service_name_original,
+ );
+
+ /**
+ * Event is triggered before check if provider is already associated with an account
+ *
+ * @event core.oauth_login_after_check_if_provider_id_has_match
+ * @var array row User row
+ * @var array data Provider data
+ * @var array redirect_data Data to be appended to the redirect url
+ * @var \OAuth\Common\Service\ServiceInterface service OAuth service
+ * @since 3.2.3-RC1
+ * @changed 3.2.6-RC1 Added redirect_data
+ */
+ $vars = array(
+ 'row',
+ 'data',
+ 'redirect_data',
+ 'service',
+ );
+ extract($this->dispatcher->trigger_event('core.oauth_login_after_check_if_provider_id_has_match', compact($vars)));
+
if (!$row)
{
// The user does not yet exist, ask to link or create profile
@@ -234,15 +259,12 @@ class oauth extends \phpbb\auth\provider\base
'status' => LOGIN_SUCCESS_LINK_PROFILE,
'error_msg' => 'LOGIN_OAUTH_ACCOUNT_NOT_LINKED',
'user_row' => array(),
- 'redirect_data' => array(
- 'auth_provider' => 'oauth',
- 'login_link_oauth_service' => $service_name_original,
- ),
+ 'redirect_data' => $redirect_data,
);
}
// Retrieve the user's account
- $sql = 'SELECT user_id, username, user_password, user_passchg, user_email, user_type, user_login_attempts
+ $sql = 'SELECT user_id, username, user_password, user_passchg, user_email, user_ip, user_type, user_login_attempts
FROM ' . $this->users_table . '
WHERE user_id = ' . (int) $row['user_id'];
$result = $this->db->sql_query($sql);
@@ -254,11 +276,36 @@ class oauth extends \phpbb\auth\provider\base
throw new \Exception('AUTH_PROVIDER_OAUTH_ERROR_INVALID_ENTRY');
}
+ /**
+ * Check if the user is banned.
+ * The fourth parameter, return, has to be true,
+ * otherwise the OAuth login is still called and
+ * an uncaught exception is thrown as there is no
+ * token stored in the database.
+ */
+ $ban = $this->user->check_ban($row['user_id'], $row['user_ip'], $row['user_email'], true);
+ if (!empty($ban))
+ {
+ $till_date = !empty($ban['ban_end']) ? $this->user->format_date($ban['ban_end']) : '';
+ $message = !empty($ban['ban_end']) ? 'BOARD_BAN_TIME' : 'BOARD_BAN_PERM';
+
+ $contact_link = phpbb_get_board_contact_link($this->config, $this->phpbb_root_path, $this->php_ext);
+ $message = $this->user->lang($message, $till_date, '<a href="' . $contact_link . '">', '</a>');
+ $message .= !empty($ban['ban_give_reason']) ? '<br /><br />' . $this->user->lang('BOARD_BAN_REASON', $ban['ban_give_reason']) : '';
+ $message .= !empty($ban['ban_triggered_by']) ? '<br /><br /><em>' . $this->user->lang('BAN_TRIGGERED_BY_' . strtoupper($ban['ban_triggered_by'])) . '</em>' : '';
+
+ return array(
+ 'status' => LOGIN_BREAK,
+ 'error_msg' => $message,
+ 'user_row' => $row,
+ );
+ }
+
// Update token storage to store the user_id
$storage->set_user_id($row['user_id']);
/**
- * Event is triggered after user is successfuly logged in via OAuth.
+ * Event is triggered after user is successfully logged in via OAuth.
*
* @event core.auth_oauth_login_after
* @var array row User row
@@ -376,7 +423,7 @@ class oauth extends \phpbb\auth\provider\base
if ($credentials['key'] && $credentials['secret'])
{
$actual_name = str_replace('auth.provider.oauth.service.', '', $service_name);
- $redirect_url = build_url(false) . '&login=external&oauth_service=' . $actual_name;
+ $redirect_url = generate_board_url() . '/ucp.' . $this->php_ext . '?mode=login&login=external&oauth_service=' . $actual_name;
$login_data['BLOCK_VARS'][$service_name] = array(
'REDIRECT_URL' => redirect($redirect_url, true),
'SERVICE_NAME' => $this->user->lang['AUTH_PROVIDER_OAUTH_SERVICE_' . strtoupper($actual_name)],
@@ -587,6 +634,21 @@ class oauth extends \phpbb\auth\provider\base
*/
protected function link_account_perform_link(array $data)
{
+ // Check if the external account is already associated with other user
+ $sql = 'SELECT user_id
+ FROM ' . $this->auth_provider_oauth_token_account_assoc . "
+ WHERE provider = '" . $this->db->sql_escape($data['provider']) . "'
+ AND oauth_provider_id = '" . $this->db->sql_escape($data['oauth_provider_id']) . "'";
+ $result = $this->db->sql_query($sql);
+ $row = $this->db->sql_fetchrow($result);
+ $this->db->sql_freeresult($result);
+
+ if ($row)
+ {
+ trigger_error('AUTH_PROVIDER_OAUTH_ERROR_ALREADY_LINKED');
+ }
+
+ // Link account
$sql = 'INSERT INTO ' . $this->auth_provider_oauth_token_account_assoc . '
' . $this->db->sql_build_array('INSERT', $data);
$this->db->sql_query($sql);
@@ -635,7 +697,7 @@ class oauth extends \phpbb\auth\provider\base
$oauth_user_ids = array();
- if ($rows !== false && sizeof($rows))
+ if ($rows !== false && count($rows))
{
foreach ($rows as $row)
{
@@ -658,6 +720,7 @@ class oauth extends \phpbb\auth\provider\base
'oauth_service' => $actual_name,
),
+ 'SERVICE_ID' => $actual_name,
'SERVICE_NAME' => $this->user->lang['AUTH_PROVIDER_OAUTH_SERVICE_' . strtoupper($actual_name)],
'UNIQUE_ID' => (isset($oauth_user_ids[$actual_name])) ? $oauth_user_ids[$actual_name] : null,
);
@@ -691,7 +754,7 @@ class oauth extends \phpbb\auth\provider\base
AND user_id = " . (int) $user_id;
$this->db->sql_query($sql);
- // Clear all tokens belonging to the user on this servce
+ // Clear all tokens belonging to the user on this service
$service_name = 'auth.provider.oauth.service.' . strtolower($link_data['oauth_service']);
$storage = new \phpbb\auth\provider\oauth\token_storage($this->db, $this->user, $this->auth_provider_oauth_token_storage_table, $this->auth_provider_oauth_state_table);
$storage->clearToken($service_name);
diff --git a/phpBB/phpbb/auth/provider/provider_interface.php b/phpBB/phpbb/auth/provider/provider_interface.php
index 35e0f559a1..463324ff46 100644
--- a/phpBB/phpbb/auth/provider/provider_interface.php
+++ b/phpBB/phpbb/auth/provider/provider_interface.php
@@ -71,9 +71,10 @@ interface provider_interface
* options with whatever configuraton values are passed to it as an array.
* It then returns the name of the acp file related to this authentication
* provider.
- * @param array $new_config Contains the new configuration values that
- * have been set in acp_board.
- * @return array|null Returns null if not implemented or an array with
+ *
+ * @param \phpbb\config\config $new_config Contains the new configuration values
+ * that have been set in acp_board.
+ * @return array|null Returns null if not implemented or an array with
* the template file name and an array of the vars
* that the template needs that must conform to the
* following example:
diff --git a/phpBB/phpbb/avatar/driver/local.php b/phpBB/phpbb/avatar/driver/local.php
index f5547c4bc6..4b84e4201c 100644
--- a/phpBB/phpbb/avatar/driver/local.php
+++ b/phpBB/phpbb/avatar/driver/local.php
@@ -64,7 +64,7 @@ class local extends \phpbb\avatar\driver\driver
$table_cols = isset($row['avatar_gallery_cols']) ? $row['avatar_gallery_cols'] : 4;
$row_count = $col_count = $avatar_pos = 0;
- $avatar_count = sizeof($avatar_list[$category]);
+ $avatar_count = count($avatar_list[$category]);
reset($avatar_list[$category]);
@@ -158,7 +158,7 @@ class local extends \phpbb\avatar\driver\driver
*/
protected function get_avatar_list($user)
{
- $avatar_list = ($this->cache == null) ? false : $this->cache->get('_avatar_local_list');
+ $avatar_list = ($this->cache == null) ? false : $this->cache->get('_avatar_local_list_' . $user->data['user_lang']);
if ($avatar_list === false)
{
@@ -198,7 +198,7 @@ class local extends \phpbb\avatar\driver\driver
if ($this->cache != null)
{
- $this->cache->put('_avatar_local_list', $avatar_list, 86400);
+ $this->cache->put('_avatar_local_list_' . $user->data['user_lang'], $avatar_list, 86400);
}
}
diff --git a/phpBB/phpbb/avatar/driver/upload.php b/phpBB/phpbb/avatar/driver/upload.php
index 887a0ff258..a012bb15b6 100644
--- a/phpBB/phpbb/avatar/driver/upload.php
+++ b/phpBB/phpbb/avatar/driver/upload.php
@@ -148,7 +148,8 @@ class upload extends \phpbb\avatar\driver\driver
// Do not allow specifying the port (see RFC 3986) or IP addresses
// remote_upload() will do its own check for allowed filetypes
- if (preg_match('@^(http|https|ftp)://[^/:?#]+:[0-9]+[/:?#]@i', $url) ||
+ if (!preg_match('#^(http|https|ftp)://(?:(.*?\.)*?[a-z0-9\-]+?\.[a-z]{2,4}|(?:\d{1,3}\.){3,5}\d{1,3}):?([0-9]*?).*?\.('. implode('|', $this->allowed_extensions) . ')$#i', $url) ||
+ preg_match('@^(http|https|ftp)://[^/:?#]+:[0-9]+[/:?#]@i', $url) ||
preg_match('#^(http|https|ftp)://(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])#i', $url) ||
preg_match('#^(http|https|ftp)://(?:(?:(?:[\dA-F]{1,4}:){6}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:::(?:[\dA-F]{1,4}:){0,5}(?:[\dA-F]{1,4}(?::[\dA-F]{1,4})?|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:):(?:[\dA-F]{1,4}:){4}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,2}:(?:[\dA-F]{1,4}:){3}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,3}:(?:[\dA-F]{1,4}:){2}(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,4}:(?:[\dA-F]{1,4}:)(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,5}:(?:[\dA-F]{1,4}:[\dA-F]{1,4}|(?:(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))|(?:(?:[\dA-F]{1,4}:){1,6}:[\dA-F]{1,4})|(?:(?:[\dA-F]{1,4}:){1,7}:)|(?:::))#i', $url))
{
@@ -167,7 +168,7 @@ class upload extends \phpbb\avatar\driver\driver
$file->clean_filename('avatar', $prefix, $row['id']);
// If there was an error during upload, then abort operation
- if (sizeof($file->error))
+ if (count($file->error))
{
$file->remove();
$error = $file->error;
@@ -203,15 +204,18 @@ class upload extends \phpbb\avatar\driver\driver
*
* @event core.avatar_driver_upload_move_file_before
* @var array filedata Array containing uploaded file data
+ * @var \phpbb\files\filespec file Instance of filespec class
* @var string destination Destination directory where the file is going to be moved
* @var string prefix Prefix for the avatar filename
* @var array row Array with avatar row data
* @var array error Array of errors, if filled in by this event file will not be moved
* @since 3.1.6-RC1
* @changed 3.1.9-RC1 Added filedata
+ * @changed 3.2.3-RC1 Added file
*/
$vars = array(
'filedata',
+ 'file',
'destination',
'prefix',
'row',
@@ -221,7 +225,7 @@ class upload extends \phpbb\avatar\driver\driver
unset($filedata);
- if (!sizeof($error))
+ if (!count($error))
{
// Move file and overwrite any existing image
$file->move_file($destination, true);
@@ -229,7 +233,7 @@ class upload extends \phpbb\avatar\driver\driver
// If there was an error during move, then clean up leftovers
$error = array_merge($error, $file->error);
- if (sizeof($error))
+ if (count($error))
{
$file->remove();
return false;
@@ -291,7 +295,7 @@ class upload extends \phpbb\avatar\driver\driver
);
extract($this->dispatcher->trigger_event('core.avatar_driver_upload_delete_before', compact($vars)));
- if (!sizeof($error) && $this->filesystem->exists($filename))
+ if (!count($error) && $this->filesystem->exists($filename))
{
try
{
diff --git a/phpBB/phpbb/avatar/manager.php b/phpBB/phpbb/avatar/manager.php
index 26eb17c265..a909a91042 100644
--- a/phpBB/phpbb/avatar/manager.php
+++ b/phpBB/phpbb/avatar/manager.php
@@ -22,6 +22,12 @@ class manager
protected $config;
/**
+ * phpBB event dispatcher
+ * @var \phpbb\event\dispatcher_interface
+ */
+ protected $phpbb_dispatcher;
+
+ /**
* Array that contains a list of enabled drivers
* @var array
*/
@@ -49,11 +55,13 @@ class manager
* Construct an avatar manager object
*
* @param \phpbb\config\config $config phpBB configuration
+ * @param \phpbb\event\dispatcher_interface $phpbb_dispatcher phpBB event dispatcher
* @param array $avatar_drivers Avatar drivers passed via the service container
*/
- public function __construct(\phpbb\config\config $config, $avatar_drivers)
+ public function __construct(\phpbb\config\config $config, \phpbb\event\dispatcher_interface $phpbb_dispatcher, $avatar_drivers)
{
$this->config = $config;
+ $this->phpbb_dispatcher = $phpbb_dispatcher;
$this->register_avatar_drivers($avatar_drivers);
}
@@ -263,7 +271,7 @@ class manager
$config_name = $driver->get_config_name();
return array(
- 'allow_avatar_' . $config_name => array('lang' => 'ALLOW_' . strtoupper(str_replace('\\', '_', $config_name)), 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
+ 'allow_avatar_' . $config_name => array('lang' => 'ALLOW_' . strtoupper(str_replace('\\', '_', $config_name)), 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
);
}
@@ -331,6 +339,19 @@ class manager
WHERE user_avatar = '" . $db->sql_escape($avatar_data['avatar']) . "'";
$db->sql_query($sql);
}
+
+ /**
+ * Event is triggered after user avatar has been deleted
+ *
+ * @event core.avatar_manager_avatar_delete_after
+ * @var \phpbb\user user phpBB user object
+ * @var array avatar_data Normalised avatar-related user data
+ * @var string table Table to delete avatar from
+ * @var string prefix Column prefix to delete avatar from
+ * @since 3.2.4-RC1
+ */
+ $vars = array('user', 'avatar_data', 'table', 'prefix');
+ extract($this->phpbb_dispatcher->trigger_event('core.avatar_manager_avatar_delete_after', compact($vars)));
}
/**
diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php
index 40192e4026..c96cf0de57 100644
--- a/phpBB/phpbb/cache/driver/apcu.php
+++ b/phpBB/phpbb/cache/driver/apcu.php
@@ -25,7 +25,11 @@ class apcu extends \phpbb\cache\driver\memory
*/
function purge()
{
- apcu_clear_cache();
+ /*
+ * Use an iterator to selectively delete our cache entries without disturbing
+ * any other cache users (e.g. other phpBB boards hosted on this server)
+ */
+ apcu_delete(new \APCUIterator('#^' . $this->key_prefix . '#'));
parent::purge();
}
diff --git a/phpBB/phpbb/cache/driver/base.php b/phpBB/phpbb/cache/driver/base.php
index f4b3dc278d..3eca521148 100644
--- a/phpBB/phpbb/cache/driver/base.php
+++ b/phpBB/phpbb/cache/driver/base.php
@@ -123,7 +123,7 @@ abstract class base implements \phpbb\cache\driver\driver_interface
*/
function sql_fetchrow($query_id)
{
- if ($this->sql_row_pointer[$query_id] < sizeof($this->sql_rowset[$query_id]))
+ if ($this->sql_row_pointer[$query_id] < count($this->sql_rowset[$query_id]))
{
return $this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]++];
}
@@ -136,7 +136,7 @@ abstract class base implements \phpbb\cache\driver\driver_interface
*/
function sql_fetchfield($query_id, $field)
{
- if ($this->sql_row_pointer[$query_id] < sizeof($this->sql_rowset[$query_id]))
+ if ($this->sql_row_pointer[$query_id] < count($this->sql_rowset[$query_id]))
{
return (isset($this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]][$field])) ? $this->sql_rowset[$query_id][$this->sql_row_pointer[$query_id]++][$field] : false;
}
@@ -149,7 +149,7 @@ abstract class base implements \phpbb\cache\driver\driver_interface
*/
function sql_rowseek($rownum, $query_id)
{
- if ($rownum >= sizeof($this->sql_rowset[$query_id]))
+ if ($rownum >= count($this->sql_rowset[$query_id]))
{
return false;
}
diff --git a/phpBB/phpbb/cache/driver/file.php b/phpBB/phpbb/cache/driver/file.php
index e9d2ba8e04..de6f444251 100644
--- a/phpBB/phpbb/cache/driver/file.php
+++ b/phpBB/phpbb/cache/driver/file.php
@@ -135,7 +135,7 @@ class file extends \phpbb\cache\driver\base
if (file_exists($this->cache_dir . 'data_global.' . $phpEx))
{
- if (!sizeof($this->vars))
+ if (!count($this->vars))
{
$this->load();
}
@@ -290,7 +290,7 @@ class file extends \phpbb\cache\driver\base
}
else
{
- if (!sizeof($this->vars))
+ if (!count($this->vars))
{
$this->load();
}
diff --git a/phpBB/phpbb/cache/driver/memory.php b/phpBB/phpbb/cache/driver/memory.php
index cc03804705..eba9549877 100644
--- a/phpBB/phpbb/cache/driver/memory.php
+++ b/phpBB/phpbb/cache/driver/memory.php
@@ -51,10 +51,11 @@ abstract class memory extends \phpbb\cache\driver\base
function load()
{
// grab the global cache
- $this->vars = $this->_read('global');
+ $data = $this->_read('global');
- if ($this->vars !== false)
+ if ($data !== false)
{
+ $this->vars = $data;
return true;
}
@@ -188,7 +189,7 @@ abstract class memory extends \phpbb\cache\driver\base
}
else
{
- if (!sizeof($this->vars))
+ if (!count($this->vars))
{
$this->load();
}
diff --git a/phpBB/phpbb/cache/service.php b/phpBB/phpbb/cache/service.php
index 8a4366fed1..502ae27625 100644
--- a/phpBB/phpbb/cache/service.php
+++ b/phpBB/phpbb/cache/service.php
@@ -227,7 +227,7 @@ class service
// Store allowed extensions forum wise
if ($row['allow_group'])
{
- $extensions['_allowed_post'][$extension] = (!sizeof($allowed_forums)) ? 0 : $allowed_forums;
+ $extensions['_allowed_post'][$extension] = (!count($allowed_forums)) ? 0 : $allowed_forums;
}
if ($row['allow_in_pm'])
diff --git a/phpBB/phpbb/captcha/char_cube3d.php b/phpBB/phpbb/captcha/char_cube3d.php
index a712b16dce..0255259ac4 100644
--- a/phpBB/phpbb/captcha/char_cube3d.php
+++ b/phpBB/phpbb/captcha/char_cube3d.php
@@ -220,7 +220,7 @@ class char_cube3d
*/
function scale($vector, $length)
{
- if (sizeof($vector) == 2)
+ if (count($vector) == 2)
{
return array($vector[0] * $length, $vector[1] * $length);
}
diff --git a/phpBB/phpbb/captcha/colour_manager.php b/phpBB/phpbb/captcha/colour_manager.php
index 6ca3c3fd2c..82332da810 100644
--- a/phpBB/phpbb/captcha/colour_manager.php
+++ b/phpBB/phpbb/captcha/colour_manager.php
@@ -256,7 +256,7 @@ class colour_manager
if (is_array($resource))
{
$results = array();
- for ($i = 0, $size = sizeof($resource); $i < $size; ++$i)
+ for ($i = 0, $size = count($resource); $i < $size; ++$i)
{
$results = array_merge($results, $this->mono_range($resource[$i], $count, $include_original));
}
diff --git a/phpBB/phpbb/captcha/gd.php b/phpBB/phpbb/captcha/gd.php
index e9538439c6..91b2f89d81 100644
--- a/phpBB/phpbb/captcha/gd.php
+++ b/phpBB/phpbb/captcha/gd.php
@@ -100,7 +100,7 @@ class gd
$noise_bitmaps = $this->captcha_noise_bg_bitmaps();
for ($i = 0; $i < $code_len; ++$i)
{
- $noise[$i] = new char_cube3d($noise_bitmaps, mt_rand(1, sizeof($noise_bitmaps['data'])));
+ $noise[$i] = new char_cube3d($noise_bitmaps, mt_rand(1, count($noise_bitmaps['data'])));
$noise[$i]->range();
//$box = $noise[$i]->dimensions($sizes[$i]);
@@ -1658,32 +1658,32 @@ class gd
'height' => 15,
'data' => array(
- 'A' => $chars['A'][mt_rand(0, min(sizeof($chars['A']), $config['captcha_gd_fonts']) -1)],
- 'B' => $chars['B'][mt_rand(0, min(sizeof($chars['B']), $config['captcha_gd_fonts']) -1)],
- 'C' => $chars['C'][mt_rand(0, min(sizeof($chars['C']), $config['captcha_gd_fonts']) -1)],
- 'D' => $chars['D'][mt_rand(0, min(sizeof($chars['D']), $config['captcha_gd_fonts']) -1)],
- 'E' => $chars['E'][mt_rand(0, min(sizeof($chars['E']), $config['captcha_gd_fonts']) -1)],
- 'F' => $chars['F'][mt_rand(0, min(sizeof($chars['F']), $config['captcha_gd_fonts']) -1)],
- 'G' => $chars['G'][mt_rand(0, min(sizeof($chars['G']), $config['captcha_gd_fonts']) -1)],
- 'H' => $chars['H'][mt_rand(0, min(sizeof($chars['H']), $config['captcha_gd_fonts']) -1)],
- 'I' => $chars['I'][mt_rand(0, min(sizeof($chars['I']), $config['captcha_gd_fonts']) -1)],
- 'J' => $chars['J'][mt_rand(0, min(sizeof($chars['J']), $config['captcha_gd_fonts']) -1)],
- 'K' => $chars['K'][mt_rand(0, min(sizeof($chars['K']), $config['captcha_gd_fonts']) -1)],
- 'L' => $chars['L'][mt_rand(0, min(sizeof($chars['L']), $config['captcha_gd_fonts']) -1)],
- 'M' => $chars['M'][mt_rand(0, min(sizeof($chars['M']), $config['captcha_gd_fonts']) -1)],
- 'N' => $chars['N'][mt_rand(0, min(sizeof($chars['N']), $config['captcha_gd_fonts']) -1)],
- 'O' => $chars['O'][mt_rand(0, min(sizeof($chars['O']), $config['captcha_gd_fonts']) -1)],
- 'P' => $chars['P'][mt_rand(0, min(sizeof($chars['P']), $config['captcha_gd_fonts']) -1)],
- 'Q' => $chars['Q'][mt_rand(0, min(sizeof($chars['Q']), $config['captcha_gd_fonts']) -1)],
- 'R' => $chars['R'][mt_rand(0, min(sizeof($chars['R']), $config['captcha_gd_fonts']) -1)],
- 'S' => $chars['S'][mt_rand(0, min(sizeof($chars['S']), $config['captcha_gd_fonts']) -1)],
- 'T' => $chars['T'][mt_rand(0, min(sizeof($chars['T']), $config['captcha_gd_fonts']) -1)],
- 'U' => $chars['U'][mt_rand(0, min(sizeof($chars['U']), $config['captcha_gd_fonts']) -1)],
- 'V' => $chars['V'][mt_rand(0, min(sizeof($chars['V']), $config['captcha_gd_fonts']) -1)],
- 'W' => $chars['W'][mt_rand(0, min(sizeof($chars['W']), $config['captcha_gd_fonts']) -1)],
- 'X' => $chars['X'][mt_rand(0, min(sizeof($chars['X']), $config['captcha_gd_fonts']) -1)],
- 'Y' => $chars['Y'][mt_rand(0, min(sizeof($chars['Y']), $config['captcha_gd_fonts']) -1)],
- 'Z' => $chars['Z'][mt_rand(0, min(sizeof($chars['Z']), $config['captcha_gd_fonts']) -1)],
+ 'A' => $chars['A'][mt_rand(0, min(count($chars['A']), $config['captcha_gd_fonts']) -1)],
+ 'B' => $chars['B'][mt_rand(0, min(count($chars['B']), $config['captcha_gd_fonts']) -1)],
+ 'C' => $chars['C'][mt_rand(0, min(count($chars['C']), $config['captcha_gd_fonts']) -1)],
+ 'D' => $chars['D'][mt_rand(0, min(count($chars['D']), $config['captcha_gd_fonts']) -1)],
+ 'E' => $chars['E'][mt_rand(0, min(count($chars['E']), $config['captcha_gd_fonts']) -1)],
+ 'F' => $chars['F'][mt_rand(0, min(count($chars['F']), $config['captcha_gd_fonts']) -1)],
+ 'G' => $chars['G'][mt_rand(0, min(count($chars['G']), $config['captcha_gd_fonts']) -1)],
+ 'H' => $chars['H'][mt_rand(0, min(count($chars['H']), $config['captcha_gd_fonts']) -1)],
+ 'I' => $chars['I'][mt_rand(0, min(count($chars['I']), $config['captcha_gd_fonts']) -1)],
+ 'J' => $chars['J'][mt_rand(0, min(count($chars['J']), $config['captcha_gd_fonts']) -1)],
+ 'K' => $chars['K'][mt_rand(0, min(count($chars['K']), $config['captcha_gd_fonts']) -1)],
+ 'L' => $chars['L'][mt_rand(0, min(count($chars['L']), $config['captcha_gd_fonts']) -1)],
+ 'M' => $chars['M'][mt_rand(0, min(count($chars['M']), $config['captcha_gd_fonts']) -1)],
+ 'N' => $chars['N'][mt_rand(0, min(count($chars['N']), $config['captcha_gd_fonts']) -1)],
+ 'O' => $chars['O'][mt_rand(0, min(count($chars['O']), $config['captcha_gd_fonts']) -1)],
+ 'P' => $chars['P'][mt_rand(0, min(count($chars['P']), $config['captcha_gd_fonts']) -1)],
+ 'Q' => $chars['Q'][mt_rand(0, min(count($chars['Q']), $config['captcha_gd_fonts']) -1)],
+ 'R' => $chars['R'][mt_rand(0, min(count($chars['R']), $config['captcha_gd_fonts']) -1)],
+ 'S' => $chars['S'][mt_rand(0, min(count($chars['S']), $config['captcha_gd_fonts']) -1)],
+ 'T' => $chars['T'][mt_rand(0, min(count($chars['T']), $config['captcha_gd_fonts']) -1)],
+ 'U' => $chars['U'][mt_rand(0, min(count($chars['U']), $config['captcha_gd_fonts']) -1)],
+ 'V' => $chars['V'][mt_rand(0, min(count($chars['V']), $config['captcha_gd_fonts']) -1)],
+ 'W' => $chars['W'][mt_rand(0, min(count($chars['W']), $config['captcha_gd_fonts']) -1)],
+ 'X' => $chars['X'][mt_rand(0, min(count($chars['X']), $config['captcha_gd_fonts']) -1)],
+ 'Y' => $chars['Y'][mt_rand(0, min(count($chars['Y']), $config['captcha_gd_fonts']) -1)],
+ 'Z' => $chars['Z'][mt_rand(0, min(count($chars['Z']), $config['captcha_gd_fonts']) -1)],
'1' => array(
array(0,0,0,1,1,0,0,0,0),
diff --git a/phpBB/phpbb/captcha/plugins/captcha_abstract.php b/phpBB/phpbb/captcha/plugins/captcha_abstract.php
index 82b08704ff..b508767d17 100644
--- a/phpBB/phpbb/captcha/plugins/captcha_abstract.php
+++ b/phpBB/phpbb/captcha/plugins/captcha_abstract.php
@@ -169,7 +169,7 @@ abstract class captcha_abstract
}
while ($row = $db->sql_fetchrow($result));
- if (sizeof($sql_in))
+ if (count($sql_in))
{
$sql = 'DELETE FROM ' . CONFIRM_TABLE . '
WHERE ' . $db->sql_in_set('session_id', $sql_in);
diff --git a/phpBB/phpbb/captcha/plugins/gd.php b/phpBB/phpbb/captcha/plugins/gd.php
index 831e5bcfdf..6d3c9bb3d2 100644
--- a/phpBB/phpbb/captcha/plugins/gd.php
+++ b/phpBB/phpbb/captcha/plugins/gd.php
@@ -51,7 +51,7 @@ class gd extends captcha_abstract
return 'CAPTCHA_GD';
}
- function acp_page($id, &$module)
+ function acp_page($id, $module)
{
global $user, $template, $phpbb_log, $request;
global $config;
diff --git a/phpBB/phpbb/captcha/plugins/gd_wave.php b/phpBB/phpbb/captcha/plugins/gd_wave.php
index bde46f8815..4ac26ed2b7 100644
--- a/phpBB/phpbb/captcha/plugins/gd_wave.php
+++ b/phpBB/phpbb/captcha/plugins/gd_wave.php
@@ -33,7 +33,7 @@ class gd_wave extends captcha_abstract
return '\\phpbb\\captcha\\gd_wave';
}
- function acp_page($id, &$module)
+ function acp_page($id, $module)
{
global $user;
diff --git a/phpBB/phpbb/captcha/plugins/nogd.php b/phpBB/phpbb/captcha/plugins/nogd.php
index 6845e5935c..da67cd2bf4 100644
--- a/phpBB/phpbb/captcha/plugins/nogd.php
+++ b/phpBB/phpbb/captcha/plugins/nogd.php
@@ -33,7 +33,7 @@ class nogd extends captcha_abstract
return '\\phpbb\\captcha\\non_gd';
}
- function acp_page($id, &$module)
+ function acp_page($id, $module)
{
global $user;
diff --git a/phpBB/phpbb/captcha/plugins/qa.php b/phpBB/phpbb/captcha/plugins/qa.php
index 9d481acc5d..966b8d32f2 100644
--- a/phpBB/phpbb/captcha/plugins/qa.php
+++ b/phpBB/phpbb/captcha/plugins/qa.php
@@ -21,7 +21,7 @@ class qa
{
var $confirm_id;
var $answer;
- var $question_ids;
+ var $question_ids = [];
var $question_text;
var $question_lang;
var $question_strict;
@@ -84,7 +84,7 @@ class qa
$db->sql_freeresult($result);
// fallback to the board default lang
- if (!sizeof($this->question_ids))
+ if (!count($this->question_ids))
{
$this->question_lang = $config['default_lang'];
@@ -101,14 +101,13 @@ class qa
}
// final fallback to any language
- if (!sizeof($this->question_ids))
+ if (!count($this->question_ids))
{
$this->question_lang = '';
$sql = 'SELECT q.question_id, q.lang_iso
FROM ' . $this->table_captcha_questions . ' q, ' . $this->table_captcha_answers . ' a
- WHERE q.question_id = a.question_id
- GROUP BY lang_iso';
+ WHERE q.question_id = a.question_id';
$result = $db->sql_query($sql, 7200);
while ($row = $db->sql_fetchrow($result))
@@ -311,7 +310,7 @@ class qa
}
while ($row = $db->sql_fetchrow($result));
- if (sizeof($sql_in))
+ if (count($sql_in))
{
$sql = 'DELETE FROM ' . $this->table_qa_confirm . '
WHERE ' . $db->sql_in_set('confirm_id', $sql_in);
@@ -395,7 +394,7 @@ class qa
$error = '';
- if (!sizeof($this->question_ids))
+ if (!count($this->question_ids))
{
/** @var \phpbb\log\log_interface $phpbb_log */
$phpbb_log->add('critical', $user->data['user_id'], $user->ip, 'LOG_ERROR_CAPTCHA', time(), array($user->lang('CONFIRM_QUESTION_MISSING')));
@@ -439,7 +438,7 @@ class qa
{
global $db, $user;
- if (!sizeof($this->question_ids))
+ if (!count($this->question_ids))
{
return;
}
@@ -465,7 +464,7 @@ class qa
{
global $db, $user;
- if (!sizeof($this->question_ids))
+ if (!count($this->question_ids))
{
return;
}
@@ -536,7 +535,7 @@ class qa
{
global $db, $user;
- if (!strlen($this->confirm_id) || !sizeof($this->question_ids))
+ if (!strlen($this->confirm_id) || !count($this->question_ids))
{
return false;
}
@@ -638,7 +637,7 @@ class qa
/**
* API function - The ACP backend, this marks the end of the easy methods
*/
- function acp_page($id, &$module)
+ function acp_page($id, $module)
{
global $config, $request, $phpbb_log, $template, $user;
@@ -776,7 +775,7 @@ class qa
/**
* This handles the list overview
*/
- function acp_question_list(&$module)
+ function acp_question_list($module)
{
global $db, $template;
@@ -979,7 +978,7 @@ class qa
if (!isset($langs[$question_data['lang_iso']]) ||
!strlen($question_data['question_text']) ||
- !sizeof($question_data['answers']) ||
+ !count($question_data['answers']) ||
!is_array($question_data['answers']))
{
return false;
diff --git a/phpBB/phpbb/captcha/plugins/recaptcha.php b/phpBB/phpbb/captcha/plugins/recaptcha.php
index 152709a9ea..b7c0b5f5e2 100644
--- a/phpBB/phpbb/captcha/plugins/recaptcha.php
+++ b/phpBB/phpbb/captcha/plugins/recaptcha.php
@@ -66,7 +66,7 @@ class recaptcha extends captcha_abstract
throw new \Exception('No generator class given.');
}
- function acp_page($id, &$module)
+ function acp_page($id, $module)
{
global $config, $template, $user, $phpbb_log, $request;
diff --git a/phpBB/phpbb/console/command/extension/enable.php b/phpBB/phpbb/console/command/extension/enable.php
index f92de0069c..a6f5b10e86 100644
--- a/phpBB/phpbb/console/command/extension/enable.php
+++ b/phpBB/phpbb/console/command/extension/enable.php
@@ -37,6 +37,13 @@ class enable extends command
$io = new SymfonyStyle($input, $output);
$name = $input->getArgument('extension-name');
+
+ if (!$this->manager->is_available($name))
+ {
+ $io->error($this->user->lang('CLI_EXTENSION_NOT_EXIST', $name));
+ return 1;
+ }
+
$extension = $this->manager->get_extension($name);
if (!$extension->is_enableable())
diff --git a/phpBB/phpbb/console/command/thumbnail/delete.php b/phpBB/phpbb/console/command/thumbnail/delete.php
index cfa9891fbc..7b95c20cf2 100644
--- a/phpBB/phpbb/console/command/thumbnail/delete.php
+++ b/phpBB/phpbb/console/command/thumbnail/delete.php
@@ -19,6 +19,11 @@ use Symfony\Component\Console\Style\SymfonyStyle;
class delete extends \phpbb\console\command\command
{
/**
+ * @var \phpbb\config\config
+ */
+ protected $config;
+
+ /**
* @var \phpbb\db\driver\driver_interface
*/
protected $db;
@@ -32,12 +37,14 @@ class delete extends \phpbb\console\command\command
/**
* Constructor
*
+ * @param \config\config $config The config
* @param \phpbb\user $user The user object (used to get language information)
* @param \phpbb\db\driver\driver_interface $db Database connection
* @param string $phpbb_root_path Root path
*/
- public function __construct(\phpbb\user $user, \phpbb\db\driver\driver_interface $db, $phpbb_root_path)
+ public function __construct(\phpbb\config\config $config, \phpbb\user $user, \phpbb\db\driver\driver_interface $db, $phpbb_root_path)
{
+ $this->config = $config;
$this->db = $db;
$this->phpbb_root_path = $phpbb_root_path;
@@ -101,13 +108,13 @@ class delete extends \phpbb\console\command\command
$return = 0;
while ($row = $this->db->sql_fetchrow($result))
{
- $thumbnail_path = $this->phpbb_root_path . 'files/thumb_' . $row['physical_filename'];
+ $thumbnail_path = $this->phpbb_root_path . $this->config['upload_path'] . '/thumb_' . $row['physical_filename'];
if (@unlink($thumbnail_path))
{
$thumbnail_deleted[] = $row['attach_id'];
- if (sizeof($thumbnail_deleted) === 250)
+ if (count($thumbnail_deleted) === 250)
{
$this->commit_changes($thumbnail_deleted);
$thumbnail_deleted = array();
diff --git a/phpBB/phpbb/console/command/thumbnail/generate.php b/phpBB/phpbb/console/command/thumbnail/generate.php
index 64f7555336..1f6582b17b 100644
--- a/phpBB/phpbb/console/command/thumbnail/generate.php
+++ b/phpBB/phpbb/console/command/thumbnail/generate.php
@@ -20,6 +20,11 @@ use Symfony\Component\Console\Style\SymfonyStyle;
class generate extends \phpbb\console\command\command
{
/**
+ * @var \phpbb\config\config
+ */
+ protected $config;
+
+ /**
* @var \phpbb\db\driver\driver_interface
*/
protected $db;
@@ -45,14 +50,16 @@ class generate extends \phpbb\console\command\command
/**
* Constructor
*
+ * @param \config\config $config The config
* @param \phpbb\user $user The user object (used to get language information)
* @param \phpbb\db\driver\driver_interface $db Database connection
* @param \phpbb\cache\service $cache The cache service
* @param string $phpbb_root_path Root path
* @param string $php_ext PHP extension
*/
- public function __construct(\phpbb\user $user, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $phpbb_root_path, $php_ext)
+ public function __construct(\phpbb\config\config $config, \phpbb\user $user, \phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, $phpbb_root_path, $php_ext)
{
+ $this->config = $config;
$this->db = $db;
$this->cache = $cache;
$this->phpbb_root_path = $phpbb_root_path;
@@ -126,8 +133,8 @@ class generate extends \phpbb\console\command\command
{
if (isset($extensions[$row['extension']]['display_cat']) && $extensions[$row['extension']]['display_cat'] == ATTACHMENT_CATEGORY_IMAGE)
{
- $source = $this->phpbb_root_path . 'files/' . $row['physical_filename'];
- $destination = $this->phpbb_root_path . 'files/thumb_' . $row['physical_filename'];
+ $source = $this->phpbb_root_path . $this->config['upload_path'] . '/' . $row['physical_filename'];
+ $destination = $this->phpbb_root_path . $this->config['upload_path'] . '/thumb_' . $row['physical_filename'];
if (create_thumbnail($source, $destination, $row['mimetype']))
{
diff --git a/phpBB/phpbb/console/exception_subscriber.php b/phpBB/phpbb/console/exception_subscriber.php
index b920d4abae..b240993203 100644
--- a/phpBB/phpbb/console/exception_subscriber.php
+++ b/phpBB/phpbb/console/exception_subscriber.php
@@ -29,12 +29,10 @@ class exception_subscriber implements EventSubscriberInterface
* Construct method
*
* @param \phpbb\language\language $language Language object
- * @param bool $debug Debug mode
*/
- public function __construct(\phpbb\language\language $language, $debug = false)
+ public function __construct(\phpbb\language\language $language)
{
$this->language = $language;
- $this->debug = $debug;
}
/**
@@ -52,14 +50,7 @@ class exception_subscriber implements EventSubscriberInterface
$parameters = array_merge(array($original_exception->getMessage()), $original_exception->get_parameters());
$message = call_user_func_array(array($this->language, 'lang'), $parameters);
- if ($this->debug)
- {
- $exception = new \RuntimeException($message , $original_exception->getCode(), $original_exception);
- }
- else
- {
- $exception = new \RuntimeException($message , $original_exception->getCode());
- }
+ $exception = new \RuntimeException($message , $original_exception->getCode(), $original_exception);
$event->setException($exception);
}
diff --git a/phpBB/phpbb/content_visibility.php b/phpBB/phpbb/content_visibility.php
index bf7dc2c703..f023e0742c 100644
--- a/phpBB/phpbb/content_visibility.php
+++ b/phpBB/phpbb/content_visibility.php
@@ -131,6 +131,42 @@ class content_visibility
return (int) $data[$mode . '_approved'] + (int) $data[$mode . '_unapproved'] + (int) $data[$mode . '_softdeleted'];
}
+
+ /**
+ * Check topic/post visibility for a given forum ID
+ *
+ * Note: Read permissions are not checked.
+ *
+ * @param $mode string Either "topic" or "post"
+ * @param $forum_id int The forum id is used for permission checks
+ * @param $data array Array with item information to check visibility
+ * @return bool True if the item is visible, false if not
+ */
+ public function is_visible($mode, $forum_id, $data)
+ {
+ $is_visible = $this->auth->acl_get('m_approve', $forum_id) || $data[$mode . '_visibility'] == ITEM_APPROVED;
+
+ /**
+ * Allow changing the result of calling is_visible
+ *
+ * @event core.phpbb_content_visibility_is_visible
+ * @var bool is_visible Default visibility condition, to be modified by extensions if needed.
+ * @var string mode Either "topic" or "post"
+ * @var int forum_id Forum id of the current item
+ * @var array data Array of item information
+ * @since 3.2.2-RC1
+ */
+ $vars = array(
+ 'is_visible',
+ 'mode',
+ 'forum_id',
+ 'data',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.phpbb_content_visibility_is_visible', compact($vars)));
+
+ return $is_visible;
+ }
+
/**
* Create topic/post visibility SQL for a given forum ID
*
@@ -176,10 +212,14 @@ class content_visibility
if ($this->auth->acl_get('m_approve', $forum_id))
{
- return $where_sql . '1 = 1';
+ $where_sql .= '1 = 1';
+ }
+ else
+ {
+ $where_sql .= $table_alias . $mode . '_visibility = ' . ITEM_APPROVED;
}
- return $where_sql . $table_alias . $mode . '_visibility = ' . ITEM_APPROVED;
+ return '(' . $where_sql . ')';
}
/**
@@ -195,16 +235,21 @@ class content_visibility
*/
public function get_forums_visibility_sql($mode, $forum_ids = array(), $table_alias = '')
{
- $where_sql = '(';
+ $where_sql = '';
- $approve_forums = array_intersect($forum_ids, array_keys($this->auth->acl_getf('m_approve', true)));
+ $approve_forums = array_keys($this->auth->acl_getf('m_approve', true));
+ if (!empty($forum_ids) && !empty($approve_forums))
+ {
+ $approve_forums = array_intersect($forum_ids, $approve_forums);
+ $forum_ids = array_diff($forum_ids, $approve_forums);
+ }
$get_forums_visibility_sql_overwrite = false;
/**
* Allow changing the result of calling get_forums_visibility_sql
*
* @event core.phpbb_content_visibility_get_forums_visibility_before
- * @var string where_sql The action the user tried to execute
+ * @var string where_sql Extra visibility conditions. It must end with either an SQL "AND" or an "OR"
* @var string mode Either "topic" or "post" depending on the query this is being used in
* @var array forum_ids Array of forum ids which the posts/topics are limited to
* @var string table_alias Table alias to prefix in SQL queries
@@ -229,33 +274,13 @@ class content_visibility
return $get_forums_visibility_sql_overwrite;
}
- if (sizeof($approve_forums))
- {
- // Remove moderator forums from the rest
- $forum_ids = array_diff($forum_ids, $approve_forums);
-
- if (!sizeof($forum_ids))
- {
- // The user can see all posts/topics in all specified forums
- return $where_sql . $this->db->sql_in_set($table_alias . 'forum_id', $approve_forums) . ')';
- }
- else
- {
- // Moderator can view all posts/topics in some forums
- $where_sql .= $this->db->sql_in_set($table_alias . 'forum_id', $approve_forums) . ' OR ';
- }
- }
- else
- {
- // The user is just a normal user
- return $where_sql . $table_alias . $mode . '_visibility = ' . ITEM_APPROVED . '
- AND ' . $this->db->sql_in_set($table_alias . 'forum_id', $forum_ids, false, true) . ')';
- }
-
+ // Moderator can view all posts/topics in the moderated forums
+ $where_sql .= '(' . $this->db->sql_in_set($table_alias . 'forum_id', $approve_forums, false, true) . ' OR ';
+ // Normal user can view approved items only
$where_sql .= '(' . $table_alias . $mode . '_visibility = ' . ITEM_APPROVED . '
- AND ' . $this->db->sql_in_set($table_alias . 'forum_id', $forum_ids) . '))';
+ AND ' . $this->db->sql_in_set($table_alias . 'forum_id', $forum_ids, false, true) . '))';
- return $where_sql;
+ return '(' . $where_sql . ')';
}
/**
@@ -281,12 +306,12 @@ class content_visibility
* Allow changing the result of calling get_global_visibility_sql
*
* @event core.phpbb_content_visibility_get_global_visibility_before
- * @var array where_sqls The action the user tried to execute
+ * @var array where_sqls Array of extra visibility conditions. Will be joined by imploding with "OR".
* @var string mode Either "topic" or "post" depending on the query this is being used in
* @var array exclude_forum_ids Array of forum ids the current user doesn't have access to
* @var string table_alias Table alias to prefix in SQL queries
* @var array approve_forums Array of forums where the user has m_approve permissions
- * @var string visibility_sql_overwrite Forces the function to return an implosion of where_sqls (joined by "OR")
+ * @var string visibility_sql_overwrite If not empty, forces the function to return visibility_sql_overwrite after executing the event
* @since 3.1.3-RC1
*/
$vars = array(
@@ -304,24 +329,17 @@ class content_visibility
return $visibility_sql_overwrite;
}
- if (sizeof($exclude_forum_ids))
- {
- $where_sqls[] = '(' . $this->db->sql_in_set($table_alias . 'forum_id', $exclude_forum_ids, true) . '
- AND ' . $table_alias . $mode . '_visibility = ' . ITEM_APPROVED . ')';
- }
- else
- {
- $where_sqls[] = $table_alias . $mode . '_visibility = ' . ITEM_APPROVED;
- }
+ // Include approved items in all forums but the excluded
+ $where_sqls[] = '(' . $this->db->sql_in_set($table_alias . 'forum_id', $exclude_forum_ids, true, true) . '
+ AND ' . $table_alias . $mode . '_visibility = ' . ITEM_APPROVED . ')';
- if (sizeof($approve_forums))
+ // If user has moderator permissions, add everything in the moderated forums
+ if (count($approve_forums))
{
$where_sqls[] = $this->db->sql_in_set($table_alias . 'forum_id', $approve_forums);
- return '(' . implode(' OR ', $where_sqls) . ')';
}
- // There is only one element, so we just return that one
- return $where_sqls[0];
+ return '(' . implode(' OR ', $where_sqls) . ')';
}
/**
@@ -437,12 +455,13 @@ class content_visibility
* @var int topic_id Topic of the post IDs to be modified.
* @var int forum_id Forum ID that the topic_id resides in.
* @var int user_id User ID doing this action.
- * @var int timestamp Timestamp of this action.
+ * @var int time Timestamp of this action.
* @var string reason Reason specified by the user for this change.
* @var bool is_starter Are we changing the topic's starter?
* @var bool is_latest Are we changing the topic's latest post?
* @var array data The data array for this action.
* @since 3.1.10-RC1
+ * @changed 3.2.2-RC1 Use time instead of non-existent timestamp
*/
$vars = array(
'visibility',
@@ -450,7 +469,7 @@ class content_visibility
'topic_id',
'forum_id',
'user_id',
- 'timestamp',
+ 'time',
'reason',
'is_starter',
'is_latest',
@@ -565,7 +584,7 @@ class content_visibility
$sql_ary[$recipient_field] = " + $count_increase";
}
- if (sizeof($sql_ary))
+ if (count($sql_ary))
{
$forum_sql = array();
@@ -622,12 +641,13 @@ class content_visibility
* @var int topic_id Topic of the post IDs to be modified.
* @var int forum_id Forum ID that the topic_id resides in.
* @var int user_id User ID doing this action.
- * @var int timestamp Timestamp of this action.
+ * @var int time Timestamp of this action.
* @var string reason Reason specified by the user for this change.
* @var bool is_starter Are we changing the topic's starter?
* @var bool is_latest Are we changing the topic's latest post?
* @var array data The data array for this action.
* @since 3.1.10-RC1
+ * @changed 3.2.2-RC1 Use time instead of non-existent timestamp
*/
$vars = array(
'visibility',
@@ -635,7 +655,7 @@ class content_visibility
'topic_id',
'forum_id',
'user_id',
- 'timestamp',
+ 'time',
'reason',
'is_starter',
'is_latest',
@@ -709,18 +729,19 @@ class content_visibility
* @var int topic_id Topic of the post IDs to be modified.
* @var int forum_id Forum ID that the topic_id resides in.
* @var int user_id User ID doing this action.
- * @var int timestamp Timestamp of this action.
+ * @var int time Timestamp of this action.
* @var string reason Reason specified by the user for this change.
* @var bool force_update_all Force an update on all posts within the topic, regardless of their current approval state.
* @var array data The data array for this action.
* @since 3.1.10-RC1
+ * @changed 3.2.2-RC1 Use time instead of non-existent timestamp
*/
$vars = array(
'visibility',
'topic_id',
'forum_id',
'user_id',
- 'timestamp',
+ 'time',
'reason',
'force_update_all',
'data',
@@ -758,18 +779,19 @@ class content_visibility
* @var int topic_id Topic of the post IDs to be modified.
* @var int forum_id Forum ID that the topic_id resides in.
* @var int user_id User ID doing this action.
- * @var int timestamp Timestamp of this action.
+ * @var int time Timestamp of this action.
* @var string reason Reason specified by the user for this change.
* @var bool force_update_all Force an update on all posts within the topic, regardless of their current approval state.
* @var array data The data array for this action.
* @since 3.1.10-RC1
+ * @changed 3.2.2-RC1 Use time instead of non-existent timestamp
*/
$vars = array(
'visibility',
'topic_id',
'forum_id',
'user_id',
- 'timestamp',
+ 'time',
'reason',
'force_update_all',
'data',
diff --git a/phpBB/phpbb/cron/task/core/prune_all_forums.php b/phpBB/phpbb/cron/task/core/prune_all_forums.php
index b47939ccbe..5005f5b894 100644
--- a/phpBB/phpbb/cron/task/core/prune_all_forums.php
+++ b/phpBB/phpbb/cron/task/core/prune_all_forums.php
@@ -55,21 +55,26 @@ class prune_all_forums extends \phpbb\cron\task\base
include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext);
}
- $sql = 'SELECT forum_id, prune_next, enable_prune, prune_days, prune_viewed, forum_flags, prune_freq
- FROM ' . FORUMS_TABLE . "
- WHERE enable_prune = 1
- AND prune_next < " . time();
+ $sql = 'SELECT forum_id, prune_next, enable_prune, prune_days, prune_viewed, enable_shadow_prune, prune_shadow_days, prune_shadow_freq, prune_shadow_next, forum_flags, prune_freq
+ FROM ' . FORUMS_TABLE;
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
- if ($row['prune_days'])
+ if ($row['enable_prune'] && $row['prune_next'] < time())
{
- auto_prune($row['forum_id'], 'posted', $row['forum_flags'], $row['prune_days'], $row['prune_freq']);
- }
+ if ($row['prune_days'])
+ {
+ auto_prune($row['forum_id'], 'posted', $row['forum_flags'], $row['prune_days'], $row['prune_freq']);
+ }
- if ($row['prune_viewed'])
+ if ($row['prune_viewed'])
+ {
+ auto_prune($row['forum_id'], 'viewed', $row['forum_flags'], $row['prune_viewed'], $row['prune_freq']);
+ }
+ }
+ if ($row['enable_shadow_prune'] && $row['prune_shadow_next'] < time() && $row['prune_shadow_days'])
{
- auto_prune($row['forum_id'], 'viewed', $row['forum_flags'], $row['prune_viewed'], $row['prune_freq']);
+ auto_prune($row['forum_id'], 'shadow', $row['forum_flags'], $row['prune_shadow_days'], $row['prune_shadow_freq']);
}
}
$this->db->sql_freeresult($result);
diff --git a/phpBB/phpbb/datetime.php b/phpBB/phpbb/datetime.php
index 63cdba90fd..4b799b6219 100644
--- a/phpBB/phpbb/datetime.php
+++ b/phpBB/phpbb/datetime.php
@@ -60,6 +60,12 @@ class datetime extends \DateTime
public function format($format = '', $force_absolute = false)
{
$format = $format ? $format : $this->user->date_format;
+
+ if (substr($this->user->lang_name, 0,2) != 'en')
+ {
+ $format = preg_replace('/([^\\\])S/','$1', $format);
+ }
+
$format = self::format_cache($format, $this->user);
$relative = ($format['is_short'] && !$force_absolute);
$now = new self($this->user, 'now', $this->user->timezone);
diff --git a/phpBB/phpbb/db/driver/driver.php b/phpBB/phpbb/db/driver/driver.php
index 214c5590e7..a36ce8c0d7 100644
--- a/phpBB/phpbb/db/driver/driver.php
+++ b/phpBB/phpbb/db/driver/driver.php
@@ -537,7 +537,9 @@ abstract class driver implements driver_interface
*/
function sql_in_set($field, $array, $negate = false, $allow_empty_set = false)
{
- if (!sizeof($array))
+ $array = (array) $array;
+
+ if (!count($array))
{
if (!$allow_empty_set)
{
@@ -559,12 +561,7 @@ abstract class driver implements driver_interface
}
}
- if (!is_array($array))
- {
- $array = array($array);
- }
-
- if (sizeof($array) == 1)
+ if (count($array) == 1)
{
@reset($array);
$var = current($array);
@@ -632,7 +629,7 @@ abstract class driver implements driver_interface
*/
function sql_multi_insert($table, $sql_ary)
{
- if (!sizeof($sql_ary))
+ if (!count($sql_ary))
{
return false;
}
@@ -738,7 +735,7 @@ abstract class driver implements driver_interface
// We run the following code to determine if we need to re-order the table array. ;)
// The reason for this is that for multi-aliased tables (two equal tables) in the FROM statement the last table need to match the first comparison.
// DBMS who rely on this: Oracle, PostgreSQL and MSSQL. For all other DBMS it makes absolutely no difference in which order the table is.
- if (!empty($array['LEFT_JOIN']) && sizeof($array['FROM']) > 1 && $used_multi_alias !== false)
+ if (!empty($array['LEFT_JOIN']) && count($array['FROM']) > 1 && $used_multi_alias !== false)
{
// Take first LEFT JOIN
$join = current($array['LEFT_JOIN']);
@@ -848,7 +845,7 @@ abstract class driver implements driver_interface
default:
- switch (sizeof($condition))
+ switch (count($condition))
{
case 3:
@@ -906,9 +903,10 @@ abstract class driver implements driver_interface
// Subquery with {left hand} {operator} {compare kind} {SELECT Kind } {Sub Query}
- $condition = $condition[self::LEFT_STMT] . ' ' . $condition[self::COMPARE_OP] . ' ' . $condition[self::SUBQUERY_OP] . ' ( ';
- $condition .= $this->sql_build_query($condition[self::SUBQUERY_SELECT_TYPE], $condition[self::SUBQUERY_BUILD]);
- $condition .= ' )';
+ $result = $condition[self::LEFT_STMT] . ' ' . $condition[self::COMPARE_OP] . ' ' . $condition[self::SUBQUERY_OP] . ' ( ';
+ $result .= $this->sql_build_query($condition[self::SUBQUERY_SELECT_TYPE], $condition[self::SUBQUERY_BUILD]);
+ $result .= ' )';
+ $condition = $result;
break;
@@ -1138,7 +1136,7 @@ abstract class driver implements driver_interface
$html_table = func_get_arg(2);
$row = func_get_arg(3);
- if (!$html_table && sizeof($row))
+ if (!$html_table && count($row))
{
$html_table = true;
$this->html_hold .= '<table cellspacing="1"><tr>';
diff --git a/phpBB/phpbb/db/driver/mssql_base.php b/phpBB/phpbb/db/driver/mssql_base.php
index 514df9eaca..98d16ca7fc 100644
--- a/phpBB/phpbb/db/driver/mssql_base.php
+++ b/phpBB/phpbb/db/driver/mssql_base.php
@@ -61,6 +61,14 @@ abstract class mssql_base extends \phpbb\db\driver\driver
}
/**
+ * {@inheritDoc}
+ */
+ function cast_expr_to_bigint($expression)
+ {
+ return 'CONVERT(BIGINT, ' . $expression . ')';
+ }
+
+ /**
* Build db-specific query data
* @access private
*/
diff --git a/phpBB/phpbb/db/driver/mssqlnative.php b/phpBB/phpbb/db/driver/mssqlnative.php
index 50dce35baa..a4dcac5966 100644
--- a/phpBB/phpbb/db/driver/mssqlnative.php
+++ b/phpBB/phpbb/db/driver/mssqlnative.php
@@ -50,7 +50,8 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
$this->db_connect_id = sqlsrv_connect($this->server, array(
'Database' => $this->dbname,
'UID' => $this->user,
- 'PWD' => $sqlpassword
+ 'PWD' => $sqlpassword,
+ 'CharacterSet' => 'UTF-8'
));
return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error('');
@@ -267,7 +268,7 @@ class mssqlnative extends \phpbb\db\driver\mssql_base
unset($row['line2'], $row['line3']);
}
}
- return (sizeof($row)) ? $row : false;
+ return ($row !== null) ? $row : false;
}
/**
diff --git a/phpBB/phpbb/db/driver/oracle.php b/phpBB/phpbb/db/driver/oracle.php
index 54238a15ef..5fd14709f8 100644
--- a/phpBB/phpbb/db/driver/oracle.php
+++ b/phpBB/phpbb/db/driver/oracle.php
@@ -136,7 +136,7 @@ class oracle extends \phpbb\db\driver\driver
*/
function _rewrite_col_compare($args)
{
- if (sizeof($args) == 4)
+ if (count($args) == 4)
{
if ($args[2] == '=')
{
@@ -290,7 +290,7 @@ class oracle extends \phpbb\db\driver\driver
and/or need the db restore script, uncomment this.
- if (sizeof($cols) !== sizeof($vals))
+ if (count($cols) !== count($vals))
{
// Try to replace some common data we know is from our restore script or from other sources
$regs[3] = str_replace("'||chr(47)||'", '/', $regs[3]);
@@ -332,7 +332,7 @@ class oracle extends \phpbb\db\driver\driver
if ($string)
{
// New value if cols != value
- $vals[(sizeof($cols) !== sizeof($vals)) ? $i : $i - 1] .= $string;
+ $vals[(count($cols) !== count($vals)) ? $i : $i - 1] .= $string;
}
$vals = array(0 => $vals);
diff --git a/phpBB/phpbb/db/extractor/mssql_extractor.php b/phpBB/phpbb/db/extractor/mssql_extractor.php
index 2817d3ebcc..4eeab4780e 100644
--- a/phpBB/phpbb/db/extractor/mssql_extractor.php
+++ b/phpBB/phpbb/db/extractor/mssql_extractor.php
@@ -132,14 +132,14 @@ class mssql_extractor extends base_extractor
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
- if (!sizeof($rows))
+ if (!count($rows))
{
$sql_data .= "ALTER TABLE [$table_name] WITH NOCHECK ADD\n";
$sql_data .= "\tCONSTRAINT [{$row['CONSTRAINT_NAME']}] PRIMARY KEY CLUSTERED \n\t(\n";
}
$rows[] = "\t\t[{$row['COLUMN_NAME']}]";
}
- if (sizeof($rows))
+ if (count($rows))
{
$sql_data .= implode(",\n", $rows);
$sql_data .= "\n\t) ON [PRIMARY] \nGO\n";
diff --git a/phpBB/phpbb/db/extractor/oracle_extractor.php b/phpBB/phpbb/db/extractor/oracle_extractor.php
index 79a991889b..bc43a37b10 100644
--- a/phpBB/phpbb/db/extractor/oracle_extractor.php
+++ b/phpBB/phpbb/db/extractor/oracle_extractor.php
@@ -82,7 +82,7 @@ class oracle_extractor extends base_extractor
}
$this->db->sql_freeresult($result);
- if (sizeof($primary_key))
+ if (count($primary_key))
{
$rows[] = " CONSTRAINT {$constraint_name} PRIMARY KEY (" . implode(', ', $primary_key) . ')';
}
@@ -103,7 +103,7 @@ class oracle_extractor extends base_extractor
}
$this->db->sql_freeresult($result);
- if (sizeof($unique))
+ if (count($unique))
{
$rows[] = " CONSTRAINT {$constraint_name} UNIQUE (" . implode(', ', $unique) . ')';
}
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php
index faef68121d..40bb58c10d 100644
--- a/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php
@@ -153,7 +153,10 @@ class release_3_0_6_rc1 extends \phpbb\db\migration\migration
'ACP_BOARD_CONFIGURATION',
array(
'module_basename' => 'acp_board',
- 'modes' => array('feed'),
+ 'module_langname' => 'ACP_FEED_SETTINGS',
+ 'module_mode' => 'feed',
+ 'module_auth' => 'acl_a_board',
+ 'after' => array('signature', 'ACP_SIGNATURE_SETTINGS'),
),
)),
array('module.add', array(
@@ -161,7 +164,11 @@ class release_3_0_6_rc1 extends \phpbb\db\migration\migration
'ACP_CAT_USERS',
array(
'module_basename' => 'acp_users',
- 'modes' => array('warnings'),
+ 'module_langname' => 'ACP_USER_WARNINGS',
+ 'module_mode' => 'warnings',
+ 'module_auth' => 'acl_a_user',
+ 'module_display' => false,
+ 'after' => array('feedback', 'ACP_USER_FEEDBACK'),
),
)),
array('module.add', array(
@@ -169,7 +176,9 @@ class release_3_0_6_rc1 extends \phpbb\db\migration\migration
'ACP_SERVER_CONFIGURATION',
array(
'module_basename' => 'acp_send_statistics',
- 'modes' => array('send_statistics'),
+ 'module_langname' => 'ACP_SEND_STATISTICS',
+ 'module_mode' => 'send_statistics',
+ 'module_auth' => 'acl_a_server',
),
)),
array('module.add', array(
@@ -177,7 +186,10 @@ class release_3_0_6_rc1 extends \phpbb\db\migration\migration
'ACP_FORUM_BASED_PERMISSIONS',
array(
'module_basename' => 'acp_permissions',
- 'modes' => array('setting_forum_copy'),
+ 'module_langname' => 'ACP_FORUM_PERMISSIONS_COPY',
+ 'module_mode' => 'setting_forum_copy',
+ 'module_auth' => 'acl_a_fauth && acl_a_authusers && acl_a_authgroups && acl_a_mauth',
+ 'after' => array('setting_forum_local', 'ACP_FORUM_PERMISSIONS'),
),
)),
array('module.add', array(
@@ -185,7 +197,29 @@ class release_3_0_6_rc1 extends \phpbb\db\migration\migration
'MCP_REPORTS',
array(
'module_basename' => 'mcp_pm_reports',
- 'modes' => array('pm_reports','pm_reports_closed','pm_report_details'),
+ 'module_langname' => 'MCP_PM_REPORTS_OPEN',
+ 'module_mode' => 'pm_reports',
+ 'module_auth' => 'acl_m_pm_report',
+ ),
+ )),
+ array('module.add', array(
+ 'mcp',
+ 'MCP_REPORTS',
+ array(
+ 'module_basename' => 'mcp_pm_reports',
+ 'module_langname' => 'MCP_PM_REPORTS_CLOSED',
+ 'module_mode' => 'pm_reports_closed',
+ 'module_auth' => 'acl_m_pm_report',
+ ),
+ )),
+ array('module.add', array(
+ 'mcp',
+ 'MCP_REPORTS',
+ array(
+ 'module_basename' => 'mcp_pm_reports',
+ 'module_langname' => 'MCP_PM_REPORT_DETAILS',
+ 'module_mode' => 'pm_report_details',
+ 'module_auth' => 'acl_m_pm_report',
),
)),
array('custom', array(array(&$this, 'add_newly_registered_group'))),
diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php
index 22fd51543b..836cb4577a 100644
--- a/phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php
+++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php
@@ -36,7 +36,10 @@ class release_3_0_8_rc1 extends \phpbb\db\migration\migration
'ACP_MESSAGES',
array(
'module_basename' => 'acp_board',
- 'modes' => array('post'),
+ 'module_langname' => 'ACP_POST_SETTINGS',
+ 'module_mode' => 'post',
+ 'module_auth' => 'acl_a_board',
+ 'after' => array('message', 'ACP_MESSAGE_SETTINGS'),
),
)),
array('config.add', array('load_unreads_search', 1)),
@@ -55,9 +58,14 @@ class release_3_0_8_rc1 extends \phpbb\db\migration\migration
$result = $this->db->sql_query($sql);
$extension_groups_updated = array();
- while ($lang_dir = $this->db->sql_fetchfield('lang_dir'))
+ while ($row = $this->db->sql_fetchrow($result))
{
- $lang_dir = basename($lang_dir);
+ if (empty($row['lang_dir']))
+ {
+ continue;
+ }
+
+ $lang_dir = basename($row['lang_dir']);
// The language strings we need are either in language/.../acp/attachments.php
// in the update package if we're updating to 3.0.8-RC1 or later,
diff --git a/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php
index 2d51bd53e4..1e2024a071 100644
--- a/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php
+++ b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php
@@ -17,7 +17,12 @@ class auth_provider_oauth extends \phpbb\db\migration\migration
{
public function effectively_installed()
{
- return $this->db_tools->sql_table_exists($this->table_prefix . 'auth_provider_oauth');
+ return $this->db_tools->sql_table_exists($this->table_prefix . 'oauth_tokens');
+ }
+
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v30x\release_3_0_0');
}
public function update_schema()
@@ -69,7 +74,9 @@ class auth_provider_oauth extends \phpbb\db\migration\migration
'UCP_PROFILE',
array(
'module_basename' => 'ucp_auth_link',
- 'modes' => array('auth_link'),
+ 'module_langname' => 'UCP_AUTH_LINK_MANAGE',
+ 'module_mode' => 'auth_link',
+ 'module_auth' => 'authmethod_oauth',
),
)),
);
diff --git a/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php b/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php
index 20bd547ac3..e48a9a1d3d 100644
--- a/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php
+++ b/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php
@@ -23,7 +23,9 @@ class contact_admin_acp_module extends \phpbb\db\migration\migration
'ACP_BOARD_CONFIGURATION',
array(
'module_basename' => 'acp_contact',
- 'modes' => array('contact'),
+ 'module_langname' => 'ACP_CONTACT_SETTINGS',
+ 'module_mode' => 'contact',
+ 'module_auth' => 'acl_a_board',
),
)),
);
diff --git a/phpBB/phpbb/db/migration/data/v310/dev.php b/phpBB/phpbb/db/migration/data/v310/dev.php
index 250258eea7..9cc953ad8d 100644
--- a/phpBB/phpbb/db/migration/data/v310/dev.php
+++ b/phpBB/phpbb/db/migration/data/v310/dev.php
@@ -125,7 +125,9 @@ class dev extends \phpbb\db\migration\container_aware_migration
'ACP_GROUPS',
array(
'module_basename' => 'acp_groups',
- 'modes' => array('position'),
+ 'module_langname' => 'ACP_GROUPS_POSITION',
+ 'module_mode' => 'position',
+ 'module_auth' => 'acl_a_group',
),
)),
array('module.add', array(
@@ -133,7 +135,9 @@ class dev extends \phpbb\db\migration\container_aware_migration
'ACP_ATTACHMENTS',
array(
'module_basename' => 'acp_attachments',
- 'modes' => array('manage'),
+ 'module_langname' => 'ACP_MANAGE_ATTACHMENTS',
+ 'module_mode' => 'manage',
+ 'module_auth' => 'acl_a_attach',
),
)),
array('module.add', array(
@@ -141,7 +145,19 @@ class dev extends \phpbb\db\migration\container_aware_migration
'ACP_STYLE_MANAGEMENT',
array(
'module_basename' => 'acp_styles',
- 'modes' => array('install', 'cache'),
+ 'module_langname' => 'ACP_STYLES_INSTALL',
+ 'module_mode' => 'install',
+ 'module_auth' => 'acl_a_styles',
+ ),
+ )),
+ array('module.add', array(
+ 'acp',
+ 'ACP_STYLE_MANAGEMENT',
+ array(
+ 'module_basename' => 'acp_styles',
+ 'module_langname' => 'ACP_STYLES_CACHE',
+ 'module_mode' => 'cache',
+ 'module_auth' => 'acl_a_styles',
),
)),
array('module.add', array(
@@ -149,7 +165,8 @@ class dev extends \phpbb\db\migration\container_aware_migration
'UCP_PROFILE',
array(
'module_basename' => 'ucp_profile',
- 'modes' => array('autologin_keys'),
+ 'module_langname' => 'UCP_PROFILE_AUTOLOGIN_KEYS',
+ 'module_mode' => 'autologin_keys',
),
)),
// Module will be renamed later
diff --git a/phpBB/phpbb/db/migration/data/v310/extensions.php b/phpBB/phpbb/db/migration/data/v310/extensions.php
index 3171435482..2e7c5c5316 100644
--- a/phpBB/phpbb/db/migration/data/v310/extensions.php
+++ b/phpBB/phpbb/db/migration/data/v310/extensions.php
@@ -66,7 +66,9 @@ class extensions extends \phpbb\db\migration\migration
'ACP_EXTENSION_MANAGEMENT',
array(
'module_basename' => 'acp_extensions',
- 'modes' => array('main'),
+ 'module_langname' => 'ACP_EXTENSIONS',
+ 'module_mode' => 'main',
+ 'module_auth' => 'acl_a_extensions',
),
)),
array('permission.add', array('a_extensions', true, 'a_styles')),
diff --git a/phpBB/phpbb/db/migration/data/v310/notifications.php b/phpBB/phpbb/db/migration/data/v310/notifications.php
index f4d012b5ac..789aaa3ba9 100644
--- a/phpBB/phpbb/db/migration/data/v310/notifications.php
+++ b/phpBB/phpbb/db/migration/data/v310/notifications.php
@@ -85,7 +85,9 @@ class notifications extends \phpbb\db\migration\migration
'UCP_MAIN',
array(
'module_basename' => 'ucp_notifications',
- 'modes' => array('notification_list'),
+ 'module_langname' => 'UCP_NOTIFICATION_LIST',
+ 'module_mode' => 'notification_list',
+ 'module_auth' => 'cfg_allow_board_notifications',
),
)),
array('module.add', array(
@@ -93,7 +95,8 @@ class notifications extends \phpbb\db\migration\migration
'UCP_PREFS',
array(
'module_basename' => 'ucp_notifications',
- 'modes' => array('notification_options'),
+ 'module_langname' => 'UCP_NOTIFICATION_OPTIONS',
+ 'module_mode' => 'notification_options',
),
)),
array('config.add', array('load_notifications', 1)),
diff --git a/phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php b/phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php
index 5e68db5889..90dab991e1 100644
--- a/phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php
+++ b/phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php
@@ -45,7 +45,9 @@ class softdelete_mcp_modules extends \phpbb\db\migration\migration
'MCP_QUEUE',
array(
'module_basename' => 'mcp_queue',
- 'modes' => array('deleted_topics'),
+ 'module_langname' => 'MCP_QUEUE_DELETED_TOPICS',
+ 'module_mode' => 'deleted_topics',
+ 'module_auth' => 'aclf_m_approve',
),
)),
array('module.add', array(
@@ -53,7 +55,9 @@ class softdelete_mcp_modules extends \phpbb\db\migration\migration
'MCP_QUEUE',
array(
'module_basename' => 'mcp_queue',
- 'modes' => array('deleted_posts'),
+ 'module_langname' => 'MCP_QUEUE_DELETED_POSTS',
+ 'module_mode' => 'deleted_posts',
+ 'module_auth' => 'aclf_m_approve',
),
)),
);
diff --git a/phpBB/phpbb/db/migration/data/v310/style_update_p1.php b/phpBB/phpbb/db/migration/data/v310/style_update_p1.php
index 2c7b7edf2e..a7e30a9cb7 100644
--- a/phpBB/phpbb/db/migration/data/v310/style_update_p1.php
+++ b/phpBB/phpbb/db/migration/data/v310/style_update_p1.php
@@ -133,7 +133,7 @@ class style_update_p1 extends \phpbb\db\migration\migration
}
// Remove old entries from styles table
- if (!sizeof($valid_styles))
+ if (!count($valid_styles))
{
// No valid styles: remove everything and add prosilver
$this->sql_query('DELETE FROM ' . STYLES_TABLE);
@@ -160,12 +160,12 @@ class style_update_p1 extends \phpbb\db\migration\migration
FROM ' . STYLES_TABLE . "
WHERE style_name = 'prosilver'";
$result = $this->sql_query($sql);
- $default_style = $this->db->sql_fetchfield('style_id');
+ $default_style = (int) $this->db->sql_fetchfield('style_id');
$this->db->sql_freeresult($result);
$this->config->set('default_style', $default_style);
- $sql = 'UPDATE ' . USERS_TABLE . ' SET user_style = 0';
+ $sql = 'UPDATE ' . USERS_TABLE . ' SET user_style = ' . (int) $default_style;
$this->sql_query($sql);
}
else
@@ -183,9 +183,9 @@ class style_update_p1 extends \phpbb\db\migration\migration
}
// Reset styles for users
- $this->sql_query('UPDATE ' . USERS_TABLE . '
- SET user_style = 0
- WHERE ' . $this->db->sql_in_set('user_style', $valid_styles, true));
+ $this->sql_query('UPDATE ' . USERS_TABLE . "
+ SET user_style = '" . (int) $valid_styles[0] . "'
+ WHERE " . $this->db->sql_in_set('user_style', $valid_styles, true));
}
}
}
diff --git a/phpBB/phpbb/db/migration/data/v310/teampage.php b/phpBB/phpbb/db/migration/data/v310/teampage.php
index f8edbc3492..3a37b17e97 100644
--- a/phpBB/phpbb/db/migration/data/v310/teampage.php
+++ b/phpBB/phpbb/db/migration/data/v310/teampage.php
@@ -93,13 +93,13 @@ class teampage extends \phpbb\db\migration\migration
$teampage_entries[] = array(
'group_id' => (int) $row['group_id'],
'teampage_name' => '',
- 'teampage_position' => sizeof($teampage_entries) + 1,
+ 'teampage_position' => count($teampage_entries) + 1,
'teampage_parent' => 0,
);
}
$this->db->sql_freeresult($result);
- if (sizeof($teampage_entries))
+ if (count($teampage_entries))
{
$this->db->sql_multi_insert(TEAMPAGE_TABLE, $teampage_entries);
}
diff --git a/phpBB/phpbb/db/migration/data/v31x/v3112.php b/phpBB/phpbb/db/migration/data/v31x/v3112.php
new file mode 100644
index 0000000000..0d75d35184
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v31x/v3112.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v31x;
+
+class v3112 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.1.12', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v31x\v3111',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.1.12')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php b/phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php
index 8fadb4bde4..804adc4490 100644
--- a/phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php
+++ b/phpBB/phpbb/db/migration/data/v320/add_help_phpbb.php
@@ -32,16 +32,15 @@ class add_help_phpbb extends \phpbb\db\migration\migration
return array(
array('config.add', array('help_send_statistics', true)),
array('config.add', array('help_send_statistics_time', 0)),
- array('if', array(
- array('module.exists', array('acp', false, 'ACP_SEND_STATISTICS')),
- array('module.remove', array('acp', false, 'ACP_SEND_STATISTICS')),
- )),
+ array('module.remove', array('acp', false, 'ACP_SEND_STATISTICS')),
array('module.add', array(
'acp',
'ACP_SERVER_CONFIGURATION',
array(
'module_basename' => 'acp_help_phpbb',
- 'modes' => array('help_phpbb'),
+ 'module_langname' => 'ACP_HELP_PHPBB',
+ 'module_mode' => 'help_phpbb',
+ 'module_auth' => 'acl_a_server',
),
)),
);
diff --git a/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php b/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php
index c14d31f1c0..88fe59ccc9 100644
--- a/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php
+++ b/phpBB/phpbb/db/migration/data/v320/remove_outdated_media.php
@@ -15,10 +15,17 @@ namespace phpbb\db\migration\data\v320;
class remove_outdated_media extends \phpbb\db\migration\migration
{
+ // Following constants were deprecated in 3.2
+ // and moved from constants.php to compatibility_globals.php,
+ // thus define them as class constants
+ const ATTACHMENT_CATEGORY_WM = 2;
+ const ATTACHMENT_CATEGORY_RM = 3;
+ const ATTACHMENT_CATEGORY_QUICKTIME = 6;
+
protected $cat_id = array(
- ATTACHMENT_CATEGORY_WM,
- ATTACHMENT_CATEGORY_RM,
- ATTACHMENT_CATEGORY_QUICKTIME,
+ self::ATTACHMENT_CATEGORY_WM,
+ self::ATTACHMENT_CATEGORY_RM,
+ self::ATTACHMENT_CATEGORY_QUICKTIME,
);
static public function depends_on()
@@ -78,13 +85,11 @@ class remove_outdated_media extends \phpbb\db\migration\migration
WHERE ' . $this->db->sql_in_set('group_id', $group_ids);
}
- $result = $this->db->sql_query($sql);
- $this->db->sql_freeresult($result);
+ $this->db->sql_query($sql);
// delete the now empty, outdated media extension groups
$sql = 'DELETE FROM ' . EXTENSION_GROUPS_TABLE . '
WHERE ' . $this->db->sql_in_set('group_id', $group_ids);
- $result = $this->db->sql_query($sql);
- $this->db->sql_freeresult($result);
+ $this->db->sql_query($sql);
}
}
diff --git a/phpBB/phpbb/db/migration/data/v32x/disable_remote_avatar.php b/phpBB/phpbb/db/migration/data/v32x/disable_remote_avatar.php
new file mode 100644
index 0000000000..b08833fad4
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/disable_remote_avatar.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration\data\v32x;
+
+use phpbb\db\migration\migration;
+
+class disable_remote_avatar extends migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v325',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('allow_avatar_remote', '0')),
+ array('config.update', array('allow_avatar_remote_upload', '0')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/email_force_sender.php b/phpBB/phpbb/db/migration/data/v32x/email_force_sender.php
new file mode 100644
index 0000000000..5319b7f76e
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/email_force_sender.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class email_force_sender extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v321',
+ );
+ }
+
+ public function effectively_installed()
+ {
+ return isset($this->config['email_force_sender']);
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.add', array('email_force_sender', '0')),
+ array('config.remove', array('email_function_name')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/enable_accurate_pm_button.php b/phpBB/phpbb/db/migration/data/v32x/enable_accurate_pm_button.php
new file mode 100644
index 0000000000..a7b99606f7
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/enable_accurate_pm_button.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class enable_accurate_pm_button extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v322',
+ );
+ }
+
+ public function effectively_installed()
+ {
+ return isset($this->config['enable_accurate_pm_button']);
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.add', array('enable_accurate_pm_button', '1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/f_list_topics_permission_add.php b/phpBB/phpbb/db/migration/data/v32x/f_list_topics_permission_add.php
new file mode 100644
index 0000000000..49727e5a62
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/f_list_topics_permission_add.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration\data\v32x;
+
+class f_list_topics_permission_add extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v321',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('permission.add', array('f_list_topics', false, 'f_read')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/fix_user_styles.php b/phpBB/phpbb/db/migration/data/v32x/fix_user_styles.php
new file mode 100644
index 0000000000..16fbdbc77b
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/fix_user_styles.php
@@ -0,0 +1,54 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class fix_user_styles extends \phpbb\db\migration\migration
+{
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v320\v320',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'styles_fix'))),
+ );
+ }
+
+ public function styles_fix()
+ {
+ $default_style = (int) $this->config['default_style'];
+ $enabled_styles = array();
+
+ // Get enabled styles
+ $sql = 'SELECT style_id
+ FROM ' . STYLES_TABLE . '
+ WHERE style_active = 1';
+ $result = $this->db->sql_query($sql);
+ while ($row = $this->db->sql_fetchrow($result))
+ {
+ $enabled_styles[] = (int) $row['style_id'];
+ }
+ $this->db->sql_freeresult($result);
+
+ // Set the default style to users who have an invalid style
+ $this->sql_query('UPDATE ' . USERS_TABLE . '
+ SET user_style = ' . (int) $default_style . '
+ WHERE ' . $this->db->sql_in_set('user_style', $enabled_styles, true));
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php b/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php
new file mode 100644
index 0000000000..afcecf2ef0
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/forum_topics_per_page_type.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class forum_topics_per_page_type extends \phpbb\db\migration\migration
+{
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v323',
+ );
+ }
+
+ public function update_schema()
+ {
+ return array(
+ 'change_columns' => array(
+ $this->table_prefix . 'forums' => array(
+ 'forum_topics_per_page' => array('USINT', 0),
+ ),
+ ),
+ );
+ }
+
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/jquery_update.php b/phpBB/phpbb/db/migration/data/v32x/jquery_update.php
new file mode 100644
index 0000000000..6dc58ec638
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/jquery_update.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration\data\v32x;
+
+class jquery_update extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return $this->config['load_jquery_url'] === '//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js';
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v325rc1',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('load_jquery_url', '//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js')),
+ );
+ }
+
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/merge_duplicate_bbcodes.php b/phpBB/phpbb/db/migration/data/v32x/merge_duplicate_bbcodes.php
new file mode 100644
index 0000000000..71ee19e3dd
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/merge_duplicate_bbcodes.php
@@ -0,0 +1,84 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class merge_duplicate_bbcodes extends \phpbb\db\migration\container_aware_migration
+{
+ public function update_data()
+ {
+ return [
+ ['custom', [[$this, 'update_bbcodes_table']]],
+ ];
+ }
+
+ public function update_bbcodes_table()
+ {
+ $sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline, bbcode_match, bbcode_tpl FROM ' . BBCODES_TABLE;
+ $result = $this->sql_query($sql);
+ $bbcodes = [];
+ while ($row = $this->db->sql_fetchrow($result))
+ {
+ $variant = (substr($row['bbcode_tag'], -1) === '=') ? 'with': 'without';
+ $bbcode_name = strtolower(rtrim($row['bbcode_tag'], '='));
+ $bbcodes[$bbcode_name][$variant] = $row;
+ }
+ $this->db->sql_freeresult($result);
+
+ foreach ($bbcodes as $bbcode_name => $variants)
+ {
+ if (count($variants) === 2)
+ {
+ $this->merge_bbcodes($variants['without'], $variants['with']);
+ }
+ }
+ }
+
+ protected function merge_bbcodes(array $without, array $with)
+ {
+ try
+ {
+ $merged = $this->container->get('text_formatter.s9e.bbcode_merger')->merge_bbcodes(
+ [
+ 'usage' => $without['bbcode_match'],
+ 'template' => $without['bbcode_tpl']
+ ],
+ [
+ 'usage' => $with['bbcode_match'],
+ 'template' => $with['bbcode_tpl']
+ ]
+ );
+ }
+ catch (\Exception $e)
+ {
+ // Ignore the pair and move on. The BBCodes would have to be fixed manually
+ return;
+ }
+
+ $bbcode_data = [
+ 'bbcode_tag' => $without['bbcode_tag'],
+ 'bbcode_helpline' => $without['bbcode_helpline'] . ' | ' . $with['bbcode_helpline'],
+ 'bbcode_match' => $merged['usage'],
+ 'bbcode_tpl' => $merged['template']
+ ];
+
+ $sql = 'UPDATE ' . BBCODES_TABLE . '
+ SET ' . $this->db->sql_build_array('UPDATE', $bbcode_data) . '
+ WHERE bbcode_id = ' . (int) $without['bbcode_id'];
+ $this->sql_query($sql);
+
+ $sql = 'DELETE FROM ' . BBCODES_TABLE . '
+ WHERE bbcode_id = ' . (int) $with['bbcode_id'];
+ $this->sql_query($sql);
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/remove_imagick.php b/phpBB/phpbb/db/migration/data/v32x/remove_imagick.php
new file mode 100644
index 0000000000..7ad396f8e8
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/remove_imagick.php
@@ -0,0 +1,31 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class remove_imagick extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v324rc1',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.remove', array('img_imagick')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/smtp_dynamic_data.php b/phpBB/phpbb/db/migration/data/v32x/smtp_dynamic_data.php
new file mode 100644
index 0000000000..aeaa3e8979
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/smtp_dynamic_data.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\db\migration\data\v32x;
+
+class smtp_dynamic_data extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v326rc1',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'set_smtp_dynamic'))),
+ );
+ }
+
+ public function set_smtp_dynamic()
+ {
+ $smtp_auth_entries = [
+ 'smtp_password',
+ 'smtp_username',
+ ];
+ $this->sql_query('UPDATE ' . CONFIG_TABLE . '
+ SET is_dynamic = 1
+ WHERE ' . $this->db->sql_in_set('config_name', $smtp_auth_entries));
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/timezone_p3.php b/phpBB/phpbb/db/migration/data/v32x/timezone_p3.php
new file mode 100644
index 0000000000..433f62ace9
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/timezone_p3.php
@@ -0,0 +1,29 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class timezone_p3 extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array('\phpbb\db\migration\data\v310\timezone');
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.remove', array('board_dst')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/update_prosilver_bitfield.php b/phpBB/phpbb/db/migration/data/v32x/update_prosilver_bitfield.php
new file mode 100644
index 0000000000..6e51a01834
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/update_prosilver_bitfield.php
@@ -0,0 +1,39 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class update_prosilver_bitfield extends \phpbb\db\migration\migration
+{
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v321',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('custom', array(array($this, 'update_bbcode_bitfield'))),
+ );
+ }
+
+ public function update_bbcode_bitfield()
+ {
+ $sql = 'UPDATE ' . STYLES_TABLE . "
+ SET bbcode_bitfield = '//g='
+ WHERE style_path = 'prosilver'";
+ $this->sql_query($sql);
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v321.php b/phpBB/phpbb/db/migration/data/v32x/v321.php
index 268f978b4b..fdbb5cff19 100644
--- a/phpBB/phpbb/db/migration/data/v32x/v321.php
+++ b/phpBB/phpbb/db/migration/data/v32x/v321.php
@@ -23,6 +23,7 @@ class v321 extends \phpbb\db\migration\migration
static public function depends_on()
{
return array(
+ '\phpbb\db\migration\data\v31x\v3111',
'\phpbb\db\migration\data\v32x\v321rc1',
);
diff --git a/phpBB/phpbb/db/migration/data/v32x/v322.php b/phpBB/phpbb/db/migration/data/v32x/v322.php
new file mode 100644
index 0000000000..7ecbbb3e79
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v322.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v322 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.2', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v31x\v3112',
+ '\phpbb\db\migration\data\v32x\v322rc1',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.2')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v322rc1.php b/phpBB/phpbb/db/migration/data/v32x/v322rc1.php
new file mode 100644
index 0000000000..4fd6270132
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v322rc1.php
@@ -0,0 +1,41 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v322rc1 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.2-RC1', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v321',
+ '\phpbb\db\migration\data\v32x\fix_user_styles',
+ '\phpbb\db\migration\data\v32x\update_prosilver_bitfield',
+ '\phpbb\db\migration\data\v32x\email_force_sender',
+ '\phpbb\db\migration\data\v32x\f_list_topics_permission_add',
+ '\phpbb\db\migration\data\v32x\merge_duplicate_bbcodes',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.2-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v323.php b/phpBB/phpbb/db/migration/data/v32x/v323.php
new file mode 100644
index 0000000000..1ec28ceb37
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v323.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v323 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.3', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v323rc2',
+ );
+
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.3')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v323rc1.php b/phpBB/phpbb/db/migration/data/v32x/v323rc1.php
new file mode 100644
index 0000000000..c3fcd1ab0b
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v323rc1.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v323rc1 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.3-RC1', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v322',
+ '\phpbb\db\migration\data\v32x\enable_accurate_pm_button',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.3-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v323rc2.php b/phpBB/phpbb/db/migration/data/v32x/v323rc2.php
new file mode 100644
index 0000000000..32235ee067
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v323rc2.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v323rc2 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.3-RC2', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v323rc1',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.3-RC2')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v324.php b/phpBB/phpbb/db/migration/data/v32x/v324.php
new file mode 100644
index 0000000000..cd7783fdee
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v324.php
@@ -0,0 +1,38 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v324 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.4', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v324rc1',
+ '\phpbb\db\migration\data\v32x\remove_imagick',
+ );
+
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.4')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v324rc1.php b/phpBB/phpbb/db/migration/data/v32x/v324rc1.php
new file mode 100644
index 0000000000..0221e2621a
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v324rc1.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v324rc1 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.4-RC1', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v323',
+ '\phpbb\db\migration\data\v32x\forum_topics_per_page_type',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.4-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v325.php b/phpBB/phpbb/db/migration/data/v32x/v325.php
new file mode 100644
index 0000000000..59de4916df
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v325.php
@@ -0,0 +1,38 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v325 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.5', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v325rc1',
+ '\phpbb\db\migration\data\v32x\jquery_update',
+ );
+
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.5')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v325rc1.php b/phpBB/phpbb/db/migration/data/v32x/v325rc1.php
new file mode 100644
index 0000000000..2d0de0a432
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v325rc1.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v325rc1 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.5-RC1', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v324',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.5-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v326.php b/phpBB/phpbb/db/migration/data/v32x/v326.php
new file mode 100644
index 0000000000..2d511b9ed8
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v326.php
@@ -0,0 +1,39 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v326 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.6', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v326rc1',
+ '\phpbb\db\migration\data\v32x\disable_remote_avatar',
+ '\phpbb\db\migration\data\v32x\smtp_dynamic_data',
+ );
+
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.6')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v326rc1.php b/phpBB/phpbb/db/migration/data/v32x/v326rc1.php
new file mode 100644
index 0000000000..092700d3db
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v326rc1.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v326rc1 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.6-RC1', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v325',
+ );
+
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.6-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v327.php b/phpBB/phpbb/db/migration/data/v32x/v327.php
new file mode 100644
index 0000000000..f9ea11f4b9
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v327.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v327 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.7', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v327rc1',
+ );
+
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.7')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v327rc1.php b/phpBB/phpbb/db/migration/data/v32x/v327rc1.php
new file mode 100644
index 0000000000..c8169105af
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v327rc1.php
@@ -0,0 +1,36 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v327rc1 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.7-RC1', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\v326',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.7-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/data/v32x/v328rc1.php b/phpBB/phpbb/db/migration/data/v32x/v328rc1.php
new file mode 100644
index 0000000000..fa43cf33a7
--- /dev/null
+++ b/phpBB/phpbb/db/migration/data/v32x/v328rc1.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\db\migration\data\v32x;
+
+class v328rc1 extends \phpbb\db\migration\migration
+{
+ public function effectively_installed()
+ {
+ return phpbb_version_compare($this->config['version'], '3.2.8-RC1', '>=');
+ }
+
+ static public function depends_on()
+ {
+ return array(
+ '\phpbb\db\migration\data\v32x\timezone_p3',
+ '\phpbb\db\migration\data\v32x\v327',
+ );
+ }
+
+ public function update_data()
+ {
+ return array(
+ array('config.update', array('version', '3.2.8-RC1')),
+ );
+ }
+}
diff --git a/phpBB/phpbb/db/migration/tool/config.php b/phpBB/phpbb/db/migration/tool/config.php
index 33aa8ff026..a351c4858e 100644
--- a/phpBB/phpbb/db/migration/tool/config.php
+++ b/phpBB/phpbb/db/migration/tool/config.php
@@ -134,7 +134,7 @@ class config implements \phpbb\db\migration\tool\tool_interface
case 'remove':
$call = 'add';
- if (sizeof($arguments) == 1)
+ if (count($arguments) == 1)
{
$arguments[] = '';
}
diff --git a/phpBB/phpbb/db/migration/tool/config_text.php b/phpBB/phpbb/db/migration/tool/config_text.php
index 54b45f6f6d..5fe9a25b70 100644
--- a/phpBB/phpbb/db/migration/tool/config_text.php
+++ b/phpBB/phpbb/db/migration/tool/config_text.php
@@ -110,7 +110,7 @@ class config_text implements \phpbb\db\migration\tool\tool_interface
case 'remove':
$call = 'add';
- if (sizeof($arguments) == 1)
+ if (count($arguments) == 1)
{
$arguments[] = '';
}
diff --git a/phpBB/phpbb/db/migration/tool/module.php b/phpBB/phpbb/db/migration/tool/module.php
index b47c426110..e5133c8152 100644
--- a/phpBB/phpbb/db/migration/tool/module.php
+++ b/phpBB/phpbb/db/migration/tool/module.php
@@ -84,9 +84,12 @@ class module implements \phpbb\db\migration\tool\tool_interface
* Use false to ignore the parent check and check class wide.
* @param int|string $module The module_id|module_langname you would like to
* check for to see if it exists
- * @return bool true/false if module exists
+ * @param bool $lazy Checks lazily if the module exists. Returns true if it exists in at
+ * least one given parent.
+ * @return bool true if module exists in *all* given parents, false if not in any given parent;
+ * true if ignoring parent check and module exists class wide, false if not found at all.
*/
- public function exists($class, $parent, $module)
+ public function exists($class, $parent, $module, $lazy = false)
{
// the main root directory should return true
if (!$module)
@@ -94,33 +97,48 @@ class module implements \phpbb\db\migration\tool\tool_interface
return true;
}
- $parent_sql = '';
+ $parent_sqls = [];
if ($parent !== false)
{
- $parent = $this->get_parent_module_id($parent, $module, false);
- if ($parent === false)
+ $parents = $this->get_parent_module_id($parent, $module, false);
+ if ($parents === false)
{
return false;
}
- $parent_sql = 'AND parent_id = ' . (int) $parent;
+ foreach ((array) $parents as $parent_id)
+ {
+ $parent_sqls[] = 'AND parent_id = ' . (int) $parent_id;
+ }
+ }
+ else
+ {
+ $parent_sqls[] = '';
}
- $sql = 'SELECT module_id
- FROM ' . $this->modules_table . "
- WHERE module_class = '" . $this->db->sql_escape($class) . "'
- $parent_sql
- AND " . ((is_numeric($module)) ? 'module_id = ' . (int) $module : "module_langname = '" . $this->db->sql_escape($module) . "'");
- $result = $this->db->sql_query($sql);
- $module_id = $this->db->sql_fetchfield('module_id');
- $this->db->sql_freeresult($result);
-
- if ($module_id)
+ foreach ($parent_sqls as $parent_sql)
{
- return true;
+ $sql = 'SELECT module_id
+ FROM ' . $this->modules_table . "
+ WHERE module_class = '" . $this->db->sql_escape($class) . "'
+ $parent_sql
+ AND " . ((is_numeric($module)) ? 'module_id = ' . (int) $module : "module_langname = '" . $this->db->sql_escape($module) . "'");
+ $result = $this->db->sql_query($sql);
+ $module_id = $this->db->sql_fetchfield('module_id');
+ $this->db->sql_freeresult($result);
+
+ if (!$lazy && !$module_id)
+ {
+ return false;
+ }
+ if ($lazy && $module_id)
+ {
+ return true;
+ }
}
- return false;
+ // Returns true, if modules exist in all parents and false otherwise
+ return !$lazy;
}
/**
@@ -172,7 +190,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
$data = array('module_langname' => $data);
}
- $parent = $data['parent_id'] = $this->get_parent_module_id($parent, $data);
+ $parents = (array) $this->get_parent_module_id($parent, $data);
if (!isset($data['module_langname']))
{
@@ -195,99 +213,135 @@ class module implements \phpbb\db\migration\tool\tool_interface
);
// Run the "manual" way with the data we've collected.
- $this->add($class, $parent, $new_module);
+ foreach ($parents as $parent)
+ {
+ $this->add($class, $parent, $new_module);
+ }
}
}
return;
}
- // The "manual" way
- if (!$this->exists($class, false, $parent))
- {
- throw new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent);
- }
-
- if ($this->exists($class, $parent, $data['module_langname']))
+ foreach ($parents as $parent)
{
- throw new \phpbb\db\migration\exception('MODULE_EXISTS', $data['module_langname']);
- }
+ $data['parent_id'] = $parent;
- $module_data = array(
- 'module_enabled' => (isset($data['module_enabled'])) ? $data['module_enabled'] : 1,
- 'module_display' => (isset($data['module_display'])) ? $data['module_display'] : 1,
- 'module_basename' => (isset($data['module_basename'])) ? $data['module_basename'] : '',
- 'module_class' => $class,
- 'parent_id' => (int) $parent,
- 'module_langname' => (isset($data['module_langname'])) ? $data['module_langname'] : '',
- 'module_mode' => (isset($data['module_mode'])) ? $data['module_mode'] : '',
- 'module_auth' => (isset($data['module_auth'])) ? $data['module_auth'] : '',
- );
-
- try
- {
- $this->module_manager->update_module_data($module_data);
+ // The "manual" way
+ if (!$this->exists($class, false, $parent))
+ {
+ throw new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent);
+ }
- // Success
- $module_log_name = ((isset($this->user->lang[$data['module_langname']])) ? $this->user->lang[$data['module_langname']] : $data['module_langname']);
- $phpbb_log->add('admin', (isset($user->data['user_id'])) ? $user->data['user_id'] : ANONYMOUS, $user->ip, 'LOG_MODULE_ADD', false, array($module_log_name));
+ if ($this->exists($class, $parent, $data['module_langname']))
+ {
+ throw new \phpbb\db\migration\exception('MODULE_EXISTS', $data['module_langname']);
+ }
- // Move the module if requested above/below an existing one
- if (isset($data['before']) && $data['before'])
+ $module_data = array(
+ 'module_enabled' => (isset($data['module_enabled'])) ? $data['module_enabled'] : 1,
+ 'module_display' => (isset($data['module_display'])) ? $data['module_display'] : 1,
+ 'module_basename' => (isset($data['module_basename'])) ? $data['module_basename'] : '',
+ 'module_class' => $class,
+ 'parent_id' => (int) $parent,
+ 'module_langname' => (isset($data['module_langname'])) ? $data['module_langname'] : '',
+ 'module_mode' => (isset($data['module_mode'])) ? $data['module_mode'] : '',
+ 'module_auth' => (isset($data['module_auth'])) ? $data['module_auth'] : '',
+ );
+
+ try
{
- $sql = 'SELECT left_id
+ $this->module_manager->update_module_data($module_data);
+
+ // Success
+ $module_log_name = ((isset($this->user->lang[$data['module_langname']])) ? $this->user->lang[$data['module_langname']] : $data['module_langname']);
+ $phpbb_log->add('admin', (isset($user->data['user_id'])) ? $user->data['user_id'] : ANONYMOUS, $user->ip, 'LOG_MODULE_ADD', false, array($module_log_name));
+
+ // Move the module if requested above/below an existing one
+ if (isset($data['before']) && $data['before'])
+ {
+ $before_mode = $before_langname = '';
+ if (is_array($data['before']))
+ {
+ // Restore legacy-legacy behaviour from phpBB 3.0
+ list($before_mode, $before_langname) = $data['before'];
+ }
+ else
+ {
+ // Legacy behaviour from phpBB 3.1+
+ $before_langname = $data['before'];
+ }
+
+ $sql = 'SELECT left_id
FROM ' . $this->modules_table . "
WHERE module_class = '" . $this->db->sql_escape($class) . "'
AND parent_id = " . (int) $parent . "
- AND module_langname = '" . $this->db->sql_escape($data['before']) . "'";
- $this->db->sql_query($sql);
- $to_left = (int) $this->db->sql_fetchfield('left_id');
+ AND module_langname = '" . $this->db->sql_escape($before_langname) . "'"
+ . (($before_mode) ? " AND module_mode = '" . $this->db->sql_escape($before_mode) . "'" : '');
+ $result = $this->db->sql_query($sql);
+ $to_left = (int) $this->db->sql_fetchfield('left_id');
+ $this->db->sql_freeresult($result);
- $sql = 'UPDATE ' . $this->modules_table . "
+ $sql = 'UPDATE ' . $this->modules_table . "
SET left_id = left_id + 2, right_id = right_id + 2
WHERE module_class = '" . $this->db->sql_escape($class) . "'
AND left_id >= $to_left
AND left_id < {$module_data['left_id']}";
- $this->db->sql_query($sql);
+ $this->db->sql_query($sql);
- $sql = 'UPDATE ' . $this->modules_table . "
+ $sql = 'UPDATE ' . $this->modules_table . "
SET left_id = $to_left, right_id = " . ($to_left + 1) . "
WHERE module_class = '" . $this->db->sql_escape($class) . "'
AND module_id = {$module_data['module_id']}";
- $this->db->sql_query($sql);
- }
- else if (isset($data['after']) && $data['after'])
- {
- $sql = 'SELECT right_id
+ $this->db->sql_query($sql);
+ }
+ else if (isset($data['after']) && $data['after'])
+ {
+ $after_mode = $after_langname = '';
+ if (is_array($data['after']))
+ {
+ // Restore legacy-legacy behaviour from phpBB 3.0
+ list($after_mode, $after_langname) = $data['after'];
+ }
+ else
+ {
+ // Legacy behaviour from phpBB 3.1+
+ $after_langname = $data['after'];
+ }
+
+ $sql = 'SELECT right_id
FROM ' . $this->modules_table . "
WHERE module_class = '" . $this->db->sql_escape($class) . "'
AND parent_id = " . (int) $parent . "
- AND module_langname = '" . $this->db->sql_escape($data['after']) . "'";
- $this->db->sql_query($sql);
- $to_right = (int) $this->db->sql_fetchfield('right_id');
+ AND module_langname = '" . $this->db->sql_escape($after_langname) . "'"
+ . (($after_mode) ? " AND module_mode = '" . $this->db->sql_escape($after_mode) . "'" : '');
+ $result = $this->db->sql_query($sql);
+ $to_right = (int) $this->db->sql_fetchfield('right_id');
+ $this->db->sql_freeresult($result);
- $sql = 'UPDATE ' . $this->modules_table . "
+ $sql = 'UPDATE ' . $this->modules_table . "
SET left_id = left_id + 2, right_id = right_id + 2
WHERE module_class = '" . $this->db->sql_escape($class) . "'
AND left_id >= $to_right
AND left_id < {$module_data['left_id']}";
- $this->db->sql_query($sql);
+ $this->db->sql_query($sql);
- $sql = 'UPDATE ' . $this->modules_table . '
+ $sql = 'UPDATE ' . $this->modules_table . '
SET left_id = ' . ($to_right + 1) . ', right_id = ' . ($to_right + 2) . "
WHERE module_class = '" . $this->db->sql_escape($class) . "'
AND module_id = {$module_data['module_id']}";
- $this->db->sql_query($sql);
+ $this->db->sql_query($sql);
+ }
+ }
+ catch (module_exception $e)
+ {
+ // Error
+ throw new \phpbb\db\migration\exception('MODULE_ERROR', $e->getMessage());
}
- }
- catch (module_exception $e)
- {
- // Error
- throw new \phpbb\db\migration\exception('MODULE_ERROR', $e->getMessage());
}
// Clear the Modules Cache
- $this->cache->destroy("_modules_$class");
+ $this->module_manager->remove_cache_file($class);
}
/**
@@ -334,7 +388,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
}
else
{
- if (!$this->exists($class, $parent, $module))
+ if (!$this->exists($class, $parent, $module, true))
{
return;
}
@@ -342,8 +396,8 @@ class module implements \phpbb\db\migration\tool\tool_interface
$parent_sql = '';
if ($parent !== false)
{
- $parent = $this->get_parent_module_id($parent, $module);
- $parent_sql = 'AND parent_id = ' . (int) $parent;
+ $parents = (array) $this->get_parent_module_id($parent, $module);
+ $parent_sql = 'AND ' . $this->db->sql_in_set('parent_id', $parents);
}
$module_ids = array();
@@ -371,7 +425,7 @@ class module implements \phpbb\db\migration\tool\tool_interface
$this->module_manager->delete_module($module_id, $class);
}
- $this->cache->destroy("_modules_$class");
+ $this->module_manager->remove_cache_file($class);
}
}
@@ -457,23 +511,14 @@ class module implements \phpbb\db\migration\tool\tool_interface
* @param string|int $parent_id The parent module_id|module_langname
* @param int|string|array $data The module_id, module_langname for existance checking or module data array for adding
* @param bool $throw_exception The flag indicating if exception should be thrown on error
- * @return mixed The int parent module_id or false
+ * @return mixed The int parent module_id, an array of int parent module_id values or false
* @throws \phpbb\db\migration\exception
*/
public function get_parent_module_id($parent_id, $data = '', $throw_exception = true)
{
- // Initialize exception object placeholder
- $exception = false;
-
// Allow '' to be sent as 0
$parent_id = $parent_id ?: 0;
- // If automatic adding is in action, convert array back to string to simplify things
- if (is_array($data) && sizeof($data) == 1)
- {
- $data = $data['module_langname'];
- }
-
if (!is_numeric($parent_id))
{
// Refresh the $module_categories array
@@ -482,65 +527,30 @@ class module implements \phpbb\db\migration\tool\tool_interface
// Search for the parent module_langname
$ids = array_keys($this->module_categories, $parent_id);
- switch (sizeof($ids))
+ switch (count($ids))
{
// No parent with the given module_langname exist
case 0:
- $exception = new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent_id);
+ if ($throw_exception)
+ {
+ throw new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent_id);
+ }
+
+ return false;
break;
// Return the module id
case 1:
- $parent_id = (int) $ids[0];
+ return (int) $ids[0];
break;
- // Several modules with the given module_langname were found
- // Try to determine the parent_id by the neighbour module parent
default:
- if (is_array($data) && (isset($data['before']) || isset($data['after'])))
- {
- $neighbour_module_langname = isset($data['before']) ? $data['before'] : $data['after'];
- $sql = 'SELECT parent_id
- FROM ' . $this->modules_table . "
- WHERE module_langname = '" . $this->db->sql_escape($neighbour_module_langname) . "'
- AND " . $this->db->sql_in_set('parent_id', $ids);
- $result = $this->db->sql_query($sql);
- $parent_id = (int) $this->db->sql_fetchfield('parent_id');
- if (!$parent_id)
- {
- $exception = new \phpbb\db\migration\exception('PARENT_MODULE_FIND_ERROR', $data['parent_id']);
- }
- }
- else if (!empty($data) && !is_array($data))
- {
- // The module_langname is set, checking for the module existance
- // As more than 1 parents were found already, there's no way for null parent_id here
- $sql = 'SELECT m2.module_id as module_parent_id
- FROM ' . $this->modules_table . ' m1, ' . $this->modules_table . " m2
- WHERE " . ((is_numeric($data)) ? 'm1.module_id = ' . (int) $data : "m1.module_langname = '" . $this->db->sql_escape($data)) . "'
- AND m2.module_id = m1.parent_id
- AND " . $this->db->sql_in_set('m2.module_id', $ids);
- $result = $this->db->sql_query($sql);
- $parent_id = (int) $this->db->sql_fetchfield('module_parent_id');
- }
- else
- {
- //Unable to get the parent module id, throwing an exception
- $exception = new \phpbb\db\migration\exception('MODULE_EXIST_MULTIPLE', $parent_id);
- }
+ // This represents the old behaviour of phpBB 3.0
+ return $ids;
break;
}
}
- if ($exception !== false)
- {
- if ($throw_exception)
- {
- throw $exception;
- }
- return false;
- }
-
return $parent_id;
}
}
diff --git a/phpBB/phpbb/db/migration/tool/permission.php b/phpBB/phpbb/db/migration/tool/permission.php
index 9688420025..4b53aa32a7 100644
--- a/phpBB/phpbb/db/migration/tool/permission.php
+++ b/phpBB/phpbb/db/migration/tool/permission.php
@@ -442,7 +442,7 @@ class permission implements \phpbb\db\migration\tool\tool_interface
}
);
- if (sizeof($auth_option))
+ if (count($auth_option))
{
return $this->permission_set($role_name, $auth_option, 'role', $has_permission);
}
diff --git a/phpBB/phpbb/db/migrator.php b/phpBB/phpbb/db/migrator.php
index 6c026c3ae1..2b0c66fc58 100644
--- a/phpBB/phpbb/db/migrator.php
+++ b/phpBB/phpbb/db/migrator.php
@@ -632,7 +632,7 @@ class migrator
*/
protected function process_data_step($steps, $state, $revert = false)
{
- if (sizeof($steps) === 0)
+ if (count($steps) === 0)
{
return true;
}
@@ -659,7 +659,7 @@ class migrator
// Result will be null or true if everything completed correctly
// Stop after each update step, to let the updater control the script runtime
$result = $this->run_step($steps[$step], $last_result, $revert);
- if (($result !== null && $result !== true) || $step + 1 < sizeof($steps))
+ if (($result !== null && $result !== true) || $step + 1 < count($steps))
{
return array(
'result' => $result,
@@ -760,7 +760,7 @@ class migrator
$condition = $parameters[0];
- if (!$condition)
+ if (!$condition || (is_array($condition) && !$this->run_step($condition, $last_result, $reverse)))
{
return false;
}
diff --git a/phpBB/phpbb/db/sql_insert_buffer.php b/phpBB/phpbb/db/sql_insert_buffer.php
index 18e4814a77..30e807b154 100644
--- a/phpBB/phpbb/db/sql_insert_buffer.php
+++ b/phpBB/phpbb/db/sql_insert_buffer.php
@@ -92,7 +92,7 @@ class sql_insert_buffer
// Flush buffer if it is full or when DB does not support multi inserts.
// In the later case, the buffer will always only contain one row.
- if (!$this->db->get_multi_insert() || sizeof($this->buffer) >= $this->max_buffered_rows)
+ if (!$this->db->get_multi_insert() || count($this->buffer) >= $this->max_buffered_rows)
{
return $this->flush();
}
@@ -104,7 +104,7 @@ class sql_insert_buffer
* Inserts a row set, i.e. an array of rows, by calling insert().
*
* Please note that it is in most cases better to use insert() instead of
- * first building a huge rowset. Or at least sizeof($rows) should be kept
+ * first building a huge rowset. Or at least count($rows) should be kept
* small.
*
* @param array $rows
diff --git a/phpBB/phpbb/db/tools/mssql.php b/phpBB/phpbb/db/tools/mssql.php
index 23b49aab44..cbedf9a5c4 100644
--- a/phpBB/phpbb/db/tools/mssql.php
+++ b/phpBB/phpbb/db/tools/mssql.php
@@ -49,18 +49,18 @@ class mssql extends tools
'STEXT' => '[varchar] (3000)',
'TEXT' => '[varchar] (8000)',
'MTEXT' => '[text]',
- 'XSTEXT_UNI'=> '[varchar] (100)',
- 'STEXT_UNI' => '[varchar] (255)',
- 'TEXT_UNI' => '[varchar] (4000)',
- 'MTEXT_UNI' => '[text]',
+ 'XSTEXT_UNI'=> '[nvarchar] (100)',
+ 'STEXT_UNI' => '[nvarchar] (255)',
+ 'TEXT_UNI' => '[nvarchar] (4000)',
+ 'MTEXT_UNI' => '[ntext]',
'TIMESTAMP' => '[int]',
'DECIMAL' => '[float]',
'DECIMAL:' => '[float]',
'PDECIMAL' => '[float]',
'PDECIMAL:' => '[float]',
- 'VCHAR_UNI' => '[varchar] (255)',
- 'VCHAR_UNI:'=> '[varchar] (%d)',
- 'VCHAR_CI' => '[varchar] (255)',
+ 'VCHAR_UNI' => '[nvarchar] (255)',
+ 'VCHAR_UNI:'=> '[nvarchar] (%d)',
+ 'VCHAR_CI' => '[nvarchar] (255)',
'VARBINARY' => '[varchar] (255)',
),
@@ -80,18 +80,18 @@ class mssql extends tools
'STEXT' => '[varchar] (3000)',
'TEXT' => '[varchar] (8000)',
'MTEXT' => '[text]',
- 'XSTEXT_UNI'=> '[varchar] (100)',
- 'STEXT_UNI' => '[varchar] (255)',
- 'TEXT_UNI' => '[varchar] (4000)',
- 'MTEXT_UNI' => '[text]',
+ 'XSTEXT_UNI'=> '[nvarchar] (100)',
+ 'STEXT_UNI' => '[nvarchar] (255)',
+ 'TEXT_UNI' => '[nvarchar] (4000)',
+ 'MTEXT_UNI' => '[ntext]',
'TIMESTAMP' => '[int]',
'DECIMAL' => '[float]',
'DECIMAL:' => '[float]',
'PDECIMAL' => '[float]',
'PDECIMAL:' => '[float]',
- 'VCHAR_UNI' => '[varchar] (255)',
- 'VCHAR_UNI:'=> '[varchar] (%d)',
- 'VCHAR_CI' => '[varchar] (255)',
+ 'VCHAR_UNI' => '[nvarchar] (255)',
+ 'VCHAR_UNI:'=> '[nvarchar] (%d)',
+ 'VCHAR_CI' => '[nvarchar] (255)',
'VARBINARY' => '[varchar] (255)',
),
);
@@ -440,7 +440,7 @@ class mssql extends tools
{
$result = $this->sql_index_drop($table_name, $index_name);
$statements = array_merge($statements, $result);
- if (sizeof($index_data) > 1)
+ if (count($index_data) > 1)
{
// Remove this column from the index and recreate it
$recreate_indexes[$index_name] = array_diff($index_data, array($column_name));
@@ -448,6 +448,10 @@ class mssql extends tools
}
}
+ // Drop primary keys depending on this column
+ $result = $this->mssql_get_drop_default_primary_key_queries($table_name, $column_name);
+ $statements = array_merge($statements, $result);
+
// Drop default value constraint
$result = $this->mssql_get_drop_default_constraints_queries($table_name, $column_name);
$statements = array_merge($statements, $result);
@@ -541,10 +545,7 @@ class mssql extends tools
{
$statements = array();
- if ($this->mssql_is_sql_server_2000())
- {
- $this->check_index_name_length($table_name, $index_name);
- }
+ $this->check_index_name_length($table_name, $index_name);
// remove index length
$column = preg_replace('#:.*$#', '', $column);
@@ -555,6 +556,21 @@ class mssql extends tools
}
/**
+ * {@inheritdoc}
+ */
+ protected function get_max_index_name_length()
+ {
+ if ($this->mssql_is_sql_server_2000())
+ {
+ return parent::get_max_index_name_length();
+ }
+ else
+ {
+ return 128;
+ }
+ }
+
+ /**
* {@inheritDoc}
*/
function sql_list_index($table_name)
@@ -685,6 +701,38 @@ class mssql extends tools
}
/**
+ * Get queries to drop the primary keys depending on the specified column
+ *
+ * We need to drop primary keys depending on this column before being able
+ * to delete them.
+ *
+ * @param string $table_name
+ * @param string $column_name
+ * @return array Array with SQL statements
+ */
+ protected function mssql_get_drop_default_primary_key_queries($table_name, $column_name)
+ {
+ $statements = array();
+
+ $sql = "SELECT ccu.CONSTRAINT_NAME, ccu.COLUMN_NAME
+ FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
+ JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
+ WHERE tc.TABLE_NAME = '{$table_name}'
+ AND tc.CONSTRAINT_TYPE = 'Primary Key'
+ AND ccu.COLUMN_NAME = '{$column_name}'";
+
+ $result = $this->db->sql_query($sql);
+
+ while ($primary_key = $this->db->sql_fetchrow($result))
+ {
+ $statements[] = 'ALTER TABLE [' . $table_name . '] DROP CONSTRAINT [' . $primary_key['CONSTRAINT_NAME'] . ']';
+ }
+ $this->db->sql_freeresult($result);
+
+ return $statements;
+ }
+
+ /**
* Checks to see if column is an identity column
*
* Identity columns cannot have defaults set for them.
diff --git a/phpBB/phpbb/db/tools/tools.php b/phpBB/phpbb/db/tools/tools.php
index 2f891e43d5..c3352a1f66 100644
--- a/phpBB/phpbb/db/tools/tools.php
+++ b/phpBB/phpbb/db/tools/tools.php
@@ -576,7 +576,7 @@ class tools implements tools_interface
{
foreach ($indexes as $index_name)
{
- if (!$this->sql_index_exists($table, $index_name))
+ if (!$this->sql_index_exists($table, $index_name) && !$this->sql_unique_index_exists($table, $index_name))
{
continue;
}
@@ -1561,7 +1561,8 @@ class tools implements tools_interface
*/
protected function check_index_name_length($table_name, $index_name, $throw_error = true)
{
- if (strlen($index_name) > 30)
+ $max_index_name_length = $this->get_max_index_name_length();
+ if (strlen($index_name) > $max_index_name_length)
{
// Try removing the table prefix if it's at the beginning
$table_prefix = substr(CONFIG_TABLE, 0, -6); // strlen(config)
@@ -1582,7 +1583,7 @@ class tools implements tools_interface
if ($throw_error)
{
- trigger_error("Index name '$index_name' on table '$table_name' is too long. The maximum is 30 characters.", E_USER_ERROR);
+ trigger_error("Index name '$index_name' on table '$table_name' is too long. The maximum is $max_index_name_length characters.", E_USER_ERROR);
}
}
@@ -1590,6 +1591,16 @@ class tools implements tools_interface
}
/**
+ * Get maximum index name length. Might vary depending on db type
+ *
+ * @return int Maximum index name length
+ */
+ protected function get_max_index_name_length()
+ {
+ return 30;
+ }
+
+ /**
* {@inheritDoc}
*/
function sql_list_index($table_name)
diff --git a/phpBB/phpbb/debug/error_handler.php b/phpBB/phpbb/debug/error_handler.php
index 246e724f56..ebd828b97f 100644
--- a/phpBB/phpbb/debug/error_handler.php
+++ b/phpBB/phpbb/debug/error_handler.php
@@ -17,7 +17,7 @@ use Symfony\Component\Debug\ErrorHandler;
class error_handler extends ErrorHandler
{
- public function handleError($type, $message, $file, $line, array $context, array $backtrace = null)
+ public function handleError($type, $message, $file, $line)
{
if ($type === E_USER_WARNING || $type === E_USER_NOTICE)
{
@@ -26,6 +26,6 @@ class error_handler extends ErrorHandler
$handler($type, $message, $file, $line);
}
- return parent::handleError($type, $message, $file, $line, $context, $backtrace);
+ return parent::handleError($type, $message, $file, $line);
}
}
diff --git a/phpBB/phpbb/di/container_builder.php b/phpBB/phpbb/di/container_builder.php
index ac1a1a1733..8c1ce8bde2 100644
--- a/phpBB/phpbb/di/container_builder.php
+++ b/phpBB/phpbb/di/container_builder.php
@@ -143,6 +143,13 @@ class container_builder
{
if ($this->use_extensions)
{
+ $autoload_cache = new ConfigCache($this->get_autoload_filename(), defined('DEBUG'));
+ if (!$autoload_cache->isFresh())
+ {
+ // autoload cache should be refreshed
+ $this->load_extensions();
+ }
+
require($this->get_autoload_filename());
}
diff --git a/phpBB/phpbb/event/dispatcher.php b/phpBB/phpbb/event/dispatcher.php
index 1c4abeb108..1ba2ab8987 100644
--- a/phpBB/phpbb/event/dispatcher.php
+++ b/phpBB/phpbb/event/dispatcher.php
@@ -57,7 +57,12 @@ class dispatcher extends ContainerAwareEventDispatcher implements dispatcher_int
return $event;
}
- return parent::dispatch($eventName, $event);
+ foreach ((array) $eventName as $name)
+ {
+ $event = parent::dispatch($name, $event);
+ }
+
+ return $event;
}
/**
diff --git a/phpBB/phpbb/event/md_exporter.php b/phpBB/phpbb/event/md_exporter.php
index e042d0a5d1..1a2d7c989e 100644
--- a/phpBB/phpbb/event/md_exporter.php
+++ b/phpBB/phpbb/event/md_exporter.php
@@ -87,7 +87,7 @@ class md_exporter
$this->validate_events_from_file($file_name, $this->crawl_file_for_events($file_name));
}
- return sizeof($this->events);
+ return count($this->events);
}
/**
@@ -113,7 +113,7 @@ class md_exporter
}
}
- return sizeof($this->events);
+ return count($this->events);
}
/**
@@ -143,6 +143,8 @@ class md_exporter
list($event_name, $details) = explode("\n===\n", $event, 2);
$this->validate_event_name($event_name);
+ $sorted_events = [$this->current_event, $event_name];
+ natsort($sorted_events);
$this->current_event = $event_name;
if (isset($this->events[$this->current_event]))
@@ -150,6 +152,12 @@ class md_exporter
throw new \LogicException("The event '{$this->current_event}' is defined multiple times");
}
+ // Use array_values() to get actual first element and check against natural order
+ if (array_values($sorted_events)[0] === $event_name)
+ {
+ throw new \LogicException("The event '{$sorted_events[1]}' should be defined before '{$sorted_events[0]}'");
+ }
+
if (($this->filter == 'adm' && strpos($this->current_event, 'acp_') !== 0)
|| ($this->filter == 'styles' && strpos($this->current_event, 'acp_') === 0))
{
@@ -219,7 +227,7 @@ class md_exporter
);
}
- return sizeof($this->events);
+ return count($this->events);
}
/**
@@ -381,9 +389,16 @@ class md_exporter
$files = explode("\n + ", $file_details);
foreach ($files as $file)
{
+ if (!preg_match('#^([^ ]+)( \([0-9]+\))?$#', $file))
+ {
+ throw new \LogicException("Invalid event instances for file '{$file}' found for event '{$this->current_event}'", 1);
+ }
+
+ list($file) = explode(" ", $file);
+
if (!file_exists($this->path . $file) || substr($file, -5) !== '.html')
{
- throw new \LogicException("Invalid file '{$file}' not found for event '{$this->current_event}'", 1);
+ throw new \LogicException("Invalid file '{$file}' not found for event '{$this->current_event}'", 2);
}
if (($this->filter !== 'adm') && strpos($file, 'styles/prosilver/template/') === 0)
@@ -396,7 +411,7 @@ class md_exporter
}
else
{
- throw new \LogicException("Invalid file '{$file}' not found for event '{$this->current_event}'", 2);
+ throw new \LogicException("Invalid file '{$file}' not found for event '{$this->current_event}'", 3);
}
$this->events_by_file[$file][] = $this->current_event;
@@ -416,7 +431,7 @@ class md_exporter
}
else
{
- throw new \LogicException("Invalid file list found for event '{$this->current_event}'", 2);
+ throw new \LogicException("Invalid file list found for event '{$this->current_event}'", 1);
}
return $files_list;
@@ -439,16 +454,9 @@ class md_exporter
$event_list = array();
$file_content = file_get_contents($this->path . $file);
- $events = explode('<!-- EVENT ', $file_content);
- // Remove the code before the first event
- array_shift($events);
- foreach ($events as $event)
- {
- $event = explode(' -->', $event, 2);
- $event_list[] = array_shift($event);
- }
+ preg_match_all('/(?:{%|<!--) EVENT (.*) (?:%}|-->)/U', $file_content, $event_list);
- return $event_list;
+ return $event_list[1];
}
/**
diff --git a/phpBB/phpbb/event/php_exporter.php b/phpBB/phpbb/event/php_exporter.php
index 26d7e2b426..71c94a681d 100644
--- a/phpBB/phpbb/event/php_exporter.php
+++ b/phpBB/phpbb/event/php_exporter.php
@@ -117,7 +117,7 @@ class php_exporter
}
ksort($this->events);
- return sizeof($this->events);
+ return count($this->events);
}
/**
@@ -196,13 +196,13 @@ class php_exporter
$content = file_get_contents($this->path . $this->current_file);
$num_events_found = 0;
- if (strpos($content, "dispatcher->trigger_event('") || strpos($content, "dispatcher->dispatch('"))
+ if (strpos($content, 'dispatcher->trigger_event(') || strpos($content, 'dispatcher->dispatch('))
{
$this->set_content(explode("\n", $content));
- for ($i = 0, $num_lines = sizeof($this->file_lines); $i < $num_lines; $i++)
+ for ($i = 0, $num_lines = count($this->file_lines); $i < $num_lines; $i++)
{
$event_line = false;
- $found_trigger_event = strpos($this->file_lines[$i], "dispatcher->trigger_event('");
+ $found_trigger_event = strpos($this->file_lines[$i], 'dispatcher->trigger_event(');
$arguments = array();
if ($found_trigger_event !== false)
{
@@ -216,7 +216,7 @@ class php_exporter
}
else
{
- $found_dispatch = strpos($this->file_lines[$i], "dispatcher->dispatch('");
+ $found_dispatch = strpos($this->file_lines[$i], 'dispatcher->dispatch(');
if ($found_dispatch !== false)
{
$event_line = $i;
@@ -264,7 +264,30 @@ class php_exporter
// Find event description line
$description_line_num = $this->find_description();
- $description = substr(trim($this->file_lines[$description_line_num]), strlen('* '));
+ $description_lines = array();
+
+ while (true)
+ {
+ $description_line = substr(trim($this->file_lines[$description_line_num]), strlen('*'));
+ $description_line = trim(str_replace("\t", " ", $description_line));
+
+ // Reached end of description if line is a tag
+ if (strlen($description_line) && $description_line[0] == '@')
+ {
+ break;
+ }
+
+ $description_lines[] = $description_line;
+ $description_line_num++;
+ }
+
+ // If there is an empty line between description and first tag, remove it
+ if (!strlen(end($description_lines)))
+ {
+ array_pop($description_lines);
+ }
+
+ $description = trim(implode('<br/>', $description_lines));
if (isset($this->events[$this->current_event]))
{
@@ -316,17 +339,17 @@ class php_exporter
if ($is_dispatch)
{
- $regex = '#\$([a-z](?:[a-z0-9_]|->)*)';
- $regex .= '->dispatch\(';
- $regex .= '\'' . $this->preg_match_event_name() . '\'';
- $regex .= '\);#';
+ $regex = '#\$[a-z](?:[a-z0-9_]|->)*';
+ $regex .= '->dispatch\((\[)?';
+ $regex .= '\'' . $this->preg_match_event_name() . '(?(1)\', \'(?2))+\'';
+ $regex .= '(?(1)\])\);#';
}
else
{
- $regex = '#extract\(\$([a-z](?:[a-z0-9_]|->)*)';
- $regex .= '->trigger_event\(';
- $regex .= '\'' . $this->preg_match_event_name() . '\'';
- $regex .= ', compact\(\$vars\)\)\);#';
+ $regex = '#extract\(\$[a-z](?:[a-z0-9_]|->)*';
+ $regex .= '->trigger_event\((\[)?';
+ $regex .= '\'' . $this->preg_match_event_name() . '(?(1)\', \'(?2))+\'';
+ $regex .= '(?(1)\]), compact\(\$vars\)\)\);#';
}
$match = array();
@@ -359,7 +382,7 @@ class php_exporter
public function get_vars_from_array()
{
$line = ltrim($this->file_lines[$this->current_event_line - 1], "\t");
- if ($line === ');')
+ if ($line === ');' || $line === '];')
{
$vars_array = $this->get_vars_from_multi_line_array();
}
@@ -370,7 +393,7 @@ class php_exporter
foreach ($vars_array as $var)
{
- if (!preg_match('#^([a-zA-Z_][a-zA-Z0-9_]*)$#', $var))
+ if (!preg_match('#^[a-z_][a-z0-9_]*$#i', $var))
{
throw new \LogicException("Found invalid var '{$var}' in array for event '{$this->current_event}' in file '{$this->current_file}:{$this->current_event_line}'", 3);
}
@@ -392,12 +415,12 @@ class php_exporter
public function get_vars_from_single_line_array($line, $throw_multiline = true)
{
$match = array();
- preg_match('#^\$vars = (?:\[|array\()\'([a-zA-Z0-9_\' ,]+)\'[\)\]];$#', $line, $match);
+ preg_match('#^\$vars = (?:(\[)|array\()\'([a-z0-9_\' ,]+)\'(?(1)\]|\));$#i', $line, $match);
- if (isset($match[1]))
+ if (isset($match[2]))
{
- $vars_array = explode("', '", $match[1]);
- if ($throw_multiline && sizeof($vars_array) > 6)
+ $vars_array = explode("', '", $match[2]);
+ if ($throw_multiline && count($vars_array) > 6)
{
throw new \LogicException('Should use multiple lines for $vars definition '
. "for event '{$this->current_event}' in file '{$this->current_file}:{$this->current_event_line}'", 2);
@@ -420,7 +443,7 @@ class php_exporter
{
$current_vars_line = 2;
$var_lines = array();
- while (ltrim($this->file_lines[$this->current_event_line - $current_vars_line], "\t") !== '$vars = array(')
+ while (!in_array(ltrim($this->file_lines[$this->current_event_line - $current_vars_line], "\t"), ['$vars = array(', '$vars = [']))
{
$var_lines[] = substr(trim($this->file_lines[$this->current_event_line - $current_vars_line]), 0, -1);
@@ -460,7 +483,7 @@ class php_exporter
if (strpos($var_line, '* @var ') === 0)
{
$doc_line = explode(' ', $var_line, 5);
- if (sizeof($doc_line) !== 5)
+ if (count($doc_line) !== 5)
{
throw new \LogicException("Found invalid line '{$this->file_lines[$this->current_event_line - $current_doc_line]}' "
. "for event '{$this->current_event}' in file '{$this->current_file}:{$this->current_event_line}'", 1);
@@ -485,7 +508,7 @@ class php_exporter
foreach ($doc_vars as $var)
{
- if (!preg_match('#^([a-zA-Z_][a-zA-Z0-9_]*)$#', $var))
+ if (!preg_match('#^[a-z_][a-z0-9_]*$#i', $var))
{
throw new \LogicException("Found invalid @var '{$var}' in docblock for event "
. "'{$this->current_event}' in file '{$this->current_file}:{$this->current_event_line}'", 4);
@@ -707,9 +730,9 @@ class php_exporter
{
$vars_array = array_unique($vars_array);
$vars_docblock = array_unique($vars_docblock);
- $sizeof_vars_array = sizeof($vars_array);
+ $sizeof_vars_array = count($vars_array);
- if ($sizeof_vars_array !== sizeof($vars_docblock) || $sizeof_vars_array !== sizeof(array_intersect($vars_array, $vars_docblock)))
+ if ($sizeof_vars_array !== count($vars_docblock) || $sizeof_vars_array !== count(array_intersect($vars_array, $vars_docblock)))
{
throw new \LogicException("\$vars array does not match the list of '@var' tags for event "
. "'{$this->current_event}' in file '{$this->current_file}:{$this->current_event_line}'");
diff --git a/phpBB/phpbb/feed/helper.php b/phpBB/phpbb/feed/helper.php
index e15d1e131e..7d50b7ce7d 100644
--- a/phpBB/phpbb/feed/helper.php
+++ b/phpBB/phpbb/feed/helper.php
@@ -13,41 +13,52 @@
namespace phpbb\feed;
+use phpbb\config\config;
+use phpbb\path_helper;
+use phpbb\textformatter\s9e\renderer;
+use phpbb\user;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
/**
* Class with some helpful functions used in feeds
*/
class helper
{
- /** @var \phpbb\config\config */
+ /** @var config */
protected $config;
- /** @var \phpbb\user */
- protected $user;
+ /** @var ContainerInterface */
+ protected $container;
- /** @var string */
- protected $phpbb_root_path;
+ /** @var path_helper */
+ protected $path_helper;
- /** @var string */
- protected $phpEx;
+ /** @var renderer */
+ protected $renderer;
+
+ /** @var user */
+ protected $user;
/**
* Constructor
*
- * @param \phpbb\config\config $config Config object
- * @param \phpbb\user $user User object
- * @param string $phpbb_root_path Root path
- * @param string $phpEx PHP file extension
+ * @param config $config Config object
+ * @param ContainerInterface $container Service container object
+ * @param path_helper $path_helper Path helper object
+ * @param renderer $renderer TextFormatter renderer object
+ * @param user $user User object
*/
- public function __construct(\phpbb\config\config $config, \phpbb\user $user, $phpbb_root_path, $phpEx)
+ public function __construct(config $config, ContainerInterface $container, path_helper $path_helper, renderer $renderer, user $user)
{
$this->config = $config;
+ $this->container = $container;
+ $this->path_helper = $path_helper;
+ $this->renderer = $renderer;
$this->user = $user;
- $this->phpbb_root_path = $phpbb_root_path;
- $this->phpEx = $phpEx;
}
/**
- * Run links through append_sid(), prepend generate_board_url() and remove session id
+ * Returns the board url (and caches it in the function)
*/
public function get_board_url()
{
@@ -104,16 +115,12 @@ class helper
return '';
}
- // Prepare some bbcodes for better parsing
- $content = preg_replace("#\[quote(=&quot;.*?&quot;)?:$uid\]\s*(.*?)\s*\[/quote:$uid\]#si", "[quote$1:$uid]<br />$2<br />[/quote:$uid]", $content);
-
- $content = generate_text_for_display($content, $uid, $bitfield, $options);
+ // Setup our own quote_helper to remove all attributes from quotes
+ $this->renderer->configure_quote_helper($this->container->get('feed.quote_helper'));
- // Add newlines
- $content = str_replace('<br />', '<br />' . "\n", $content);
+ $this->renderer->set_smilies_path($this->get_board_url() . '/' . $this->config['smilies_path']);
- // Convert smiley Relative paths to Absolute path, Windows style
- $content = str_replace($this->phpbb_root_path . $this->config['smilies_path'], $this->get_board_url() . '/' . $this->config['smilies_path'], $content);
+ $content = generate_text_for_display($content, $uid, $bitfield, $options);
// Remove "Select all" link and mouse events
$content = str_replace('<a href="#" onclick="selectCode(this); return false;">' . $this->user->lang['SELECT_ALL_CODE'] . '</a>', '', $content);
@@ -152,7 +159,7 @@ class helper
$content .= implode('<br />', $post_attachments);
// Convert attachments' relative path to absolute path
- $content = str_replace($this->phpbb_root_path . 'download/file.' . $this->phpEx, $this->get_board_url() . '/download/file.' . $this->phpEx, $content);
+ $content = str_replace($this->path_helper->get_web_root_path() . 'download/file.' . $this->path_helper->get_php_ext(), $this->get_board_url() . '/download/file.' . $this->path_helper->get_php_ext(), $content);
}
// Remove Comments from inline attachments [ia]
diff --git a/phpBB/phpbb/feed/quote_helper.php b/phpBB/phpbb/feed/quote_helper.php
new file mode 100644
index 0000000000..843d075028
--- /dev/null
+++ b/phpBB/phpbb/feed/quote_helper.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+namespace phpbb\feed;
+
+/**
+ * Modified quote_helper for feeds (basically just removing all attributes)
+ */
+class quote_helper extends \phpbb\textformatter\s9e\quote_helper
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function inject_metadata($xml)
+ {
+ // In feeds we don't want any attributes, so delete all of them
+ return \s9e\TextFormatter\Utils::replaceAttributes(
+ $xml,
+ 'QUOTE',
+ function ()
+ {
+ return [];
+ }
+ );
+ }
+}
diff --git a/phpBB/phpbb/file_downloader.php b/phpBB/phpbb/file_downloader.php
index ab9505a14c..403ca5bc83 100644
--- a/phpBB/phpbb/file_downloader.php
+++ b/phpBB/phpbb/file_downloader.php
@@ -42,7 +42,7 @@ class file_downloader
$this->error_number = 0;
$this->error_string = '';
- if ($socket = @fsockopen(($port == 443 ? 'tls://' : '') . $host, $port, $this->error_number, $this->error_string, $timeout))
+ if ($socket = @fsockopen(($port == 443 ? 'ssl://' : '') . $host, $port, $this->error_number, $this->error_string, $timeout))
{
@fputs($socket, "GET $directory/$filename HTTP/1.0\r\n");
@fputs($socket, "HOST: $host\r\n");
diff --git a/phpBB/phpbb/files/filespec.php b/phpBB/phpbb/files/filespec.php
index f1a32ef4a8..6847bca4cb 100644
--- a/phpBB/phpbb/files/filespec.php
+++ b/phpBB/phpbb/files/filespec.php
@@ -121,7 +121,7 @@ class filespec
*/
public function set_upload_ary($upload_ary)
{
- if (!isset($upload_ary) || !sizeof($upload_ary))
+ if (!isset($upload_ary) || !count($upload_ary))
{
return $this;
}
@@ -403,7 +403,7 @@ class filespec
*/
public function move_file($destination, $overwrite = false, $skip_image_check = false, $chmod = false)
{
- if (sizeof($this->error))
+ if (count($this->error))
{
return false;
}
@@ -478,7 +478,7 @@ class filespec
// Remove temporary filename
@unlink($this->filename);
- if (sizeof($this->error))
+ if (count($this->error))
{
return false;
}
diff --git a/phpBB/phpbb/files/types/form.php b/phpBB/phpbb/files/types/form.php
index 832f090c47..2c3beb6e02 100644
--- a/phpBB/phpbb/files/types/form.php
+++ b/phpBB/phpbb/files/types/form.php
@@ -119,7 +119,7 @@ class form extends base
// PHP Upload file size check
$file = $this->check_upload_size($file);
- if (sizeof($file->error))
+ if (count($file->error))
{
return $file;
}
diff --git a/phpBB/phpbb/files/types/local.php b/phpBB/phpbb/files/types/local.php
index 7e9210b196..4dfe4f7506 100644
--- a/phpBB/phpbb/files/types/local.php
+++ b/phpBB/phpbb/files/types/local.php
@@ -86,7 +86,7 @@ class local extends base
// PHP Upload file size check
$file = $this->check_upload_size($file);
- if (sizeof($file->error))
+ if (count($file->error))
{
return $file;
}
diff --git a/phpBB/phpbb/files/upload.php b/phpBB/phpbb/files/upload.php
index a9bf74094d..50e15c9844 100644
--- a/phpBB/phpbb/files/upload.php
+++ b/phpBB/phpbb/files/upload.php
@@ -261,7 +261,7 @@ class upload
*
* @param filespec $file Instance of filespec class
*/
- public function common_checks(&$file)
+ public function common_checks($file)
{
// Filesize is too big or it's 0 if it was larger than the maxsize in the upload form
if ($this->max_filesize && ($file->get('filesize') > $this->max_filesize || $file->get('filesize') == 0))
@@ -297,7 +297,7 @@ class upload
*
* @return bool True if extension is allowed, false if not
*/
- public function valid_extension(&$file)
+ public function valid_extension($file)
{
return (in_array($file->get('extension'), $this->allowed_extensions)) ? true : false;
}
@@ -310,7 +310,7 @@ class upload
* @return bool True if dimensions are valid or no constraints set, false
* if not
*/
- public function valid_dimensions(&$file)
+ public function valid_dimensions($file)
{
if (!$this->max_width && !$this->max_height && !$this->min_width && !$this->min_height)
{
@@ -350,7 +350,7 @@ class upload
*
* @return bool True if content is valid, false if not
*/
- public function valid_content(&$file)
+ public function valid_content($file)
{
return ($file->check_content($this->disallowed_content));
}
diff --git a/phpBB/phpbb/filesystem/filesystem.php b/phpBB/phpbb/filesystem/filesystem.php
index 2112882d1d..bfafdf5ddd 100644
--- a/phpBB/phpbb/filesystem/filesystem.php
+++ b/phpBB/phpbb/filesystem/filesystem.php
@@ -171,7 +171,7 @@ class filesystem implements filesystem_interface
continue;
}
- if ($part === '..' && !empty($filtered) && $filtered[sizeof($filtered) - 1] !== '.' && $filtered[sizeof($filtered) - 1] !== '..')
+ if ($part === '..' && !empty($filtered) && $filtered[count($filtered) - 1] !== '.' && $filtered[count($filtered) - 1] !== '..')
{
array_pop($filtered);
}
@@ -367,7 +367,7 @@ class filesystem implements filesystem_interface
$common_php_group = @filegroup(__FILE__);
// And the owner and the groups PHP is running under.
- $php_uid = (function_exists('posic_getuid')) ? @posix_getuid() : false;
+ $php_uid = (function_exists('posix_getuid')) ? @posix_getuid() : false;
$php_gids = (function_exists('posix_getgroups')) ? @posix_getgroups() : false;
// If we are unable to get owner/group, then do not try to set them by guessing
@@ -671,7 +671,7 @@ class filesystem implements filesystem_interface
else if (function_exists('debug_backtrace'))
{
$call_stack = debug_backtrace(0);
- $this->working_directory = str_replace(DIRECTORY_SEPARATOR, '/', dirname($call_stack[sizeof($call_stack) - 1]['file']));
+ $this->working_directory = str_replace(DIRECTORY_SEPARATOR, '/', dirname($call_stack[count($call_stack) - 1]['file']));
}
else
{
@@ -683,7 +683,7 @@ class filesystem implements filesystem_interface
//$dir_parts = explode(DIRECTORY_SEPARATOR, __DIR__);
//$namespace_parts = explode('\\', trim(__NAMESPACE__, '\\'));
- //$namespace_part_count = sizeof($namespace_parts);
+ //$namespace_part_count = count($namespace_parts);
// Check if we still loading from root
//if (array_slice($dir_parts, -$namespace_part_count) === $namespace_parts)
@@ -807,7 +807,7 @@ class filesystem implements filesystem_interface
array_pop($resolved);
$resolved_path = false;
}
- else if ($path_part === '..' && !empty($resolved) && !in_array($resolved[sizeof($resolved) - 1], array('.', '..')))
+ else if ($path_part === '..' && !empty($resolved) && !in_array($resolved[count($resolved) - 1], array('.', '..')))
{
array_pop($resolved);
$resolved_path = false;
diff --git a/phpBB/phpbb/group/helper.php b/phpBB/phpbb/group/helper.php
index 5befddfc53..aa3876b325 100644
--- a/phpBB/phpbb/group/helper.php
+++ b/phpBB/phpbb/group/helper.php
@@ -13,19 +13,74 @@
namespace phpbb\group;
+use phpbb\auth\auth;
+use phpbb\cache\service as cache;
+use phpbb\config\config;
+use phpbb\language\language;
+use phpbb\event\dispatcher_interface;
+use phpbb\path_helper;
+use phpbb\user;
+
class helper
{
- /** @var \phpbb\language\language */
+ /** @var auth */
+ protected $auth;
+
+ /** @var cache */
+ protected $cache;
+
+ /** @var config */
+ protected $config;
+
+ /** @var language */
protected $language;
+ /** @var dispatcher_interface */
+ protected $dispatcher;
+
+ /** @var path_helper */
+ protected $path_helper;
+
+ /** @var user */
+ protected $user;
+
+ /** @var string phpBB root path */
+ protected $phpbb_root_path;
+
+ /** @var array Return templates for a group name string */
+ protected $name_strings;
+
/**
* Constructor
*
- * @param \phpbb\language\language $language Language object
+ * @param auth $auth Authentication object
+ * @param cache $cache Cache service object
+ * @param config $config Configuration object
+ * @param language $language Language object
+ * @param dispatcher_interface $dispatcher Event dispatcher object
+ * @param path_helper $path_helper Path helper object
+ * @param user $user User object
*/
- public function __construct(\phpbb\language\language $language)
+ public function __construct(auth $auth, cache $cache, config $config, language $language, dispatcher_interface $dispatcher, path_helper $path_helper, user $user)
{
+ $this->auth = $auth;
+ $this->cache = $cache;
+ $this->config = $config;
$this->language = $language;
+ $this->dispatcher = $dispatcher;
+ $this->path_helper = $path_helper;
+ $this->user = $user;
+
+ $this->phpbb_root_path = $path_helper->get_phpbb_root_path();
+
+ /** @html Group name spans and links for usage in the template */
+ $this->name_strings = array(
+ 'base_url' => "{$path_helper->get_phpbb_root_path()}memberlist.{$path_helper->get_php_ext()}?mode=group&amp;g={GROUP_ID}",
+ 'tpl_noprofile' => '<span class="username">{GROUP_NAME}</span>',
+ 'tpl_noprofile_colour' => '<span class="username-coloured" style="color: {GROUP_COLOUR};">{GROUP_NAME}</span>',
+ 'tpl_profile' => '<a class="username" href="{PROFILE_URL}">{GROUP_NAME}</a>',
+ 'tpl_profile_colour' => '<a class="username-coloured" href="{PROFILE_URL}" style="color: {GROUP_COLOUR};">{GROUP_NAME}</a>',
+ );
}
/**
@@ -37,4 +92,203 @@ class helper
{
return $this->language->is_set('G_' . utf8_strtoupper($group_name)) ? $this->language->lang('G_' . utf8_strtoupper($group_name)) : $group_name;
}
+
+ /**
+ * Get group name details for placing into templates.
+ *
+ * @html Group name spans and links
+ *
+ * @param string $mode Profile (for getting an url to the profile),
+ * group_name (for obtaining the group name),
+ * colour (for obtaining the group colour),
+ * full (for obtaining a coloured group name link to the group's profile),
+ * no_profile (the same as full but forcing no profile link)
+ * @param int $group_id The group id
+ * @param string $group_name The group name
+ * @param string $group_colour The group colour
+ * @param mixed $custom_profile_url optional parameter to specify a profile url. The group id gets appended to this url as &amp;g={group_id}
+ *
+ * @return string A string consisting of what is wanted based on $mode.
+ */
+ public function get_name_string($mode, $group_id, $group_name, $group_colour = '', $custom_profile_url = false)
+ {
+ $s_is_bots = ($group_name === 'BOTS');
+
+ // This switch makes sure we only run code required for the mode
+ switch ($mode)
+ {
+ case 'full':
+ case 'no_profile':
+ case 'colour':
+
+ // Build correct group colour
+ $group_colour = $group_colour ? '#' . $group_colour : '';
+
+ // Return colour
+ if ($mode === 'colour')
+ {
+ $group_name_string = $group_colour;
+ break;
+ }
+
+ // no break;
+
+ case 'group_name':
+
+ // Build correct group name
+ $group_name = $this->get_name($group_name);
+
+ // Return group name
+ if ($mode === 'group_name')
+ {
+ $group_name_string = $group_name;
+ break;
+ }
+
+ // no break;
+
+ case 'profile':
+
+ // Build correct profile url - only show if not anonymous and permission to view profile if registered user
+ // For anonymous the link leads to a login page.
+ if ($group_id && !$s_is_bots && ($this->user->data['user_id'] == ANONYMOUS || $this->auth->acl_get('u_viewprofile')))
+ {
+ $profile_url = ($custom_profile_url !== false) ? $custom_profile_url . '&amp;g=' . (int) $group_id : str_replace(array('={GROUP_ID}', '=%7BGROUP_ID%7D'), '=' . (int) $group_id, append_sid($this->name_strings['base_url']));
+ }
+ else
+ {
+ $profile_url = '';
+ }
+
+ // Return profile
+ if ($mode === 'profile')
+ {
+ $group_name_string = $profile_url;
+ break;
+ }
+
+ // no break;
+ }
+
+ if (!isset($group_name_string))
+ {
+ if (($mode === 'full' && empty($profile_url)) || $mode === 'no_profile' || $s_is_bots)
+ {
+ $group_name_string = str_replace(array('{GROUP_COLOUR}', '{GROUP_NAME}'), array($group_colour, $group_name), (!$group_colour) ? $this->name_strings['tpl_noprofile'] : $this->name_strings['tpl_noprofile_colour']);
+ }
+ else
+ {
+ $group_name_string = str_replace(array('{PROFILE_URL}', '{GROUP_COLOUR}', '{GROUP_NAME}'), array($profile_url, $group_colour, $group_name), (!$group_colour) ? $this->name_strings['tpl_profile'] : $this->name_strings['tpl_profile_colour']);
+ }
+ }
+
+ $name_strings = $this->name_strings;
+
+ /**
+ * Use this event to change the output of the group name
+ *
+ * @event core.modify_group_name_string
+ * @var string mode profile|group_name|colour|full|no_profile
+ * @var int group_id The group identifier
+ * @var string group_name The group name
+ * @var string group_colour The group colour
+ * @var string custom_profile_url Optional parameter to specify a profile url.
+ * @var string group_name_string The string that has been generated
+ * @var array name_strings Array of original return templates
+ * @since 3.2.8-RC1
+ */
+ $vars = array(
+ 'mode',
+ 'group_id',
+ 'group_name',
+ 'group_colour',
+ 'custom_profile_url',
+ 'group_name_string',
+ 'name_strings',
+ );
+ extract($this->dispatcher->trigger_event('core.modify_group_name_string', compact($vars)));
+
+ return $group_name_string;
+ }
+
+ /**
+ * Get group rank title and image
+ *
+ * @html Group rank image element
+ *
+ * @param array $group_data The current stored group data
+ *
+ * @return array An associative array containing the rank title (title),
+ * the rank image as full img tag (img) and the rank image source (img_src)
+ */
+ public function get_rank($group_data)
+ {
+ $group_rank_data = array(
+ 'title' => null,
+ 'img' => null,
+ 'img_src' => null,
+ );
+
+ /**
+ * Preparing a group's rank before displaying
+ *
+ * @event core.get_group_rank_before
+ * @var array group_data Array with group's data
+ * @since 3.2.8-RC1
+ */
+
+ $vars = array('group_data');
+ extract($this->dispatcher->trigger_event('core.get_group_rank_before', compact($vars)));
+
+ if (!empty($group_data['group_rank']))
+ {
+ // Only obtain ranks if group rank is set
+ $ranks = $this->cache->obtain_ranks();
+
+ if (isset($ranks['special'][$group_data['group_rank']]))
+ {
+ $rank = $ranks['special'][$group_data['group_rank']];
+
+ $group_rank_data['title'] = $rank['rank_title'];
+
+ $group_rank_data['img_src'] = (!empty($rank['rank_image'])) ? $this->path_helper->update_web_root_path($this->phpbb_root_path . $this->config['ranks_path'] . '/' . $rank['rank_image']) : '';
+
+ /** @html Group rank image element for usage in the template */
+ $group_rank_data['img'] = (!empty($rank['rank_image'])) ? '<img src="' . $group_rank_data['img_src'] . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : '';
+ }
+ }
+
+ /**
+ * Modify a group's rank before displaying
+ *
+ * @event core.get_group_rank_after
+ * @var array group_data Array with group's data
+ * @var array group_rank_data Group rank data
+ * @since 3.2.8-RC1
+ */
+
+ $vars = array(
+ 'group_data',
+ 'group_rank_data',
+ );
+ extract($this->dispatcher->trigger_event('core.get_group_rank_after', compact($vars)));
+
+ return $group_rank_data;
+ }
+
+ /**
+ * Get group avatar.
+ * Wrapper function for phpbb_get_group_avatar()
+ *
+ * @param array $group_row Row from the groups table
+ * @param string $alt Optional language string for alt tag within image, can be a language key or text
+ * @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
+ * @param bool $lazy If true, will be lazy loaded (requires JS)
+ *
+ * @return string Avatar html
+ */
+ function get_avatar($group_row, $alt = 'GROUP_AVATAR', $ignore_config = false, $lazy = false)
+ {
+ return phpbb_get_group_avatar($group_row, $alt, $ignore_config, $lazy);
+ }
}
diff --git a/phpBB/phpbb/install/helper/config.php b/phpBB/phpbb/install/helper/config.php
index fad6749019..7eb0ae3b05 100644
--- a/phpBB/phpbb/install/helper/config.php
+++ b/phpBB/phpbb/install/helper/config.php
@@ -330,6 +330,8 @@ class config
fwrite($fp, $file_content);
fclose($fp);
+ // Enforce 0600 permission for install config
+ $this->filesystem->chmod([$this->install_config_file], 0600);
}
/**
diff --git a/phpBB/phpbb/install/helper/database.php b/phpBB/phpbb/install/helper/database.php
index 59b86a8ca7..fa5a10c6fc 100644
--- a/phpBB/phpbb/install/helper/database.php
+++ b/phpBB/phpbb/install/helper/database.php
@@ -76,7 +76,7 @@ class database
'LABEL' => 'Oracle',
'SCHEMA' => 'oracle',
'MODULE' => 'oci8',
- 'DELIM' => '/',
+ 'DELIM' => ';',
'DRIVER' => 'phpbb\db\driver\oracle',
'AVAILABLE' => true,
'2.0.x' => false,
@@ -338,7 +338,7 @@ class database
// Check if SQLite database is writable
if ($dbms_info['SCHEMA'] === 'sqlite'
- && (!$this->filesystem->is_writable($dbhost) || !$this->filesystem->is_writable(pathinfo($dbhost, PATHINFO_DIRNAME))))
+ && (($this->filesystem->exists($dbhost) && !$this->filesystem->is_writable($dbhost)) || !$this->filesystem->is_writable(pathinfo($dbhost, PATHINFO_DIRNAME))))
{
$errors[] = array(
'title' =>'INST_ERR_DB_NO_WRITABLE',
@@ -372,7 +372,7 @@ class database
$tables = array_map('strtolower', $tables);
$table_intersect = array_intersect($tables, $table_ary);
- if (sizeof($table_intersect))
+ if (count($table_intersect))
{
$errors[] = array(
'title' => 'INST_ERR_PREFIX',
diff --git a/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php b/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php
index bce0149890..2a608f504e 100644
--- a/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php
+++ b/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php
@@ -187,6 +187,7 @@ class ajax_iohandler extends iohandler_base
$tpl_ary['KEY'] = $input_name;
$tpl_ary['S_EXPLAIN'] = false;
$tpl_ary['DISABLED'] = isset($input_options['disabled']) ? $input_options['disabled'] : false;
+ $tpl_ary['IS_SECONDARY'] = isset($input_options['is_secondary']) ? $input_options['is_secondary'] : false;
if (isset($input_options['default']))
{
@@ -203,7 +204,7 @@ class ajax_iohandler extends iohandler_base
if (in_array($input_options['type'], array('select', 'radio'), true))
{
- for ($i = 0, $total = sizeof($input_options['options']); $i < $total; $i++)
+ for ($i = 0, $total = count($input_options['options']); $i < $total; $i++)
{
if (isset($input_options['options'][$i]['label']))
{
@@ -218,6 +219,11 @@ class ajax_iohandler extends iohandler_base
$this->template->assign_block_vars($block_name, $tpl_ary);
}
+ if (isset($form['database_update_submit']) && !$form['database_update_submit']['disabled'])
+ {
+ $this->template->assign_var('FORM_TITLE', $this->language->lang('UPDATE_CONTINUE_UPDATE_PROCESS'));
+ }
+
$this->template->assign_var('S_NOT_ONLY_BUTTON_FORM', $not_button_form);
if (!$not_button_form)
@@ -375,7 +381,7 @@ class ajax_iohandler extends iohandler_base
*/
public function set_active_stage_menu($menu_path)
{
- $this->nav_data['active'] = $menu_path[sizeof($menu_path) - 1];
+ $this->nav_data['active'] = $menu_path[count($menu_path) - 1];
$this->send_response();
}
@@ -384,7 +390,7 @@ class ajax_iohandler extends iohandler_base
*/
public function set_finished_stage_menu($menu_path)
{
- $this->nav_data['finished'][] = $menu_path[sizeof($menu_path) - 1];
+ $this->nav_data['finished'][] = $menu_path[count($menu_path) - 1];
$this->send_response();
}
diff --git a/phpBB/phpbb/install/module/install_data/task/add_bots.php b/phpBB/phpbb/install/module/install_data/task/add_bots.php
index 1f1cecceb2..07f8e025cf 100644
--- a/phpBB/phpbb/install/module/install_data/task/add_bots.php
+++ b/phpBB/phpbb/install/module/install_data/task/add_bots.php
@@ -239,7 +239,7 @@ class add_bots extends \phpbb\install\task_base
$this->install_config->set('add_bot_index', $i);
- if ($i < sizeof($this->bot_list))
+ if ($i < count($this->bot_list))
{
throw new resource_limit_reached_exception();
}
diff --git a/phpBB/phpbb/install/module/install_data/task/add_modules.php b/phpBB/phpbb/install/module/install_data/task/add_modules.php
index d21a5be823..b64f4c31db 100644
--- a/phpBB/phpbb/install/module/install_data/task/add_modules.php
+++ b/phpBB/phpbb/install/module/install_data/task/add_modules.php
@@ -169,7 +169,7 @@ class add_modules extends \phpbb\install\task_base
$this->db->sql_return_on_error(true);
$module_classes = array('acp', 'mcp', 'ucp');
- $total = sizeof($module_classes);
+ $total = count($module_classes);
$i = $this->config->get('module_class_index', 0);
$module_classes = array_slice($module_classes, $i);
diff --git a/phpBB/phpbb/install/module/install_database/task/add_config_settings.php b/phpBB/phpbb/install/module/install_database/task/add_config_settings.php
index 8002e3ed97..ba439609ff 100644
--- a/phpBB/phpbb/install/module/install_database/task/add_config_settings.php
+++ b/phpBB/phpbb/install/module/install_database/task/add_config_settings.php
@@ -151,10 +151,6 @@ class add_config_settings extends \phpbb\install\task_base
VALUES ('default_lang', '" . $this->db->sql_escape($this->install_config->get('default_lang')) . "')",
'UPDATE ' . $this->config_table . "
- SET config_value = '" . $this->db->sql_escape($this->install_config->get('img_imagick')) . "'
- WHERE config_name = 'img_imagick'",
-
- 'UPDATE ' . $this->config_table . "
SET config_value = '" . $this->db->sql_escape($this->install_config->get('server_name')) . "'
WHERE config_name = 'server_name'",
@@ -327,7 +323,7 @@ class add_config_settings extends \phpbb\install\task_base
}
$i = $this->install_config->get('add_config_settings_index', 0);
- $total = sizeof($sql_ary);
+ $total = count($sql_ary);
$sql_ary = array_slice($sql_ary, $i);
foreach ($sql_ary as $sql)
diff --git a/phpBB/phpbb/install/module/install_database/task/add_default_data.php b/phpBB/phpbb/install/module/install_database/task/add_default_data.php
index e32101a3f7..c05e5321fb 100644
--- a/phpBB/phpbb/install/module/install_database/task/add_default_data.php
+++ b/phpBB/phpbb/install/module/install_database/task/add_default_data.php
@@ -99,7 +99,7 @@ class add_default_data extends \phpbb\install\task_base
$sql_query = $this->database_helper->split_sql_file($sql_query, $dbms_info[$dbms]['DELIM']);
$i = $this->config->get('add_default_data_index', 0);
- $total = sizeof($sql_query);
+ $total = count($sql_query);
$sql_query = array_slice($sql_query, $i);
foreach ($sql_query as $sql)
diff --git a/phpBB/phpbb/install/module/install_database/task/add_tables.php b/phpBB/phpbb/install/module/install_database/task/add_tables.php
index f344f91582..dc814f36ef 100644
--- a/phpBB/phpbb/install/module/install_database/task/add_tables.php
+++ b/phpBB/phpbb/install/module/install_database/task/add_tables.php
@@ -101,7 +101,7 @@ class add_tables extends \phpbb\install\task_base
$db_table_schema = @file_get_contents($this->schema_file_path);
$db_table_schema = json_decode($db_table_schema, true);
- $total = sizeof($db_table_schema);
+ $total = count($db_table_schema);
$i = $this->config->get('add_table_index', 0);
$db_table_schema = array_slice($db_table_schema, $i);
diff --git a/phpBB/phpbb/install/module/install_finish/task/install_extensions.php b/phpBB/phpbb/install/module/install_finish/task/install_extensions.php
index eee13a6581..47ea156c66 100644
--- a/phpBB/phpbb/install/module/install_finish/task/install_extensions.php
+++ b/phpBB/phpbb/install/module/install_finish/task/install_extensions.php
@@ -157,7 +157,7 @@ class install_extensions extends \phpbb\install\task_base
$this->install_config->set('install_extensions_index', $i);
- if ($i < sizeof($all_available_extensions))
+ if ($i < count($all_available_extensions))
{
throw new resource_limit_reached_exception();
}
diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php
index dc7b060746..6ec1e612b9 100644
--- a/phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php
+++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_database_data.php
@@ -78,10 +78,10 @@ class obtain_database_data extends \phpbb\install\task_base implements \phpbb\in
$dbms = $this->io_handler->get_input('dbms', '');
$dbhost = $this->io_handler->get_input('dbhost', '', true);
$dbport = $this->io_handler->get_input('dbport', '');
- $dbuser = $this->io_handler->get_input('dbuser', '');
- $dbpasswd = $this->io_handler->get_raw_input('dbpasswd', '');
- $dbname = $this->io_handler->get_input('dbname', '');
- $table_prefix = $this->io_handler->get_input('table_prefix', '');
+ $dbuser = $this->io_handler->get_input('dbuser', '', true);
+ $dbpasswd = $this->io_handler->get_raw_input('dbpasswd', '', true);
+ $dbname = $this->io_handler->get_input('dbname', '', true);
+ $table_prefix = $this->io_handler->get_input('table_prefix', '', true);
// Check database data
$user_data_vaild = $this->check_database_data($dbms, $dbhost, $dbport, $dbuser, $dbpasswd, $dbname, $table_prefix);
diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php
index e8a9c971b7..7cd0d7bf23 100644
--- a/phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php
+++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_email_data.php
@@ -50,11 +50,11 @@ class obtain_email_data extends \phpbb\install\task_base implements \phpbb\insta
// E-mail data
$email_enable = $this->io_handler->get_input('email_enable', true);
$smtp_delivery = $this->io_handler->get_input('smtp_delivery', '');
- $smtp_host = $this->io_handler->get_input('smtp_host', '');
+ $smtp_host = $this->io_handler->get_input('smtp_host', '', true);
$smtp_port = $this->io_handler->get_input('smtp_port', '');
$smtp_auth = $this->io_handler->get_input('smtp_auth', '');
- $smtp_user = $this->io_handler->get_input('smtp_user', '');
- $smtp_passwd = $this->io_handler->get_input('smtp_pass', '');
+ $smtp_user = $this->io_handler->get_input('smtp_user', '', true);
+ $smtp_passwd = $this->io_handler->get_input('smtp_pass', '', true);
$auth_methods = array('PLAIN', 'LOGIN', 'CRAM-MD5', 'DIGEST-MD5', 'POP-BEFORE-SMTP');
diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_imagick_path.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_imagick_path.php
deleted file mode 100644
index 377d96ed1a..0000000000
--- a/phpBB/phpbb/install/module/obtain_data/task/obtain_imagick_path.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/**
- *
- * This file is part of the phpBB Forum Software package.
- *
- * @copyright (c) phpBB Limited <https://www.phpbb.com>
- * @license GNU General Public License, version 2 (GPL-2.0)
- *
- * For full copyright and license information, please see
- * the docs/CREDITS.txt file.
- *
- */
-
-namespace phpbb\install\module\obtain_data\task;
-
-class obtain_imagick_path extends \phpbb\install\task_base implements \phpbb\install\task_interface
-{
- /**
- * @var \phpbb\install\helper\config
- */
- protected $config;
-
- /**
- * Constructor
- *
- * @param \phpbb\install\helper\config $config Installer's config
- */
- public function __construct(\phpbb\install\helper\config $config)
- {
- $this->config = $config;
-
- parent::__construct(true);
- }
-
- /**
- * {@inheritdoc}
- */
- public function run()
- {
- // Can we find ImageMagick anywhere on the system?
- $exe = (DIRECTORY_SEPARATOR == '\\') ? '.exe' : '';
-
- $magic_home = getenv('MAGICK_HOME');
- $img_imagick = '';
- if (empty($magic_home))
- {
- $locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/');
- $path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH'))));
-
- $locations = array_merge($path_locations, $locations);
- foreach ($locations as $location)
- {
- // The path might not end properly, fudge it
- if (substr($location, -1, 1) !== '/')
- {
- $location .= '/';
- }
-
- if (@file_exists($location) && @is_readable($location . 'mogrify' . $exe) && @filesize($location . 'mogrify' . $exe) > 3000)
- {
- $img_imagick = str_replace('\\', '/', $location);
- continue;
- }
- }
- }
- else
- {
- $img_imagick = str_replace('\\', '/', $magic_home);
- }
-
- $this->config->set('img_imagick', $img_imagick);
- }
-
- /**
- * {@inheritdoc}
- */
- static public function get_step_count()
- {
- return 0;
- }
-
- /**
- * {@inheritdoc}
- */
- public function get_task_lang_name()
- {
- return '';
- }
-}
diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php
index 1ef70eae08..5096ce284e 100644
--- a/phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php
+++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_server_data.php
@@ -79,9 +79,9 @@ class obtain_server_data extends \phpbb\install\task_base implements \phpbb\inst
$cookie_secure = $this->io_handler->get_input('cookie_secure', $cookie_secure);
$server_protocol = $this->io_handler->get_input('server_protocol', $server_protocol);
$force_server_vars = $this->io_handler->get_input('force_server_vars', 0);
- $server_name = $this->io_handler->get_input('server_name', $server_name);
+ $server_name = $this->io_handler->get_input('server_name', $server_name, true);
$server_port = $this->io_handler->get_input('server_port', $server_port);
- $script_path = $this->io_handler->get_input('script_path', $script_path);
+ $script_path = $this->io_handler->get_input('script_path', $script_path, true);
// Clean up script path
if ($script_path !== '/')
diff --git a/phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php
index f31472fc58..3c17576c13 100644
--- a/phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php
+++ b/phpBB/phpbb/install/module/obtain_data/task/obtain_update_ftp_data.php
@@ -85,10 +85,10 @@ class obtain_update_ftp_data extends task_base
$method = $methods[0];
}
- $ftp_host = $this->iohandler->get_input('ftp_host', '');
- $ftp_user = $this->iohandler->get_input('ftp_user', '');
- $ftp_pass = htmlspecialchars_decode($this->iohandler->get_input('ftp_pass', ''));
- $ftp_path = $this->iohandler->get_input('ftp_path', '');
+ $ftp_host = $this->iohandler->get_input('ftp_host', '', true);
+ $ftp_user = $this->iohandler->get_input('ftp_user', '', true);
+ $ftp_pass = htmlspecialchars_decode($this->iohandler->get_input('ftp_pass', '', true));
+ $ftp_path = $this->iohandler->get_input('ftp_path', '', true);
$ftp_port = $this->iohandler->get_input('ftp_port', 21);
$ftp_time = $this->iohandler->get_input('ftp_timeout', 10);
diff --git a/phpBB/phpbb/install/module/requirements/task/check_update.php b/phpBB/phpbb/install/module/requirements/task/check_update.php
index cd66ffc8f9..4eb2c6d75e 100644
--- a/phpBB/phpbb/install/module/requirements/task/check_update.php
+++ b/phpBB/phpbb/install/module/requirements/task/check_update.php
@@ -122,8 +122,11 @@ class check_update extends task_base
// Check for a valid update directory
if (!$this->filesystem->exists($update_files) || !$this->filesystem->is_readable($update_files))
{
- $this->iohandler->add_warning_message('UPDATE_FILES_NOT_FOUND');
- $this->set_test_passed(false);
+ if ($this->iohandler->get_input('update_type', 'all') === 'all')
+ {
+ $this->iohandler->add_warning_message('UPDATE_FILES_NOT_FOUND');
+ $this->set_test_passed(false);
+ }
// If there are no update files, we can't check the version etc
// However, we can let the users run migrations if they really want to...
diff --git a/phpBB/phpbb/install/module/update_database/task/update_extensions.php b/phpBB/phpbb/install/module/update_database/task/update_extensions.php
index b66847b243..0195b9c661 100644
--- a/phpBB/phpbb/install/module/update_database/task/update_extensions.php
+++ b/phpBB/phpbb/install/module/update_database/task/update_extensions.php
@@ -206,7 +206,7 @@ class update_extensions extends task_base
$this->install_config->set('update_extensions_index', $i);
- if ($i < sizeof($all_available_extensions))
+ if ($i < count($all_available_extensions))
{
throw new resource_limit_reached_exception();
}
diff --git a/phpBB/phpbb/install/module/update_filesystem/task/diff_files.php b/phpBB/phpbb/install/module/update_filesystem/task/diff_files.php
index 1792a3b723..2f6048b4fd 100644
--- a/phpBB/phpbb/install/module/update_filesystem/task/diff_files.php
+++ b/phpBB/phpbb/install/module/update_filesystem/task/diff_files.php
@@ -103,8 +103,8 @@ class diff_files extends task_base
$old_path = $this->update_helper->get_path_to_old_update_files();
$new_path = $this->update_helper->get_path_to_new_update_files();
- $files_to_diff = $this->installer_config->get('update_files', array());
- $files_to_diff = $files_to_diff['update_with_diff'];
+ $update_files = $this->installer_config->get('update_files', array());
+ $files_to_diff = $update_files['update_with_diff'];
// Set progress bar
$this->iohandler->set_task_count(count($files_to_diff), true);
@@ -145,7 +145,7 @@ class diff_files extends task_base
{
$file_contents[] = file_get_contents($file_to_diff);
- if ($file_contents[sizeof($file_contents) - 1] === false)
+ if ($file_contents[count($file_contents) - 1] === false)
{
$this->iohandler->add_error_message(array('FILE_DIFFER_ERROR_FILE_CANNOT_BE_READ', $files_to_diff));
unset($file_contents);
@@ -154,7 +154,6 @@ class diff_files extends task_base
}
$diff = new \diff3($file_contents[0], $file_contents[1], $file_contents[2]);
- unset($file_contents);
// Handle conflicts
if ($diff->get_num_conflicts() !== 0)
@@ -162,12 +161,20 @@ class diff_files extends task_base
$merge_conflicts[] = $filename;
}
- // Save merged output
- $this->cache->put(
- '_file_' . md5($filename),
- base64_encode(implode("\n", $diff->merged_output()))
- );
+ if ($diff->merged_output() !== $file_contents[1])
+ {
+ // Save merged output
+ $this->cache->put(
+ '_file_' . md5($filename),
+ base64_encode(implode("\n", $diff->merged_output()))
+ );
+ }
+ else
+ {
+ unset($update_files['update_with_diff'][$key]);
+ }
+ unset($file_contents);
unset($diff);
}
else
@@ -199,6 +206,16 @@ class diff_files extends task_base
$this->installer_config->set('merge_conflict_list', $merge_conflicts);
$this->installer_config->set('file_diff_update_count', $progress_count);
+ foreach ($update_files as $type => $files)
+ {
+ if (empty($files))
+ {
+ unset($update_files[$type]);
+ }
+ }
+
+ $this->installer_config->set('update_files', $update_files);
+
// Request refresh
throw new resource_limit_reached_exception();
}
@@ -206,6 +223,16 @@ class diff_files extends task_base
$this->iohandler->finish_progress('ALL_FILES_DIFFED');
$this->installer_config->set('merge_conflict_list', $merge_conflicts);
+
+ foreach ($update_files as $type => $files)
+ {
+ if (empty($files))
+ {
+ unset($update_files[$type]);
+ }
+ }
+
+ $this->installer_config->set('update_files', $update_files);
}
/**
diff --git a/phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php b/phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php
index 21aa93b7ea..4d7f0e0cdf 100644
--- a/phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php
+++ b/phpBB/phpbb/install/module/update_filesystem/task/download_updated_files.php
@@ -86,7 +86,8 @@ class download_updated_files extends task_base
{
$file_update_info = $this->installer_config->get('update_files', array());
- if (count($file_update_info) > 0)
+ // Display download box only if the archive won't be empty
+ if (!empty($file_update_info) && !(isset($file_update_info['delete']) && count($file_update_info) == 1))
{
// Render download box
$this->iohandler->add_download_link(
@@ -99,13 +100,14 @@ class download_updated_files extends task_base
// Add form to continue update
$this->iohandler->add_user_form_group('UPDATE_CONTINUE_UPDATE_PROCESS', array(
'update_recheck_files_submit' => array(
- 'label' => 'UPDATE_RECHECK_UPDATE_FILES',
- 'type' => 'submit',
+ 'label' => 'UPDATE_RECHECK_UPDATE_FILES',
+ 'type' => 'submit',
+ 'is_secondary' => empty($file_update_info),
),
'database_update_submit' => array(
'label' => 'UPDATE_CONTINUE_UPDATE_PROCESS',
'type' => 'submit',
- 'disabled' => count($file_update_info) > 0,
+ 'disabled' => !empty($file_update_info),
),
));
diff --git a/phpBB/phpbb/language/language.php b/phpBB/phpbb/language/language.php
index 42429c2c07..51e6d0b185 100644
--- a/phpBB/phpbb/language/language.php
+++ b/phpBB/phpbb/language/language.php
@@ -312,7 +312,7 @@ class language
// Replace key with language entry and simply pass along...
return vsprintf($lang, $args);
}
- else if (sizeof($lang) == 0)
+ else if (count($lang) == 0)
{
// If the language entry is an empty array, we just return the language key
return $key;
@@ -322,7 +322,7 @@ class language
$key_found = false;
// We now get the first number passed and will select the key based upon this number
- for ($i = 0, $num_args = sizeof($args); $i < $num_args; $i++)
+ for ($i = 0, $num_args = count($args); $i < $num_args; $i++)
{
if (is_int($args[$i]) || is_float($args[$i]))
{
diff --git a/phpBB/phpbb/language/language_file_loader.php b/phpBB/phpbb/language/language_file_loader.php
index 359202fd63..b6816afd16 100644
--- a/phpBB/phpbb/language/language_file_loader.php
+++ b/phpBB/phpbb/language/language_file_loader.php
@@ -127,7 +127,7 @@ class language_file_loader
// the first directory from the path (that should be the language directory)
$path_diff_parts = explode('/', $path_diff);
- if (sizeof($path_diff_parts) > 1)
+ if (count($path_diff_parts) > 1)
{
array_shift($path_diff_parts);
$component = implode('/', $path_diff_parts) . '/';
diff --git a/phpBB/phpbb/log/log.php b/phpBB/phpbb/log/log.php
index 5aad7ee326..5333fe2bdf 100644
--- a/phpBB/phpbb/log/log.php
+++ b/phpBB/phpbb/log/log.php
@@ -391,7 +391,7 @@ class log implements \phpbb\log\log_interface
{
$sql_where .= ' AND ';
- if (is_array($field_value) && sizeof($field_value) == 2 && !is_array($field_value[1]))
+ if (is_array($field_value) && count($field_value) == 2 && !is_array($field_value[1]))
{
$sql_where .= $field . ' ' . $field_value[0] . ' ' . $field_value[1];
}
@@ -689,9 +689,9 @@ class log implements \phpbb\log\log_interface
}
}
- if (($num_args - sizeof($log_data_ary)) > 0)
+ if (($num_args - count($log_data_ary)) > 0)
{
- $log_data_ary = array_merge($log_data_ary, array_fill(0, $num_args - sizeof($log_data_ary), ''));
+ $log_data_ary = array_merge($log_data_ary, array_fill(0, $num_args - count($log_data_ary), ''));
}
$lang_arguments = array_merge(array($log[$i]['action']), $log_data_ary);
@@ -740,7 +740,7 @@ class log implements \phpbb\log\log_interface
$vars = array('log', 'topic_id_list', 'reportee_id_list');
extract($this->dispatcher->trigger_event('core.get_logs_get_additional_data', compact($vars)));
- if (sizeof($topic_id_list))
+ if (count($topic_id_list))
{
$topic_auth = $this->get_topic_auth($topic_id_list);
@@ -752,7 +752,7 @@ class log implements \phpbb\log\log_interface
}
}
- if (sizeof($reportee_id_list))
+ if (count($reportee_id_list))
{
$reportee_data_list = $this->get_reportee_data($reportee_id_list);
@@ -838,7 +838,7 @@ class log implements \phpbb\log\log_interface
$keywords_pattern = array();
// Build pattern and keywords...
- for ($i = 0, $num_keywords = sizeof($keywords); $i < $num_keywords; $i++)
+ for ($i = 0, $num_keywords = count($keywords); $i < $num_keywords; $i++)
{
$keywords_pattern[] = preg_quote($keywords[$i], '#');
$keywords[$i] = $this->db->sql_like_expression($this->db->get_any_char() . $keywords[$i] . $this->db->get_any_char());
@@ -933,6 +933,20 @@ class log implements \phpbb\log\log_interface
$forum_auth['f_read'][$row['topic_id']] = $row['forum_id'];
}
+ /**
+ * Allow modifying SQL query after topic data is retrieved (inside loop).
+ *
+ * @event core.phpbb_log_get_topic_auth_sql_after
+ * @var array forum_auth Forum permissions
+ * @var array row One row of data from SQL query
+ * @since 3.2.2-RC1
+ */
+ $vars = array(
+ 'forum_auth',
+ 'row',
+ );
+ extract($this->dispatcher->trigger_event('core.phpbb_log_get_topic_auth_sql_after', compact($vars)));
+
if ($this->auth->acl_gets('a_', 'm_', $row['forum_id']))
{
$forum_auth['m_'][$row['topic_id']] = $row['forum_id'];
diff --git a/phpBB/phpbb/message/admin_form.php b/phpBB/phpbb/message/admin_form.php
index 96b8d3499e..ae1c1d8614 100644
--- a/phpBB/phpbb/message/admin_form.php
+++ b/phpBB/phpbb/message/admin_form.php
@@ -22,6 +22,9 @@ class admin_form extends form
/** @var \phpbb\config\db_text */
protected $config_text;
+ /** @var \phpbb\event\dispatcher_interface */
+ protected $dispatcher;
+
/** @var string */
protected $subject;
/** @var string */
@@ -37,13 +40,15 @@ class admin_form extends form
* @param \phpbb\config\db_text $config_text
* @param \phpbb\db\driver\driver_interface $db
* @param \phpbb\user $user
+ * @param \phpbb\event\dispatcher_interface $dispatcher
* @param string $phpbb_root_path
* @param string $phpEx
*/
- public function __construct(\phpbb\auth\auth $auth, \phpbb\config\config $config, \phpbb\config\db_text $config_text, \phpbb\db\driver\driver_interface $db, \phpbb\user $user, $phpbb_root_path, $phpEx)
+ public function __construct(\phpbb\auth\auth $auth, \phpbb\config\config $config, \phpbb\config\db_text $config_text, \phpbb\db\driver\driver_interface $db, \phpbb\user $user, \phpbb\event\dispatcher_interface $dispatcher, $phpbb_root_path, $phpEx)
{
parent::__construct($auth, $config, $db, $user, $phpbb_root_path, $phpEx);
$this->config_text = $config_text;
+ $this->dispatcher = $dispatcher;
}
/**
@@ -91,6 +96,29 @@ class admin_form extends form
$this->errors[] = $this->user->lang['EMPTY_MESSAGE_EMAIL'];
}
+ $subject = $this->subject;
+ $body = $this->body;
+ $errors = $this->errors;
+
+ /**
+ * You can use this event to modify subject and/or body and add new errors.
+ *
+ * @event core.message_admin_form_submit_before
+ * @var string subject Message subject
+ * @var string body Message body
+ * @var array errors Form errors
+ * @since 3.2.6-RC1
+ */
+ $vars = [
+ 'subject',
+ 'body',
+ 'errors',
+ ];
+ extract($this->dispatcher->trigger_event('core.message_admin_form_submit_before', compact($vars)));
+ $this->subject = $subject;
+ $this->body = $body;
+ $this->errors = $errors;
+
if ($this->user->data['is_registered'])
{
$this->message->set_sender_from_user($this->user);
diff --git a/phpBB/phpbb/message/form.php b/phpBB/phpbb/message/form.php
index 21d4de0b4d..63bada91ff 100644
--- a/phpBB/phpbb/message/form.php
+++ b/phpBB/phpbb/message/form.php
@@ -139,7 +139,7 @@ abstract class form
$this->errors[] = 'FORM_INVALID';
}
- if (!sizeof($this->errors))
+ if (!count($this->errors))
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_emailtime = ' . time() . '
@@ -169,7 +169,7 @@ abstract class form
add_form_key('memberlist_email');
$template->assign_vars(array(
- 'ERROR_MESSAGE' => (sizeof($this->errors)) ? implode('<br />', $this->errors) : '',
+ 'ERROR_MESSAGE' => (count($this->errors)) ? implode('<br />', $this->errors) : '',
));
}
}
diff --git a/phpBB/phpbb/message/message.php b/phpBB/phpbb/message/message.php
index 5fd24b542e..fa701d1c77 100644
--- a/phpBB/phpbb/message/message.php
+++ b/phpBB/phpbb/message/message.php
@@ -209,7 +209,7 @@ class message
*/
public function cc_sender()
{
- if (!sizeof($this->recipients))
+ if (!count($this->recipients))
{
trigger_error('No email recipients specified');
}
@@ -238,7 +238,7 @@ class message
*/
public function send(\messenger $messenger, $contact)
{
- if (!sizeof($this->recipients))
+ if (!count($this->recipients))
{
return;
}
@@ -271,7 +271,7 @@ class message
'MESSAGE' => htmlspecialchars_decode($this->body))
);
- if (sizeof($this->template_vars))
+ if (count($this->template_vars))
{
$messenger->assign_vars($this->template_vars);
}
diff --git a/phpBB/phpbb/module/module_manager.php b/phpBB/phpbb/module/module_manager.php
index 67bac5b33e..00df33f62f 100644
--- a/phpBB/phpbb/module/module_manager.php
+++ b/phpBB/phpbb/module/module_manager.php
@@ -311,7 +311,7 @@ class module_manager
// we're turning a category into a module
$branch = $this->get_module_branch($module_data['module_id'], $module_data['module_class'], 'children', false);
- if (sizeof($branch))
+ if (count($branch))
{
throw new module_not_found_exception('NO_CATEGORY_TO_MODULE');
}
@@ -353,10 +353,10 @@ class module_manager
}
$from_data = $moved_modules[0];
- $diff = sizeof($moved_modules) * 2;
+ $diff = count($moved_modules) * 2;
$moved_ids = array();
- for ($i = 0, $size = sizeof($moved_modules); $i < $size; ++$i)
+ for ($i = 0, $size = count($moved_modules); $i < $size; ++$i)
{
$moved_ids[] = $moved_modules[$i]['module_id'];
}
@@ -443,7 +443,7 @@ class module_manager
$branch = $this->get_module_branch($module_id, $module_class, 'children', false);
- if (sizeof($branch))
+ if (count($branch))
{
throw new module_exception('CANNOT_REMOVE_MODULE');
}
@@ -506,7 +506,7 @@ class module_manager
}
$this->db->sql_freeresult($result);
- if (!sizeof($target))
+ if (!count($target))
{
// The module is already on top or bottom
throw new module_not_found_exception();
diff --git a/phpBB/phpbb/notification/manager.php b/phpBB/phpbb/notification/manager.php
index 1cd7e5bc9a..52c650df5d 100644
--- a/phpBB/phpbb/notification/manager.php
+++ b/phpBB/phpbb/notification/manager.php
@@ -339,7 +339,7 @@ class manager
}
}
- if (!sizeof($notify_users))
+ if (!count($notify_users))
{
return;
}
@@ -899,32 +899,19 @@ class manager
*/
public function get_notification_type_id($notification_type_name)
{
- $notification_type_ids = $this->cache->get('notification_type_ids');
-
- $this->db->sql_transaction('begin');
-
- if ($notification_type_ids === false)
+ $sql = 'SELECT notification_type_id, notification_type_name
+ FROM ' . $this->notification_types_table;
+ $result = $this->db->sql_query($sql, 604800); // cache for one week
+ while ($row = $this->db->sql_fetchrow($result))
{
- $notification_type_ids = array();
-
- $sql = 'SELECT notification_type_id, notification_type_name
- FROM ' . $this->notification_types_table;
- $result = $this->db->sql_query($sql);
- while ($row = $this->db->sql_fetchrow($result))
- {
- $notification_type_ids[$row['notification_type_name']] = (int) $row['notification_type_id'];
- }
- $this->db->sql_freeresult($result);
-
- $this->cache->put('notification_type_ids', $notification_type_ids);
+ $notification_type_ids[$row['notification_type_name']] = (int) $row['notification_type_id'];
}
+ $this->db->sql_freeresult($result);
if (!isset($notification_type_ids[$notification_type_name]))
{
if (!isset($this->notification_types[$notification_type_name]) && !isset($this->notification_types['notification.type.' . $notification_type_name]))
{
- $this->db->sql_transaction('rollback');
-
throw new \phpbb\notification\exception('NOTIFICATION_TYPE_NOT_EXIST', array($notification_type_name));
}
@@ -934,13 +921,13 @@ class manager
));
$this->db->sql_query($sql);
+ // expose new notification type ID for this request
$notification_type_ids[$notification_type_name] = (int) $this->db->sql_nextid();
- $this->cache->put('notification_type_ids', $notification_type_ids);
+ // destroy cache, we have a new addition which we have to to load next time
+ $this->cache->destroy('sql', $this->notification_types_table);
}
- $this->db->sql_transaction('commit');
-
return $notification_type_ids[$notification_type_name];
}
diff --git a/phpBB/phpbb/notification/method/board.php b/phpBB/phpbb/notification/method/board.php
index 931b252daa..faa53576e0 100644
--- a/phpBB/phpbb/notification/method/board.php
+++ b/phpBB/phpbb/notification/method/board.php
@@ -394,6 +394,6 @@ class board extends \phpbb\notification\method\base
WHERE notification_type_id = ' . (int) $notification_type_id;
$this->db->sql_query($sql);
- $this->cache->destroy('notification_type_ids');
+ $this->cache->destroy('sql', $this->notification_types_table);
}
}
diff --git a/phpBB/phpbb/notification/method/email.php b/phpBB/phpbb/notification/method/email.php
index 56dd1e9367..6376d13dc7 100644
--- a/phpBB/phpbb/notification/method/email.php
+++ b/phpBB/phpbb/notification/method/email.php
@@ -65,7 +65,7 @@ class email extends \phpbb\notification\method\messenger_base
*/
public function is_available(type_interface $notification_type = null)
{
- return parent::is_available($notification_type) && $this->config['email_enable'] && $this->user->data['user_email'];
+ return parent::is_available($notification_type) && $this->config['email_enable'] && !empty($this->user->data['user_email']);
}
/**
diff --git a/phpBB/phpbb/notification/method/messenger_base.php b/phpBB/phpbb/notification/method/messenger_base.php
index 32e79aa936..f82017b70e 100644
--- a/phpBB/phpbb/notification/method/messenger_base.php
+++ b/phpBB/phpbb/notification/method/messenger_base.php
@@ -87,7 +87,7 @@ abstract class messenger_base extends \phpbb\notification\method\base
$banned_users = phpbb_get_banned_user_ids($user_ids);
// Load all the users we need
- $this->user_loader->load_users($user_ids);
+ $this->user_loader->load_users(array_diff($user_ids, $banned_users), array(USER_IGNORE));
// Load the messenger
if (!class_exists('messenger'))
@@ -107,7 +107,7 @@ abstract class messenger_base extends \phpbb\notification\method\base
$user = $this->user_loader->get_user($notification->user_id);
- if ($user['user_type'] == USER_IGNORE || ($user['user_type'] == USER_INACTIVE && $user['user_inactive_reason'] == INACTIVE_MANUAL) || in_array($notification->user_id, $banned_users))
+ if ($user['user_type'] == USER_INACTIVE && $user['user_inactive_reason'] == INACTIVE_MANUAL)
{
continue;
}
diff --git a/phpBB/phpbb/notification/type/admin_activate_user.php b/phpBB/phpbb/notification/type/admin_activate_user.php
index 9f2ae857ef..78c10ac36a 100644
--- a/phpBB/phpbb/notification/type/admin_activate_user.php
+++ b/phpBB/phpbb/notification/type/admin_activate_user.php
@@ -175,7 +175,7 @@ class admin_activate_user extends \phpbb\notification\type\base
/**
* {@inheritdoc}
*/
- public function create_insert_array($user, $pre_create_data)
+ public function create_insert_array($user, $pre_create_data = array())
{
$this->set_data('user_actkey', $user['user_actkey']);
$this->notification_time = $user['user_regdate'];
diff --git a/phpBB/phpbb/notification/type/pm.php b/phpBB/phpbb/notification/type/pm.php
index 8fb9172911..c51586afb9 100644
--- a/phpBB/phpbb/notification/type/pm.php
+++ b/phpBB/phpbb/notification/type/pm.php
@@ -99,7 +99,7 @@ class pm extends \phpbb\notification\type\base
'ignore_users' => array(),
), $options);
- if (!sizeof($pm['recipients']))
+ if (!count($pm['recipients']))
{
return array();
}
diff --git a/phpBB/phpbb/notification/type/post.php b/phpBB/phpbb/notification/type/post.php
index 03221e7c7a..254f4c07b3 100644
--- a/phpBB/phpbb/notification/type/post.php
+++ b/phpBB/phpbb/notification/type/post.php
@@ -202,9 +202,9 @@ class post extends \phpbb\notification\type\base
'username' => $this->get_data('post_username'),
)), $responders);
- $responders_cnt = sizeof($responders);
+ $responders_cnt = count($responders);
$responders = $this->trim_user_ary($responders);
- $trimmed_responders_cnt = $responders_cnt - sizeof($responders);
+ $trimmed_responders_cnt = $responders_cnt - count($responders);
foreach ($responders as $responder)
{
@@ -337,7 +337,7 @@ class post extends \phpbb\notification\type\base
*/
public function trim_user_ary($users)
{
- if (sizeof($users) > 4)
+ if (count($users) > 4)
{
array_splice($users, 3);
}
@@ -357,7 +357,7 @@ class post extends \phpbb\notification\type\base
*/
public function pre_create_insert_array($post, $notify_users)
{
- if (!sizeof($notify_users) || !$this->inherit_read_status)
+ if (!count($notify_users) || !$this->inherit_read_status)
{
return array();
}
@@ -426,7 +426,7 @@ class post extends \phpbb\notification\type\base
// Do not add more than 25 responders,
// we trim the username list to "a, b, c and x others" anyway
// so there is no use to add all of them anyway.
- if (sizeof($responders) > 25)
+ if (count($responders) > 25)
{
return array();
}
diff --git a/phpBB/phpbb/notification/type/report_pm.php b/phpBB/phpbb/notification/type/report_pm.php
index 7e53ffb3ca..444f98270d 100644
--- a/phpBB/phpbb/notification/type/report_pm.php
+++ b/phpBB/phpbb/notification/type/report_pm.php
@@ -142,13 +142,16 @@ class report_pm extends \phpbb\notification\type\pm
*/
public function get_email_template_variables()
{
- $user_data = $this->user_loader->get_user($this->get_data('reporter_id'));
+ $user_data = $this->user_loader->get_user($this->get_data('from_user_id'));
return array(
'AUTHOR_NAME' => htmlspecialchars_decode($user_data['username']),
'SUBJECT' => htmlspecialchars_decode(censor_text($this->get_data('message_subject'))),
- 'U_VIEW_REPORT' => generate_board_url() . "mcp.{$this->php_ext}?r={$this->item_parent_id}&amp;i=pm_reports&amp;mode=pm_report_details",
+ /** @deprecated 3.2.6-RC1 (to be removed in 4.0.0) use {SUBJECT} instead in report_pm.txt */
+ 'TOPIC_TITLE' => htmlspecialchars_decode(censor_text($this->get_data('message_subject'))),
+
+ 'U_VIEW_REPORT' => generate_board_url() . "/mcp.{$this->php_ext}?r={$this->item_parent_id}&amp;i=pm_reports&amp;mode=pm_report_details",
);
}
@@ -236,8 +239,10 @@ class report_pm extends \phpbb\notification\type\pm
*/
public function users_to_query()
{
- return array($this->get_data('reporter_id'));
- }
+ return array(
+ $this->get_data('from_user_id'),
+ $this->get_data('reporter_id'),
+ ); }
/**
* {@inheritdoc}
diff --git a/phpBB/phpbb/notification/type/topic.php b/phpBB/phpbb/notification/type/topic.php
index 671c34fe96..5c42afa8c8 100644
--- a/phpBB/phpbb/notification/type/topic.php
+++ b/phpBB/phpbb/notification/type/topic.php
@@ -261,7 +261,7 @@ class topic extends \phpbb\notification\type\base
*/
public function pre_create_insert_array($post, $notify_users)
{
- if (!sizeof($notify_users) || !$this->inherit_read_status)
+ if (!count($notify_users) || !$this->inherit_read_status)
{
return array();
}
diff --git a/phpBB/phpbb/pagination.php b/phpBB/phpbb/pagination.php
index a5a95b096d..a7086f6691 100644
--- a/phpBB/phpbb/pagination.php
+++ b/phpBB/phpbb/pagination.php
@@ -46,7 +46,7 @@ class pagination
/**
* Generate a pagination link based on the url and the page information
*
- * @param string $base_url is url prepended to all links generated within the function
+ * @param string|array $base_url is url prepended to all links generated within the function
* If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
* for the page. Also be sure to specify the pagination path information into the start_name argument
* @param string $on_page is the page for which we want to generate the link
@@ -69,7 +69,7 @@ class pagination
* set $generate_page_link_override to the new URL value
*
* @event core.pagination_generate_page_link
- * @var string base_url is url prepended to all links generated within the function
+ * @var string|array base_url is url prepended to all links generated within the function
* If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
* for the page. Also be sure to specify the pagination path information into the start_name argument
* @var string on_page is the page for which we want to generate the link
@@ -120,7 +120,7 @@ class pagination
* Generate template rendered pagination
* Allows full control of rendering of pagination with the template
*
- * @param string $base_url is url prepended to all links generated within the function
+ * @param string|array $base_url is url prepended to all links generated within the function
* If you use page numbers inside your controller route, base_url should contains a placeholder (%d)
* for the page. Also be sure to specify the pagination path information into the start_name argument
* @param string $block_var_name is the name assigned to the pagination data block within the template (example: <!-- BEGIN pagination -->)
@@ -132,10 +132,15 @@ class pagination
* @param int $start the item which should be considered currently active, used to determine the page we're on
* @param bool $reverse_count determines whether we weight display of the list towards the start (false) or end (true) of the list
* @param bool $ignore_on_page decides whether we enable an active (unlinked) item, used primarily for embedded lists
- * @return null
+ * @return void
*/
public function generate_template_pagination($base_url, $block_var_name, $start_name, $num_items, $per_page, $start = 1, $reverse_count = false, $ignore_on_page = false)
{
+ if (empty($base_url))
+ {
+ return;
+ }
+
$total_pages = ceil($num_items / $per_page);
$on_page = $this->get_on_page($per_page, $start);
$u_previous_page = $u_next_page = '';
diff --git a/phpBB/phpbb/permissions.php b/phpBB/phpbb/permissions.php
index c9181e6202..7697884b6a 100644
--- a/phpBB/phpbb/permissions.php
+++ b/phpBB/phpbb/permissions.php
@@ -260,6 +260,7 @@ class permissions
// Forum Permissions
'f_list' => array('lang' => 'ACL_F_LIST', 'cat' => 'actions'),
+ 'f_list_topics' => array('lang' => 'ACL_F_LIST_TOPICS', 'cat' => 'actions'),
'f_read' => array('lang' => 'ACL_F_READ', 'cat' => 'actions'),
'f_search' => array('lang' => 'ACL_F_SEARCH', 'cat' => 'actions'),
'f_subscribe' => array('lang' => 'ACL_F_SUBSCRIBE', 'cat' => 'actions'),
diff --git a/phpBB/phpbb/profilefields/manager.php b/phpBB/phpbb/profilefields/manager.php
index ea4b24af56..35b18ddf07 100644
--- a/phpBB/phpbb/profilefields/manager.php
+++ b/phpBB/phpbb/profilefields/manager.php
@@ -230,7 +230,7 @@ class manager
*/
public function update_profile_field_data($user_id, $cp_data)
{
- if (!sizeof($cp_data))
+ if (!count($cp_data))
{
return;
}
@@ -258,7 +258,7 @@ class manager
*/
public function generate_profile_fields_template_headlines($restrict_option = '')
{
- if (!sizeof($this->profile_cache))
+ if (!count($this->profile_cache))
{
$this->build_cache();
}
@@ -318,12 +318,12 @@ class manager
$user_ids = array($user_ids);
}
- if (!sizeof($this->profile_cache))
+ if (!count($this->profile_cache))
{
$this->build_cache();
}
- if (!sizeof($user_ids))
+ if (!count($user_ids))
{
return array();
}
@@ -486,7 +486,7 @@ class manager
$sql = 'SELECT f.field_type, f.field_ident, f.field_default_value, l.lang_default_value
FROM ' . $this->fields_language_table . ' l, ' . $this->fields_table . ' f
WHERE l.lang_id = ' . $this->user->get_iso_lang_id() . '
- ' . ((sizeof($sql_not_in)) ? ' AND ' . $this->db->sql_in_set('f.field_ident', $sql_not_in, true) : '') . '
+ ' . ((count($sql_not_in)) ? ' AND ' . $this->db->sql_in_set('f.field_ident', $sql_not_in, true) : '') . '
AND l.field_id = f.field_id';
$result = $this->db->sql_query($sql);
diff --git a/phpBB/phpbb/profilefields/type/type_bool.php b/phpBB/phpbb/profilefields/type/type_bool.php
index f6f3f17a6c..9c09e27bc4 100644
--- a/phpBB/phpbb/profilefields/type/type_bool.php
+++ b/phpBB/phpbb/profilefields/type/type_bool.php
@@ -398,7 +398,7 @@ class type_bool extends type_base
public function display_options(&$template_vars, &$field_data)
{
// Initialize these array elements if we are creating a new field
- if (!sizeof($field_data['lang_options']))
+ if (!count($field_data['lang_options']))
{
// No options have been defined for a boolean field.
$field_data['lang_options'][0] = '';
diff --git a/phpBB/phpbb/profilefields/type/type_dropdown.php b/phpBB/phpbb/profilefields/type/type_dropdown.php
index 17ae89e1b2..d54404bbb4 100644
--- a/phpBB/phpbb/profilefields/type/type_dropdown.php
+++ b/phpBB/phpbb/profilefields/type/type_dropdown.php
@@ -282,7 +282,7 @@ class type_dropdown extends type_base
*/
public function validate_options_on_submit($error, $field_data)
{
- if (!sizeof($field_data['lang_options']))
+ if (!count($field_data['lang_options']))
{
$error[] = $this->user->lang['NO_FIELD_ENTRIES'];
}
@@ -298,7 +298,7 @@ class type_dropdown extends type_base
if ($step == 2 && $key == 'field_maxlen')
{
// Get the number of options if this key is 'field_maxlen'
- return sizeof(explode("\n", $this->request->variable('lang_options', '', true)));
+ return count(explode("\n", $this->request->variable('lang_options', '', true)));
}
return parent::get_excluded_options($key, $action, $current_value, $field_data, $step);
@@ -310,7 +310,7 @@ class type_dropdown extends type_base
public function display_options(&$template_vars, &$field_data)
{
// Initialize these array elements if we are creating a new field
- if (!sizeof($field_data['lang_options']))
+ if (!count($field_data['lang_options']))
{
// No options have been defined for the dropdown menu
$field_data['lang_options'] = array();
diff --git a/phpBB/phpbb/profilefields/type/type_url.php b/phpBB/phpbb/profilefields/type/type_url.php
index 375cf5b19a..37815b66a5 100644
--- a/phpBB/phpbb/profilefields/type/type_url.php
+++ b/phpBB/phpbb/profilefields/type/type_url.php
@@ -64,11 +64,24 @@ class type_url extends type_string
return false;
}
- if (!preg_match('#^' . get_preg_expression('url') . '$#iu', $field_value))
+ if (!preg_match('#^' . get_preg_expression('url_http') . '$#iu', $field_value))
{
return $this->user->lang('FIELD_INVALID_URL', $this->get_field_name($field_data['lang_name']));
}
return false;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public function get_profile_value($field_value, $field_data)
+ {
+ if (!preg_match('#^' . get_preg_expression('url_http') . '$#iu', $field_value))
+ {
+ return null;
+ }
+
+ return parent::get_profile_value($field_value, $field_data);
+ }
}
diff --git a/phpBB/phpbb/report/controller/report.php b/phpBB/phpbb/report/controller/report.php
index e1c14afde0..0aa6833dfa 100644
--- a/phpBB/phpbb/report/controller/report.php
+++ b/phpBB/phpbb/report/controller/report.php
@@ -141,7 +141,7 @@ class report
// Handle request
try
{
- if (!empty($submit) && sizeof($error) === 0)
+ if (!empty($submit) && count($error) === 0)
{
$this->report_handler->add_report(
(int) $id,
@@ -273,7 +273,7 @@ class report
}
$this->template->assign_vars(array(
- 'ERROR' => (sizeof($error) > 0) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error) > 0) ? implode('<br />', $error) : '',
'S_REPORT_POST' => ($mode === 'pm') ? false : true,
'REPORT_TEXT' => $report_text,
'S_HIDDEN_FIELDS' => (!empty($s_hidden_fields)) ? $s_hidden_fields : null,
@@ -302,7 +302,7 @@ class report
$error[] = $visual_confirmation_response;
}
- if (sizeof($error) === 0)
+ if (count($error) === 0)
{
$captcha->reset();
}
diff --git a/phpBB/phpbb/report/report_handler_pm.php b/phpBB/phpbb/report/report_handler_pm.php
index 2f2a697efc..774ca329ad 100644
--- a/phpBB/phpbb/report/report_handler_pm.php
+++ b/phpBB/phpbb/report/report_handler_pm.php
@@ -53,8 +53,8 @@ class report_handler_pm extends report_handler
'user_notify' => $user_notify,
'report_text' => $report_text,
'reported_post_text' => $this->report_data['message_text'],
- 'reported_post_uid' => $this->report_data['bbcode_bitfield'],
- 'reported_post_bitfield' => $this->report_data['bbcode_uid'],
+ 'reported_post_uid' => $this->report_data['bbcode_uid'],
+ 'reported_post_bitfield' => $this->report_data['bbcode_bitfield'],
'reported_post_enable_bbcode' => $this->report_data['enable_bbcode'],
'reported_post_enable_smilies' => $this->report_data['enable_smilies'],
'reported_post_enable_magic_url' => $this->report_data['enable_magic_url'],
diff --git a/phpBB/phpbb/report/report_handler_post.php b/phpBB/phpbb/report/report_handler_post.php
index 5574a16dc0..52f09683ce 100644
--- a/phpBB/phpbb/report/report_handler_post.php
+++ b/phpBB/phpbb/report/report_handler_post.php
@@ -59,8 +59,8 @@ class report_handler_post extends report_handler
'user_notify' => $user_notify,
'report_text' => $report_text,
'reported_post_text' => $this->report_data['post_text'],
- 'reported_post_uid' => $this->report_data['bbcode_bitfield'],
- 'reported_post_bitfield' => $this->report_data['bbcode_uid'],
+ 'reported_post_uid' => $this->report_data['bbcode_uid'],
+ 'reported_post_bitfield' => $this->report_data['bbcode_bitfield'],
'reported_post_enable_bbcode' => $this->report_data['enable_bbcode'],
'reported_post_enable_smilies' => $this->report_data['enable_smilies'],
'reported_post_enable_magic_url' => $this->report_data['enable_magic_url'],
diff --git a/phpBB/phpbb/request/request.php b/phpBB/phpbb/request/request.php
index 00be8fd381..a0267d1370 100644
--- a/phpBB/phpbb/request/request.php
+++ b/phpBB/phpbb/request/request.php
@@ -150,8 +150,6 @@ class request implements \phpbb\request\request_interface
return;
}
- $this->type_cast_helper->add_magic_quotes($value);
-
// setting to null means unsetting
if ($value === null)
{
diff --git a/phpBB/phpbb/request/type_cast_helper.php b/phpBB/phpbb/request/type_cast_helper.php
index 96e66950ca..912494998d 100644
--- a/phpBB/phpbb/request/type_cast_helper.php
+++ b/phpBB/phpbb/request/type_cast_helper.php
@@ -18,69 +18,6 @@ namespace phpbb\request;
*/
class type_cast_helper implements \phpbb\request\type_cast_helper_interface
{
-
- /**
- * @var string Whether slashes need to be stripped from input
- */
- protected $strip;
-
- /**
- * Initialises the type cast helper class.
- * All it does is find out whether magic quotes are turned on.
- */
- public function __construct()
- {
- if (version_compare(PHP_VERSION, '5.4.0-dev', '>='))
- {
- $this->strip = false;
- }
- else
- {
- $this->strip = (@get_magic_quotes_gpc()) ? true : false;
- }
- }
-
- /**
- * Recursively applies addslashes to a variable.
- *
- * @param mixed &$var Variable passed by reference to which slashes will be added.
- */
- public function addslashes_recursively(&$var)
- {
- if (is_string($var))
- {
- $var = addslashes($var);
- }
- else if (is_array($var))
- {
- $var_copy = $var;
- $var = array();
- foreach ($var_copy as $key => $value)
- {
- if (is_string($key))
- {
- $key = addslashes($key);
- }
- $var[$key] = $value;
-
- $this->addslashes_recursively($var[$key]);
- }
- }
- }
-
- /**
- * Recursively applies addslashes to a variable if magic quotes are turned on.
- *
- * @param mixed &$var Variable passed by reference to which slashes will be added.
- */
- public function add_magic_quotes(&$var)
- {
- if ($this->strip)
- {
- $this->addslashes_recursively($var);
- }
- }
-
/**
* Set variable $result to a particular type.
*
@@ -129,8 +66,6 @@ class type_cast_helper implements \phpbb\request\type_cast_helper_interface
$result = preg_replace('/[\x80-\xFF]/', '?', $result);
}
}
-
- $result = ($this->strip) ? stripslashes($result) : $result;
}
}
diff --git a/phpBB/phpbb/request/type_cast_helper_interface.php b/phpBB/phpbb/request/type_cast_helper_interface.php
index 2cb28d021f..9671573bf1 100644
--- a/phpBB/phpbb/request/type_cast_helper_interface.php
+++ b/phpBB/phpbb/request/type_cast_helper_interface.php
@@ -19,20 +19,6 @@ namespace phpbb\request;
interface type_cast_helper_interface
{
/**
- * Recursively applies addslashes to a variable.
- *
- * @param mixed &$var Variable passed by reference to which slashes will be added.
- */
- public function addslashes_recursively(&$var);
-
- /**
- * Recursively applies addslashes to a variable if magic quotes are turned on.
- *
- * @param mixed &$var Variable passed by reference to which slashes will be added.
- */
- public function add_magic_quotes(&$var);
-
- /**
* Set variable $result to a particular type.
*
* @param mixed &$result The variable to fill
diff --git a/phpBB/phpbb/search/base.php b/phpBB/phpbb/search/base.php
index 56de973b65..e7d0774b6c 100644
--- a/phpBB/phpbb/search/base.php
+++ b/phpBB/phpbb/search/base.php
@@ -133,7 +133,7 @@ class base
{
global $cache, $config, $db, $user;
- $length = min(sizeof($id_ary), $config['search_block_size']);
+ $length = min(count($id_ary), $config['search_block_size']);
// nothing to cache so exit
if (!$length)
@@ -148,7 +148,7 @@ class base
if (!($store = $cache->get('_search_results_' . $search_key)))
{
// add the current keywords to the recent searches in the cache which are listed on the search page
- if (!empty($keywords) || sizeof($author_ary))
+ if (!empty($keywords) || count($author_ary))
{
$sql = 'SELECT search_time
FROM ' . SEARCH_RESULTS_TABLE . '
@@ -201,7 +201,7 @@ class base
$store += $store_ids;
// if the cache is too big
- if (sizeof($store) - 2 > 20 * $config['search_block_size'])
+ if (count($store) - 2 > 20 * $config['search_block_size'])
{
// remove everything in front of two blocks in front of the current start index
for ($i = 0, $n = $id_range[0] - 2 * $config['search_block_size']; $i < $n; $i++)
@@ -243,7 +243,7 @@ class base
global $db, $cache, $config;
// clear all searches that searched for the specified words
- if (sizeof($words))
+ if (count($words))
{
$sql_where = '';
foreach ($words as $word)
@@ -264,7 +264,7 @@ class base
}
// clear all searches that searched for the specified authors
- if (is_array($authors) && sizeof($authors))
+ if (is_array($authors) && count($authors))
{
$sql_where = '';
foreach ($authors as $author)
diff --git a/phpBB/phpbb/search/fulltext_mysql.php b/phpBB/phpbb/search/fulltext_mysql.php
index da1aad1c3a..1105d0892f 100644
--- a/phpBB/phpbb/search/fulltext_mysql.php
+++ b/phpBB/phpbb/search/fulltext_mysql.php
@@ -188,7 +188,7 @@ class fulltext_mysql extends \phpbb\search\base
}
$sql = 'SHOW VARIABLES
- LIKE \'ft\_%\'';
+ LIKE \'%ft\_%\'';
$result = $this->db->sql_query($sql);
$mysql_info = array();
@@ -198,8 +198,16 @@ class fulltext_mysql extends \phpbb\search\base
}
$this->db->sql_freeresult($result);
- $this->config->set('fulltext_mysql_max_word_len', $mysql_info['ft_max_word_len']);
- $this->config->set('fulltext_mysql_min_word_len', $mysql_info['ft_min_word_len']);
+ if ($engine === 'MyISAM')
+ {
+ $this->config->set('fulltext_mysql_max_word_len', $mysql_info['ft_max_word_len']);
+ $this->config->set('fulltext_mysql_min_word_len', $mysql_info['ft_min_word_len']);
+ }
+ else if ($engine === 'InnoDB')
+ {
+ $this->config->set('fulltext_mysql_max_word_len', $mysql_info['innodb_ft_max_token_size']);
+ $this->config->set('fulltext_mysql_min_word_len', $mysql_info['innodb_ft_min_token_size']);
+ }
return false;
}
@@ -232,9 +240,9 @@ class fulltext_mysql extends \phpbb\search\base
$this->split_words = $matches[1];
// We limit the number of allowed keywords to minimize load on the database
- if ($this->config['max_num_search_keywords'] && sizeof($this->split_words) > $this->config['max_num_search_keywords'])
+ if ($this->config['max_num_search_keywords'] && count($this->split_words) > $this->config['max_num_search_keywords'])
{
- trigger_error($this->user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', (int) $this->config['max_num_search_keywords'], sizeof($this->split_words)));
+ trigger_error($this->user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', (int) $this->config['max_num_search_keywords'], count($this->split_words)));
}
// to allow phrase search, we need to concatenate quoted words
@@ -361,7 +369,7 @@ class fulltext_mysql extends \phpbb\search\base
// remove too short or too long words
$text = array_values($text);
- for ($i = 0, $n = sizeof($text); $i < $n; $i++)
+ for ($i = 0, $n = count($text); $i < $n; $i++)
{
$text[$i] = trim($text[$i]);
if (utf8_strlen($text[$i]) < $this->config['fulltext_mysql_min_word_len'] || utf8_strlen($text[$i]) > $this->config['fulltext_mysql_max_word_len'])
@@ -563,12 +571,12 @@ class fulltext_mysql extends \phpbb\search\base
$sql_select = ($type == 'posts') ? $sql_select . 'p.post_id' : 'DISTINCT ' . $sql_select . 't.topic_id';
$sql_from = ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
$field = ($type == 'posts') ? 'post_id' : 'topic_id';
- if (sizeof($author_ary) && $author_name)
+ if (count($author_ary) && $author_name)
{
// first one matches post of registered users, second one guests and deleted users
$sql_author = ' AND (' . $this->db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
}
- else if (sizeof($author_ary))
+ else if (count($author_ary))
{
$sql_author = ' AND ' . $this->db->sql_in_set('p.poster_id', $author_ary);
}
@@ -580,7 +588,7 @@ class fulltext_mysql extends \phpbb\search\base
$sql_where_options = $sql_sort_join;
$sql_where_options .= ($topic_id) ? ' AND p.topic_id = ' . $topic_id : '';
$sql_where_options .= ($join_topic) ? ' AND t.topic_id = p.topic_id' : '';
- $sql_where_options .= (sizeof($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
+ $sql_where_options .= (count($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
$sql_where_options .= ' AND ' . $post_visibility;
$sql_where_options .= $sql_author;
$sql_where_options .= ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
@@ -591,6 +599,7 @@ class fulltext_mysql extends \phpbb\search\base
WHERE MATCH ($sql_match) AGAINST ('" . $this->db->sql_escape(htmlspecialchars_decode($this->search_query)) . "' IN BOOLEAN MODE)
$sql_where_options
ORDER BY $sql_sort";
+ $this->db->sql_return_on_error(true);
$result = $this->db->sql_query_limit($sql, $this->config['search_block_size'], $start);
while ($row = $this->db->sql_fetchrow($result))
@@ -602,7 +611,7 @@ class fulltext_mysql extends \phpbb\search\base
$id_ary = array_unique($id_ary);
// if the total result count is not cached yet, retrieve it from the db
- if (!$result_count)
+ if (!$result_count && count($id_ary))
{
$sql_found_rows = 'SELECT FOUND_ROWS() as result_count';
$result = $this->db->sql_query($sql_found_rows);
@@ -659,7 +668,7 @@ class fulltext_mysql extends \phpbb\search\base
public function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $post_visibility, $topic_id, $author_ary, $author_name, &$id_ary, &$start, $per_page)
{
// No author? No posts
- if (!sizeof($author_ary))
+ if (!count($author_ary))
{
return 0;
}
@@ -736,7 +745,7 @@ class fulltext_mysql extends \phpbb\search\base
{
$sql_author = $this->db->sql_in_set('p.poster_id', $author_ary);
}
- $sql_fora = (sizeof($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
+ $sql_fora = (count($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
$sql_topic_id = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
$sql_time = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
$sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
@@ -889,7 +898,7 @@ class fulltext_mysql extends \phpbb\search\base
$id_ary = array_unique($id_ary);
}
- if (sizeof($id_ary))
+ if (count($id_ary))
{
$this->save_ids($search_key, '', $author_ary, $result_count, $id_ary, $start, $sort_dir);
$id_ary = array_slice($id_ary, 0, $per_page);
@@ -917,6 +926,34 @@ class fulltext_mysql extends \phpbb\search\base
$words = array_unique(array_merge($split_text, $split_title));
+ /**
+ * Event to modify method arguments and words before the MySQL search index is updated
+ *
+ * @event core.search_mysql_index_before
+ * @var string mode Contains the post mode: edit, post, reply, quote
+ * @var int post_id The id of the post which is modified/created
+ * @var string message New or updated post content
+ * @var string subject New or updated post subject
+ * @var int poster_id Post author's user id
+ * @var int forum_id The id of the forum in which the post is located
+ * @var array words List of words added to the index
+ * @var array split_text Array of words from the message
+ * @var array split_title Array of words from the title
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'mode',
+ 'post_id',
+ 'message',
+ 'subject',
+ 'poster_id',
+ 'forum_id',
+ 'words',
+ 'split_text',
+ 'split_title',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_index_before', compact($vars)));
+
unset($split_text);
unset($split_title);
@@ -996,12 +1033,37 @@ class fulltext_mysql extends \phpbb\search\base
$alter_list[] = $alter_entry;
}
- if (sizeof($alter_list))
+ $sql_queries = [];
+
+ foreach ($alter_list as $alter)
{
- foreach ($alter_list as $alter)
- {
- $this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
- }
+ $sql_queries[] = 'ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter);
+ }
+
+ if (!isset($this->stats['post_text']))
+ {
+ $sql_queries[] = 'ALTER TABLE ' . POSTS_TABLE . ' ADD FULLTEXT post_text (post_text)';
+ }
+
+ $stats = $this->stats;
+
+ /**
+ * Event to modify SQL queries before the MySQL search index is created
+ *
+ * @event core.search_mysql_create_index_before
+ * @var array sql_queries Array with queries for creating the search index
+ * @var array stats Array with statistics of the current index (read only)
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'sql_queries',
+ 'stats',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_create_index_before', compact($vars)));
+
+ foreach ($sql_queries as $sql_query)
+ {
+ $this->db->sql_query($sql_query);
}
$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
@@ -1039,9 +1101,37 @@ class fulltext_mysql extends \phpbb\search\base
$alter[] = 'DROP INDEX post_content';
}
- if (sizeof($alter))
+ if (isset($this->stats['post_text']))
{
- $this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
+ $alter[] = 'DROP INDEX post_text';
+ }
+
+ $sql_queries = [];
+
+ if (count($alter))
+ {
+ $sql_queries[] = 'ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter);
+ }
+
+ $stats = $this->stats;
+
+ /**
+ * Event to modify SQL queries before the MySQL search index is deleted
+ *
+ * @event core.search_mysql_delete_index_before
+ * @var array sql_queries Array with queries for deleting the search index
+ * @var array stats Array with statistics of the current index (read only)
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'sql_queries',
+ 'stats',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_delete_index_before', compact($vars)));
+
+ foreach ($sql_queries as $sql_query)
+ {
+ $this->db->sql_query($sql_query);
}
$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
@@ -1059,7 +1149,7 @@ class fulltext_mysql extends \phpbb\search\base
$this->get_stats();
}
- return isset($this->stats['post_subject']) && isset($this->stats['post_content']);
+ return isset($this->stats['post_subject']) && isset($this->stats['post_content']) && isset($this->stats['post_text']);
}
/**
@@ -1103,6 +1193,10 @@ class fulltext_mysql extends \phpbb\search\base
{
$this->stats['post_subject'] = $row;
}
+ else if ($row['Key_name'] == 'post_text')
+ {
+ $this->stats['post_text'] = $row;
+ }
else if ($row['Key_name'] == 'post_content')
{
$this->stats['post_content'] = $row;
diff --git a/phpBB/phpbb/search/fulltext_native.php b/phpBB/phpbb/search/fulltext_native.php
index 73dcfce9a5..c83de75eed 100644
--- a/phpBB/phpbb/search/fulltext_native.php
+++ b/phpBB/phpbb/search/fulltext_native.php
@@ -190,7 +190,7 @@ class fulltext_native extends \phpbb\search\base
*/
public function split_keywords($keywords, $terms)
{
- $tokens = '+-|()*';
+ $tokens = '+-|()* ';
$keywords = trim($this->cleanup($keywords, $tokens));
@@ -224,12 +224,10 @@ class fulltext_native extends \phpbb\search\base
$keywords[$i] = '|';
break;
case '*':
- if ($i === 0 || ($keywords[$i - 1] !== '*' && strcspn($keywords[$i - 1], $tokens) === 0))
+ // $i can never be 0 here since $open_bracket is initialised to false
+ if (strpos($tokens, $keywords[$i - 1]) !== false && ($i + 1 === $n || strpos($tokens, $keywords[$i + 1]) !== false))
{
- if ($i === $n - 1 || ($keywords[$i + 1] !== '*' && strcspn($keywords[$i + 1], $tokens) === 0))
- {
- $keywords = substr($keywords, 0, $i) . substr($keywords, $i + 1);
- }
+ $keywords[$i] = '|';
}
break;
}
@@ -264,7 +262,7 @@ class fulltext_native extends \phpbb\search\base
}
}
- if ($open_bracket)
+ if ($open_bracket !== false)
{
$keywords .= ')';
}
@@ -285,7 +283,7 @@ class fulltext_native extends \phpbb\search\base
);
$keywords = preg_replace($match, $replace, $keywords);
- $num_keywords = sizeof(explode(' ', $keywords));
+ $num_keywords = count(explode(' ', $keywords));
// We limit the number of allowed keywords to minimize load on the database
if ($this->config['max_num_search_keywords'] && $num_keywords > $this->config['max_num_search_keywords'])
@@ -301,12 +299,26 @@ class fulltext_native extends \phpbb\search\base
$words = array();
preg_match_all('#([^\\s+\\-|()]+)(?:$|[\\s+\\-|()])#u', $keywords, $words);
- if (sizeof($words[1]))
+ if (count($words[1]))
{
$keywords = '(' . implode('|', $words[1]) . ')';
}
}
+ // Remove non trailing wildcards from each word to prevent a full table scan (it's now using the database index)
+ $match = '#\*(?!$|\s)#';
+ $replace = '$1';
+ $keywords = preg_replace($match, $replace, $keywords);
+
+ // Only allow one wildcard in the search query to limit the database load
+ $match = '#\*#';
+ $replace = '$1';
+ $count_wildcards = substr_count($keywords, '*');
+
+ // Reverse the string to remove all wildcards except the first one
+ $keywords = strrev(preg_replace($match, $replace, strrev($keywords), $count_wildcards - 1));
+ unset($count_wildcards);
+
// set the search_query which is shown to the user
$this->search_query = $keywords;
@@ -316,7 +328,7 @@ class fulltext_native extends \phpbb\search\base
$common_ids = $words = array();
- if (sizeof($exact_words))
+ if (count($exact_words))
{
$sql = 'SELECT word_id, word_text, word_common
FROM ' . SEARCH_WORDLIST_TABLE . '
@@ -409,8 +421,16 @@ class fulltext_native extends \phpbb\search\base
{
if (strpos($word_part, '*') !== false)
{
- $id_words[] = '\'' . $this->db->sql_escape(str_replace('*', '%', $word_part)) . '\'';
- $non_common_words[] = $word_part;
+ $len = utf8_strlen(str_replace('*', '', $word_part));
+ if ($len >= $this->word_length['min'] && $len <= $this->word_length['max'])
+ {
+ $id_words[] = '\'' . $this->db->sql_escape(str_replace('*', '%', $word_part)) . '\'';
+ $non_common_words[] = $word_part;
+ }
+ else
+ {
+ $this->common_words[] = $word_part;
+ }
}
else if (isset($words[$word_part]))
{
@@ -426,10 +446,10 @@ class fulltext_native extends \phpbb\search\base
}
}
}
- if (sizeof($id_words))
+ if (count($id_words))
{
sort($id_words);
- if (sizeof($id_words) > 1)
+ if (count($id_words) > 1)
{
$this->{$mode . '_ids'}[] = $id_words;
}
@@ -440,7 +460,7 @@ class fulltext_native extends \phpbb\search\base
}
}
// throw an error if we shall not ignore unexistant words
- else if (!$ignore_no_id && sizeof($non_common_words))
+ else if (!$ignore_no_id && count($non_common_words))
{
trigger_error(sprintf($this->user->lang['WORDS_IN_NO_POST'], implode($this->user->lang['COMMA_SEPARATOR'], $non_common_words)));
}
@@ -480,7 +500,7 @@ class fulltext_native extends \phpbb\search\base
}
// Return true if all words are not common words
- if (sizeof($exact_words) - sizeof($this->common_words) > 0)
+ if (count($exact_words) - count($this->common_words) > 0)
{
return true;
}
@@ -716,7 +736,7 @@ class fulltext_native extends \phpbb\search\base
}
}
- if (sizeof($this->must_not_contain_ids))
+ if (count($this->must_not_contain_ids))
{
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(SEARCH_WORDMATCH_TABLE => 'm' . $m_num),
@@ -826,7 +846,7 @@ class fulltext_native extends \phpbb\search\base
$sql_where[] = 'p.topic_id = ' . $topic_id;
}
- if (sizeof($author_ary))
+ if (count($author_ary))
{
if ($author_name)
{
@@ -840,7 +860,7 @@ class fulltext_native extends \phpbb\search\base
$sql_where[] = $sql_author;
}
- if (sizeof($ex_fid_ary))
+ if (count($ex_fid_ary))
{
$sql_where[] = $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true);
}
@@ -1010,7 +1030,7 @@ class fulltext_native extends \phpbb\search\base
public function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $post_visibility, $topic_id, $author_ary, $author_name, &$id_ary, &$start, $per_page)
{
// No author? No posts
- if (!sizeof($author_ary))
+ if (!count($author_ary))
{
return 0;
}
@@ -1082,7 +1102,7 @@ class fulltext_native extends \phpbb\search\base
{
$sql_author = $this->db->sql_in_set('p.poster_id', $author_ary);
}
- $sql_fora = (sizeof($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
+ $sql_fora = (count($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
$sql_time = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
$sql_topic_id = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
$sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
@@ -1289,7 +1309,7 @@ class fulltext_native extends \phpbb\search\base
$this->db->sql_freeresult($result);
}
- if (sizeof($id_ary))
+ if (count($id_ary))
{
$this->save_ids($search_key, '', $author_ary, $total_results, $id_ary, $start, $sort_dir);
$id_ary = array_slice($id_ary, 0, $per_page);
@@ -1433,6 +1453,38 @@ class fulltext_native extends \phpbb\search\base
$words['del']['post'] = array();
$words['del']['title'] = array();
}
+
+ /**
+ * Event to modify method arguments and words before the native search index is updated
+ *
+ * @event core.search_native_index_before
+ * @var string mode Contains the post mode: edit, post, reply, quote
+ * @var int post_id The id of the post which is modified/created
+ * @var string message New or updated post content
+ * @var string subject New or updated post subject
+ * @var int poster_id Post author's user id
+ * @var int forum_id The id of the forum in which the post is located
+ * @var array words Grouped lists of words added to or remove from the index
+ * @var array split_text Array of words from the message
+ * @var array split_title Array of words from the title
+ * @var array cur_words Array of words currently in the index for comparing to new words
+ * when mode is edit. Empty for other modes.
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'mode',
+ 'post_id',
+ 'message',
+ 'subject',
+ 'poster_id',
+ 'forum_id',
+ 'words',
+ 'split_text',
+ 'split_title',
+ 'cur_words',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_native_index_before', compact($vars)));
+
unset($split_text);
unset($split_title);
@@ -1443,7 +1495,7 @@ class fulltext_native extends \phpbb\search\base
// individual arrays of added and removed words for text and title. What
// we need to do now is add the new words (if they don't already exist)
// and then add (or remove) matches between the words and this post
- if (sizeof($unique_add_words))
+ if (count($unique_add_words))
{
$sql = 'SELECT word_id, word_text
FROM ' . SEARCH_WORDLIST_TABLE . '
@@ -1459,7 +1511,7 @@ class fulltext_native extends \phpbb\search\base
$new_words = array_diff($unique_add_words, array_keys($word_ids));
$this->db->sql_transaction('begin');
- if (sizeof($new_words))
+ if (count($new_words))
{
$sql_ary = array();
@@ -1483,7 +1535,7 @@ class fulltext_native extends \phpbb\search\base
{
$title_match = ($word_in == 'title') ? 1 : 0;
- if (sizeof($word_ary))
+ if (count($word_ary))
{
$sql_in = array();
foreach ($word_ary as $word)
@@ -1512,7 +1564,7 @@ class fulltext_native extends \phpbb\search\base
{
$title_match = ($word_in == 'title') ? 1 : 0;
- if (sizeof($word_ary))
+ if (count($word_ary))
{
$sql = 'INSERT INTO ' . SEARCH_WORDMATCH_TABLE . ' (post_id, word_id, title_match)
SELECT ' . (int) $post_id . ', word_id, ' . (int) $title_match . '
@@ -1543,7 +1595,7 @@ class fulltext_native extends \phpbb\search\base
*/
public function index_remove($post_ids, $author_ids, $forum_ids)
{
- if (sizeof($post_ids))
+ if (count($post_ids))
{
$sql = 'SELECT w.word_id, w.word_text, m.title_match
FROM ' . SEARCH_WORDMATCH_TABLE . ' m, ' . SEARCH_WORDLIST_TABLE . ' w
@@ -1566,7 +1618,7 @@ class fulltext_native extends \phpbb\search\base
}
$this->db->sql_freeresult($result);
- if (sizeof($title_word_ids))
+ if (count($title_word_ids))
{
$sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
SET word_count = word_count - 1
@@ -1575,7 +1627,7 @@ class fulltext_native extends \phpbb\search\base
$this->db->sql_query($sql);
}
- if (sizeof($message_word_ids))
+ if (count($message_word_ids))
{
$sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
SET word_count = word_count - 1
@@ -1630,7 +1682,7 @@ class fulltext_native extends \phpbb\search\base
}
$this->db->sql_freeresult($result);
- if (sizeof($sql_in))
+ if (count($sql_in))
{
// Flag the words
$sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
@@ -1650,7 +1702,7 @@ class fulltext_native extends \phpbb\search\base
unset($sql_in);
}
- if (sizeof($destroy_cache_words))
+ if (count($destroy_cache_words))
{
// destroy cached search results containing any of the words that are now common or were removed
$this->destroy_cache(array_unique($destroy_cache_words));
@@ -1664,20 +1716,43 @@ class fulltext_native extends \phpbb\search\base
*/
public function delete_index($acp_module, $u_action)
{
+ $sql_queries = [];
+
switch ($this->db->get_sql_layer())
{
case 'sqlite3':
- $this->db->sql_query('DELETE FROM ' . SEARCH_WORDLIST_TABLE);
- $this->db->sql_query('DELETE FROM ' . SEARCH_WORDMATCH_TABLE);
- $this->db->sql_query('DELETE FROM ' . SEARCH_RESULTS_TABLE);
+ $sql_queries[] = 'DELETE FROM ' . SEARCH_WORDLIST_TABLE;
+ $sql_queries[] = 'DELETE FROM ' . SEARCH_WORDMATCH_TABLE;
+ $sql_queries[] = 'DELETE FROM ' . SEARCH_RESULTS_TABLE;
break;
default:
- $this->db->sql_query('TRUNCATE TABLE ' . SEARCH_WORDLIST_TABLE);
- $this->db->sql_query('TRUNCATE TABLE ' . SEARCH_WORDMATCH_TABLE);
- $this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
+ $sql_queries[] = 'TRUNCATE TABLE ' . SEARCH_WORDLIST_TABLE;
+ $sql_queries[] = 'TRUNCATE TABLE ' . SEARCH_WORDMATCH_TABLE;
+ $sql_queries[] = 'TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE;
break;
}
+
+ $stats = $this->stats;
+
+ /**
+ * Event to modify SQL queries before the native search index is deleted
+ *
+ * @event core.search_native_delete_index_before
+ * @var array sql_queries Array with queries for deleting the search index
+ * @var array stats Array with statistics of the current index (read only)
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'sql_queries',
+ 'stats',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_native_delete_index_before', compact($vars)));
+
+ foreach ($sql_queries as $sql_query)
+ {
+ $this->db->sql_query($sql_query);
+ }
}
/**
@@ -1685,7 +1760,7 @@ class fulltext_native extends \phpbb\search\base
*/
public function index_created()
{
- if (!sizeof($this->stats))
+ if (!count($this->stats))
{
$this->get_stats();
}
@@ -1698,7 +1773,7 @@ class fulltext_native extends \phpbb\search\base
*/
public function index_stats()
{
- if (!sizeof($this->stats))
+ if (!count($this->stats))
{
$this->get_stats();
}
diff --git a/phpBB/phpbb/search/fulltext_postgres.php b/phpBB/phpbb/search/fulltext_postgres.php
index 8dbc7212a1..2f387e791e 100644
--- a/phpBB/phpbb/search/fulltext_postgres.php
+++ b/phpBB/phpbb/search/fulltext_postgres.php
@@ -294,7 +294,7 @@ class fulltext_postgres extends \phpbb\search\base
// remove too short or too long words
$text = array_values($text);
- for ($i = 0, $n = sizeof($text); $i < $n; $i++)
+ for ($i = 0, $n = count($text); $i < $n; $i++)
{
$text[$i] = trim($text[$i]);
if (utf8_strlen($text[$i]) < $this->config['fulltext_postgres_min_word_len'] || utf8_strlen($text[$i]) > $this->config['fulltext_postgres_max_word_len'])
@@ -498,16 +498,16 @@ class fulltext_postgres extends \phpbb\search\base
);
extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_keywords_main_query_before', compact($vars)));
- $sql_select = ($type == 'posts') ? 'p.post_id' : 'DISTINCT t.topic_id';
+ $sql_select = ($type == 'posts') ? 'p.post_id' : 'DISTINCT t.topic_id, ' . $sort_by_sql[$sort_key];
$sql_from = ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
$field = ($type == 'posts') ? 'post_id' : 'topic_id';
- if (sizeof($author_ary) && $author_name)
+ if (count($author_ary) && $author_name)
{
// first one matches post of registered users, second one guests and deleted users
$sql_author = '(' . $this->db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
}
- else if (sizeof($author_ary))
+ else if (count($author_ary))
{
$sql_author = ' AND ' . $this->db->sql_in_set('p.poster_id', $author_ary);
}
@@ -519,7 +519,7 @@ class fulltext_postgres extends \phpbb\search\base
$sql_where_options = $sql_sort_join;
$sql_where_options .= ($topic_id) ? ' AND p.topic_id = ' . $topic_id : '';
$sql_where_options .= ($join_topic) ? ' AND t.topic_id = p.topic_id' : '';
- $sql_where_options .= (sizeof($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
+ $sql_where_options .= (count($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
$sql_where_options .= ' AND ' . $post_visibility;
$sql_where_options .= $sql_author;
$sql_where_options .= ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
@@ -609,7 +609,7 @@ class fulltext_postgres extends \phpbb\search\base
public function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $post_visibility, $topic_id, $author_ary, $author_name, &$id_ary, &$start, $per_page)
{
// No author? No posts
- if (!sizeof($author_ary))
+ if (!count($author_ary))
{
return 0;
}
@@ -686,7 +686,7 @@ class fulltext_postgres extends \phpbb\search\base
{
$sql_author = $this->db->sql_in_set('p.poster_id', $author_ary);
}
- $sql_fora = (sizeof($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
+ $sql_fora = (count($ex_fid_ary)) ? ' AND ' . $this->db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
$sql_topic_id = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
$sql_time = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
$sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
@@ -861,7 +861,7 @@ class fulltext_postgres extends \phpbb\search\base
$id_ary = array_unique($id_ary);
}
- if (sizeof($id_ary))
+ if (count($id_ary))
{
$this->save_ids($search_key, '', $author_ary, $result_count, $id_ary, $start, $sort_dir);
$id_ary = array_slice($id_ary, 0, $per_page);
@@ -889,6 +889,34 @@ class fulltext_postgres extends \phpbb\search\base
$words = array_unique(array_merge($split_text, $split_title));
+ /**
+ * Event to modify method arguments and words before the PostgreSQL search index is updated
+ *
+ * @event core.search_postgres_index_before
+ * @var string mode Contains the post mode: edit, post, reply, quote
+ * @var int post_id The id of the post which is modified/created
+ * @var string message New or updated post content
+ * @var string subject New or updated post subject
+ * @var int poster_id Post author's user id
+ * @var int forum_id The id of the forum in which the post is located
+ * @var array words Array of words added to the index
+ * @var array split_text Array of words from the message
+ * @var array split_title Array of words from the title
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'mode',
+ 'post_id',
+ 'message',
+ 'subject',
+ 'poster_id',
+ 'forum_id',
+ 'words',
+ 'split_text',
+ 'split_title',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_index_before', compact($vars)));
+
unset($split_text);
unset($split_title);
@@ -935,14 +963,37 @@ class fulltext_postgres extends \phpbb\search\base
$this->get_stats();
}
+ $sql_queries = [];
+
if (!isset($this->stats['post_subject']))
{
- $this->db->sql_query("CREATE INDEX " . POSTS_TABLE . "_" . $this->config['fulltext_postgres_ts_name'] . "_post_subject ON " . POSTS_TABLE . " USING gin (to_tsvector ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', post_subject))");
+ $sql_queries[] = "CREATE INDEX " . POSTS_TABLE . "_" . $this->config['fulltext_postgres_ts_name'] . "_post_subject ON " . POSTS_TABLE . " USING gin (to_tsvector ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', post_subject))";
}
if (!isset($this->stats['post_content']))
{
- $this->db->sql_query("CREATE INDEX " . POSTS_TABLE . "_" . $this->config['fulltext_postgres_ts_name'] . "_post_content ON " . POSTS_TABLE . " USING gin (to_tsvector ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', post_text || ' ' || post_subject))");
+ $sql_queries[] = "CREATE INDEX " . POSTS_TABLE . "_" . $this->config['fulltext_postgres_ts_name'] . "_post_content ON " . POSTS_TABLE . " USING gin (to_tsvector ('" . $this->db->sql_escape($this->config['fulltext_postgres_ts_name']) . "', post_text || ' ' || post_subject))";
+ }
+
+ $stats = $this->stats;
+
+ /**
+ * Event to modify SQL queries before the Postgres search index is created
+ *
+ * @event core.search_postgres_create_index_before
+ * @var array sql_queries Array with queries for creating the search index
+ * @var array stats Array with statistics of the current index (read only)
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'sql_queries',
+ 'stats',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_create_index_before', compact($vars)));
+
+ foreach ($sql_queries as $sql_query)
+ {
+ $this->db->sql_query($sql_query);
}
$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
@@ -968,14 +1019,37 @@ class fulltext_postgres extends \phpbb\search\base
$this->get_stats();
}
+ $sql_queries = [];
+
if (isset($this->stats['post_subject']))
{
- $this->db->sql_query('DROP INDEX ' . $this->stats['post_subject']['relname']);
+ $sql_queries[] = 'DROP INDEX ' . $this->stats['post_subject']['relname'];
}
if (isset($this->stats['post_content']))
{
- $this->db->sql_query('DROP INDEX ' . $this->stats['post_content']['relname']);
+ $sql_queries[] = 'DROP INDEX ' . $this->stats['post_content']['relname'];
+ }
+
+ $stats = $this->stats;
+
+ /**
+ * Event to modify SQL queries before the Postgres search index is created
+ *
+ * @event core.search_postgres_delete_index_before
+ * @var array sql_queries Array with queries for deleting the search index
+ * @var array stats Array with statistics of the current index (read only)
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'sql_queries',
+ 'stats',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_postgres_delete_index_before', compact($vars)));
+
+ foreach ($sql_queries as $sql_query)
+ {
+ $this->db->sql_query($sql_query);
}
$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
diff --git a/phpBB/phpbb/search/fulltext_sphinx.php b/phpBB/phpbb/search/fulltext_sphinx.php
index 59c3d55076..2c2eb84dc7 100644
--- a/phpBB/phpbb/search/fulltext_sphinx.php
+++ b/phpBB/phpbb/search/fulltext_sphinx.php
@@ -292,7 +292,6 @@ class fulltext_sphinx
AND p.post_id >= $start AND p.post_id <= $end'),
array('sql_query_post', ''),
array('sql_query_post_index', 'UPDATE ' . SPHINX_TABLE . ' SET max_doc_id = $maxid WHERE counter_id = 1'),
- array('sql_query_info', 'SELECT * FROM ' . POSTS_TABLE . ' WHERE post_id = $id'),
array('sql_attr_uint', 'forum_id'),
array('sql_attr_uint', 'topic_id'),
array('sql_attr_uint', 'poster_id'),
@@ -304,7 +303,7 @@ class fulltext_sphinx
array('sql_attr_string', 'post_subject'),
),
'source source_phpbb_' . $this->id . '_delta : source_phpbb_' . $this->id . '_main' => array(
- array('sql_query_pre', ''),
+ array('sql_query_pre', 'SET NAMES \'utf8\''),
array('sql_query_range', ''),
array('sql_range_step', ''),
array('sql_query', 'SELECT
@@ -324,6 +323,7 @@ class fulltext_sphinx
WHERE
p.topic_id = t.topic_id
AND p.post_id >= ( SELECT max_doc_id FROM ' . SPHINX_TABLE . ' WHERE counter_id=1 )'),
+ array('sql_query_post_index', ''),
),
'index index_phpbb_' . $this->id . '_main' => array(
array('path', $this->config['fulltext_sphinx_data_path'] . 'index_phpbb_' . $this->id . '_main'),
@@ -332,7 +332,6 @@ class fulltext_sphinx
array('morphology', 'none'),
array('stopwords', ''),
array('min_word_len', '2'),
- array('charset_type', 'utf-8'),
array('charset_table', 'U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6, U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101, U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109, U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F, U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, U+0116->U+0117, U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D, U+011D, U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, U+0134->U+0135, U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, U+013C, U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, U+0143->U+0144, U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, U+014B, U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, U+0152->U+0153, U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159, U+0159, U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, U+0160->U+0161, U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, U+0167, U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, U+016E->U+016F, U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175, U+0175, U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, U+017B->U+017C, U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, U+0430..U+044F, U+4E00..U+9FFF'),
array('min_prefix_len', '0'),
array('min_infix_len', '0'),
@@ -345,14 +344,12 @@ class fulltext_sphinx
array('mem_limit', $this->config['fulltext_sphinx_indexer_mem_limit'] . 'M'),
),
'searchd' => array(
- array('compat_sphinxql_magics' , '0'),
array('listen' , ($this->config['fulltext_sphinx_host'] ? $this->config['fulltext_sphinx_host'] : 'localhost') . ':' . ($this->config['fulltext_sphinx_port'] ? $this->config['fulltext_sphinx_port'] : '9312')),
array('log', $this->config['fulltext_sphinx_data_path'] . 'log/searchd.log'),
array('query_log', $this->config['fulltext_sphinx_data_path'] . 'log/sphinx-query.log'),
array('read_timeout', '5'),
array('max_children', '30'),
array('pid_file', $this->config['fulltext_sphinx_data_path'] . 'searchd.pid'),
- array('max_matches', (string) SPHINX_MAX_MATCHES),
array('binlog_path', $this->config['fulltext_sphinx_data_path']),
),
);
@@ -482,7 +479,7 @@ class fulltext_sphinx
global $user, $phpbb_log;
// No keywords? No posts.
- if (!strlen($this->search_query) && !sizeof($author_ary))
+ if (!strlen($this->search_query) && !count($author_ary))
{
return false;
}
@@ -622,7 +619,7 @@ class fulltext_sphinx
break;
}
- if (sizeof($author_ary))
+ if (count($author_ary))
{
$this->sphinx->SetFilter('poster_id', $author_ary);
}
@@ -632,14 +629,14 @@ class fulltext_sphinx
// but at least it will also cause the same for normal users.
$this->sphinx->SetFilter('post_visibility', array(ITEM_APPROVED));
- if (sizeof($ex_fid_ary))
+ if (count($ex_fid_ary))
{
// All forums that a user is allowed to access
$fid_ary = array_unique(array_intersect(array_keys($this->auth->acl_getf('f_read', true)), array_keys($this->auth->acl_getf('f_search', true))));
// All forums that the user wants to and can search in
$search_forums = array_diff($fid_ary, $ex_fid_ary);
- if (sizeof($search_forums))
+ if (count($search_forums))
{
$this->sphinx->SetFilter('forum_id', $search_forums);
}
@@ -647,7 +644,7 @@ class fulltext_sphinx
$this->sphinx->SetFilter('deleted', array(0));
- $this->sphinx->SetLimits($start, (int) $per_page, SPHINX_MAX_MATCHES);
+ $this->sphinx->SetLimits((int) $start, (int) $per_page, SPHINX_MAX_MATCHES);
$result = $this->sphinx->Query($search_query_prefix . $this->sphinx->EscapeString(str_replace('&quot;', '"', $this->search_query)), $this->indexes);
// Could be connection to localhost:9312 failed (errno=111,
@@ -757,6 +754,28 @@ class fulltext_sphinx
*/
public function index($mode, $post_id, &$message, &$subject, $poster_id, $forum_id)
{
+ /**
+ * Event to modify method arguments before the Sphinx search index is updated
+ *
+ * @event core.search_sphinx_index_before
+ * @var string mode Contains the post mode: edit, post, reply, quote
+ * @var int post_id The id of the post which is modified/created
+ * @var string message New or updated post content
+ * @var string subject New or updated post subject
+ * @var int poster_id Post author's user id
+ * @var int forum_id The id of the forum in which the post is located
+ * @since 3.2.3-RC1
+ */
+ $vars = array(
+ 'mode',
+ 'post_id',
+ 'message',
+ 'subject',
+ 'poster_id',
+ 'forum_id',
+ );
+ extract($this->phpbb_dispatcher->trigger_event('core.search_sphinx_index_before', compact($vars)));
+
if ($mode == 'edit')
{
$this->sphinx->UpdateAttributes($this->indexes, array('forum_id', 'poster_id'), array((int) $post_id => array((int) $forum_id, (int) $poster_id)));
@@ -789,7 +808,7 @@ class fulltext_sphinx
}
$this->db->sql_freeresult($result);
- if (sizeof($post_updates))
+ if (count($post_updates))
{
$this->sphinx->UpdateAttributes($this->indexes, array('topic_last_post_time'), $post_updates);
}
diff --git a/phpBB/phpbb/search/sphinx/config.php b/phpBB/phpbb/search/sphinx/config.php
index 675649b460..3205574b45 100644
--- a/phpBB/phpbb/search/sphinx/config.php
+++ b/phpBB/phpbb/search/sphinx/config.php
@@ -46,7 +46,7 @@ class config
*/
function get_section_by_name($name)
{
- for ($i = 0, $size = sizeof($this->sections); $i < $size; $i++)
+ for ($i = 0, $size = count($this->sections); $i < $size; $i++)
{
// Make sure this is really a section object and not a comment
if (($this->sections[$i] instanceof \phpbb\search\sphinx\config_section) && $this->sections[$i]->get_name() == $name)
@@ -67,7 +67,7 @@ class config
function add_section($name)
{
$this->sections[] = new \phpbb\search\sphinx\config_section($name, '');
- return $this->sections[sizeof($this->sections) - 1];
+ return $this->sections[count($this->sections) - 1];
}
/**
diff --git a/phpBB/phpbb/search/sphinx/config_section.php b/phpBB/phpbb/search/sphinx/config_section.php
index 14ab3a752c..2fc8b2da17 100644
--- a/phpBB/phpbb/search/sphinx/config_section.php
+++ b/phpBB/phpbb/search/sphinx/config_section.php
@@ -87,7 +87,7 @@ class config_section
*/
function get_variable_by_name($name)
{
- for ($i = 0, $size = sizeof($this->variables); $i < $size; $i++)
+ for ($i = 0, $size = count($this->variables); $i < $size; $i++)
{
// Make sure this is a variable object and not a comment
if (($this->variables[$i] instanceof \phpbb\search\sphinx\config_variable) && $this->variables[$i]->get_name() == $name)
@@ -106,7 +106,7 @@ class config_section
*/
function delete_variables_by_name($name)
{
- for ($i = 0, $size = sizeof($this->variables); $i < $size; $i++)
+ for ($i = 0, $size = count($this->variables); $i < $size; $i++)
{
// Make sure this is a variable object and not a comment
if (($this->variables[$i] instanceof \phpbb\search\sphinx\config_variable) && $this->variables[$i]->get_name() == $name)
@@ -129,7 +129,7 @@ class config_section
function create_variable($name, $value)
{
$this->variables[] = new \phpbb\search\sphinx\config_variable($name, $value, '');
- return $this->variables[sizeof($this->variables) - 1];
+ return $this->variables[count($this->variables) - 1];
}
/**
diff --git a/phpBB/phpbb/session.php b/phpBB/phpbb/session.php
index 6b5b8f2625..31f32af7c4 100644
--- a/phpBB/phpbb/session.php
+++ b/phpBB/phpbb/session.php
@@ -108,7 +108,7 @@ class session
$root_dirs = array_diff_assoc($root_dirs, $intersection);
$page_dirs = array_diff_assoc($page_dirs, $intersection);
- $page_dir = str_repeat('../', sizeof($root_dirs)) . implode('/', $page_dirs);
+ $page_dir = str_repeat('../', count($root_dirs)) . implode('/', $page_dirs);
if ($page_dir && substr($page_dir, -1, 1) == '/')
{
@@ -127,8 +127,8 @@ class session
// The script path from the webroot to the phpBB root (for example: /phpBB3/)
$script_dirs = explode('/', $script_path);
- array_splice($script_dirs, -sizeof($page_dirs));
- $root_script_path = implode('/', $script_dirs) . (sizeof($root_dirs) ? '/' . implode('/', $root_dirs) : '');
+ array_splice($script_dirs, -count($page_dirs));
+ $root_script_path = implode('/', $script_dirs) . (count($root_dirs) ? '/' . implode('/', $root_dirs) : '');
// We are on the base level (phpBB root == webroot), lets adjust the variables a bit...
if (!$root_script_path)
@@ -584,12 +584,12 @@ class session
$provider = $provider_collection->get_provider();
$this->data = $provider->autologin();
- if ($user_id !== false && sizeof($this->data) && $this->data['user_id'] != $user_id)
+ if ($user_id !== false && isset($this->data['user_id']) && $this->data['user_id'] != $user_id)
{
$this->data = array();
}
- if (sizeof($this->data))
+ if (isset($this->data['user_id']))
{
$this->cookie_data['k'] = '';
$this->cookie_data['u'] = $this->data['user_id'];
@@ -597,7 +597,7 @@ class session
// If we're presented with an autologin key we'll join against it.
// Else if we've been passed a user_id we'll grab data based on that
- if (isset($this->cookie_data['k']) && $this->cookie_data['k'] && $this->cookie_data['u'] && !sizeof($this->data))
+ if (isset($this->cookie_data['k']) && $this->cookie_data['k'] && $this->cookie_data['u'] && empty($this->data))
{
$sql = 'SELECT u.*
FROM ' . USERS_TABLE . ' u, ' . SESSIONS_KEYS_TABLE . ' k
@@ -617,7 +617,7 @@ class session
$db->sql_freeresult($result);
}
- if ($user_id !== false && !sizeof($this->data))
+ if ($user_id !== false && empty($this->data))
{
$this->cookie_data['k'] = '';
$this->cookie_data['u'] = $user_id;
@@ -645,7 +645,7 @@ class session
// User does not exist
// User is inactive
// User is bot
- if (!sizeof($this->data) || !is_array($this->data))
+ if (!is_array($this->data) || !count($this->data))
{
$this->cookie_data['k'] = '';
$this->cookie_data['u'] = ($bot) ? $bot : ANONYMOUS;
@@ -1022,7 +1022,7 @@ class session
}
$db->sql_freeresult($result);
- if (sizeof($del_user_id))
+ if (count($del_user_id))
{
// Delete expired sessions
$sql = 'DELETE FROM ' . SESSIONS_TABLE . '
@@ -1156,7 +1156,7 @@ class session
$where_sql[] = $_sql;
}
- $sql .= (sizeof($where_sql)) ? implode(' AND ', $where_sql) : '';
+ $sql .= (count($where_sql)) ? implode(' AND ', $where_sql) : '';
$result = $db->sql_query($sql, $cache_ttl);
$ban_triggered_by = 'user';
@@ -1299,7 +1299,12 @@ class session
trigger_error($message);
}
- return ($banned && $ban_row['ban_give_reason']) ? $ban_row['ban_give_reason'] : $banned;
+ if (!empty($ban_row))
+ {
+ $ban_row['ban_triggered_by'] = $ban_triggered_by;
+ }
+
+ return ($banned && $ban_row) ? $ban_row : $banned;
}
/**
@@ -1614,13 +1619,15 @@ class session
return;
}
+ // Do not update the session page for ajax requests, so the view online still works as intended
+ $page_changed = $this->update_session_page && $this->data['session_page'] != $this->page['page'] && !$request->is_ajax();
+
// Only update session DB a minute or so after last update or if page changes
- if ($this->time_now - ((isset($this->data['session_time'])) ? $this->data['session_time'] : 0) > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page']))
+ if ($this->time_now - (isset($this->data['session_time']) ? $this->data['session_time'] : 0) > 60 || $page_changed)
{
$sql_ary = array('session_time' => $this->time_now);
- // Do not update the session page for ajax requests, so the view online still works as intended
- if ($this->update_session_page && !$request->is_ajax())
+ if ($page_changed)
{
$sql_ary['session_page'] = substr($this->page['page'], 0, 199);
$sql_ary['session_forum_id'] = $this->page['forum'];
diff --git a/phpBB/phpbb/template/assets_bag.php b/phpBB/phpbb/template/assets_bag.php
index 9013061b96..067b0eb8f1 100644
--- a/phpBB/phpbb/template/assets_bag.php
+++ b/phpBB/phpbb/template/assets_bag.php
@@ -71,7 +71,7 @@ class assets_bag
$output = '';
foreach ($this->stylesheets as $stylesheet)
{
- $output .= "<link href=\"{$stylesheet->get_url()}\" rel=\"stylesheet\" type=\"text/css\" media=\"screen\" />\n";
+ $output .= "<link href=\"{$stylesheet->get_url()}\" rel=\"stylesheet\" media=\"screen\" />\n";
}
return $output;
@@ -87,7 +87,7 @@ class assets_bag
$output = '';
foreach ($this->scripts as $script)
{
- $output .= "<script type=\"text/javascript\" src=\"{$script->get_url()}\"></script>\n";
+ $output .= "<script src=\"{$script->get_url()}\"></script>\n";
}
return $output;
diff --git a/phpBB/phpbb/template/context.php b/phpBB/phpbb/template/context.php
index 392efd5933..202e29ce00 100644
--- a/phpBB/phpbb/template/context.php
+++ b/phpBB/phpbb/template/context.php
@@ -142,7 +142,7 @@ class context
*/
protected function set_num_rows(&$loop_data)
{
- $s_num_rows = sizeof($loop_data);
+ $s_num_rows = count($loop_data);
foreach ($loop_data as &$mod_block)
{
foreach ($mod_block as $sub_block_name => &$sub_block)
@@ -190,70 +190,51 @@ class context
public function assign_block_vars($blockname, array $vararray)
{
$this->num_rows_is_set = false;
- if (strpos($blockname, '.') !== false)
- {
- // Nested block.
- $blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
-
- $str = &$this->tpldata;
- for ($i = 0; $i < $blockcount; $i++)
- {
- $str = &$str[$blocks[$i]];
- $str = &$str[sizeof($str) - 1];
- }
- $s_row_count = isset($str[$blocks[$blockcount]]) ? sizeof($str[$blocks[$blockcount]]) : 0;
- $vararray['S_ROW_COUNT'] = $vararray['S_ROW_NUM'] = $s_row_count;
+ // For nested block, $blockcount > 0, for top-level block, $blockcount == 0
+ $blocks = explode('.', $blockname);
+ $blockcount = count($blocks) - 1;
- // Assign S_FIRST_ROW
- if (!$s_row_count)
- {
- $vararray['S_FIRST_ROW'] = true;
- }
+ $block = &$this->tpldata;
+ for ($i = 0; $i < $blockcount; $i++)
+ {
+ $pos = strpos($blocks[$i], '[');
+ $name = ($pos !== false) ? substr($blocks[$i], 0, $pos) : $blocks[$i];
+ $block = &$block[$name];
+ $block_count = empty($block) ? 0 : count($block) - 1;
+ $index = (!$pos || strpos($blocks[$i], '[]') === $pos) ? $block_count : (min((int) substr($blocks[$i], $pos + 1, -1), $block_count));
+ $block = &$block[$index];
+ }
- // Assign S_BLOCK_NAME
- $vararray['S_BLOCK_NAME'] = $blocks[$blockcount];
+ // $block = &$block[$blocks[$i]]; // Do not traverse the last block as it might be empty
+ $name = $blocks[$i];
- // Now the tricky part, we always assign S_LAST_ROW and remove the entry before
- // This is much more clever than going through the complete template data on display (phew)
- $vararray['S_LAST_ROW'] = true;
- if ($s_row_count > 0)
- {
- unset($str[$blocks[$blockcount]][($s_row_count - 1)]['S_LAST_ROW']);
- }
+ // Assign S_ROW_COUNT and S_ROW_NUM
+ $s_row_count = isset($block[$name]) ? count($block[$name]) : 0;
+ $vararray['S_ROW_COUNT'] = $vararray['S_ROW_NUM'] = $s_row_count;
- // Now we add the block that we're actually assigning to.
- // We're adding a new iteration to this block with the given
- // variable assignments.
- $str[$blocks[$blockcount]][] = $vararray;
- }
- else
+ // Assign S_FIRST_ROW
+ if (!$s_row_count)
{
- // Top-level block.
- $s_row_count = (isset($this->tpldata[$blockname])) ? sizeof($this->tpldata[$blockname]) : 0;
- $vararray['S_ROW_COUNT'] = $vararray['S_ROW_NUM'] = $s_row_count;
-
- // Assign S_FIRST_ROW
- if (!$s_row_count)
- {
- $vararray['S_FIRST_ROW'] = true;
- }
-
- // Assign S_BLOCK_NAME
- $vararray['S_BLOCK_NAME'] = $blockname;
+ $vararray['S_FIRST_ROW'] = true;
+ }
- // We always assign S_LAST_ROW and remove the entry before
- $vararray['S_LAST_ROW'] = true;
- if ($s_row_count > 0)
- {
- unset($this->tpldata[$blockname][($s_row_count - 1)]['S_LAST_ROW']);
- }
+ // Assign S_BLOCK_NAME
+ $vararray['S_BLOCK_NAME'] = $name;
- // Add a new iteration to this block with the variable assignments we were given.
- $this->tpldata[$blockname][] = $vararray;
+ // Now the tricky part, we always assign S_LAST_ROW and remove the entry before
+ // This is much more clever than going through the complete template data on display (phew)
+ $vararray['S_LAST_ROW'] = true;
+ if ($s_row_count > 0)
+ {
+ unset($block[$name][($s_row_count - 1)]['S_LAST_ROW']);
}
+ // Now we add the block that we're actually assigning to.
+ // We're adding a new iteration to this block with the given
+ // variable assignments.
+ $block[$name][] = $vararray;
+
return true;
}
@@ -285,7 +266,7 @@ class context
{
// For nested block, $blockcount > 0, for top-level block, $blockcount == 0
$blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
+ $blockcount = count($blocks) - 1;
$block = $this->tpldata;
for ($i = 0; $i <= $blockcount; $i++)
@@ -294,19 +275,29 @@ class context
{
$name = substr($blocks[$i], 0, $pos);
+ if (empty($block[$name]))
+ {
+ return array();
+ }
+
if (strpos($blocks[$i], '[]') === $pos)
{
- $index = sizeof($block[$name]) - 1;
+ $index = count($block[$name]) - 1;
}
else
{
- $index = min((int) substr($blocks[$i], $pos + 1, -1), sizeof($block[$name]) - 1);
+ $index = min((int) substr($blocks[$i], $pos + 1, -1), count($block[$name]) - 1);
}
}
else
{
$name = $blocks[$i];
- $index = sizeof($block[$name]) - 1;
+ if (empty($block[$name]))
+ {
+ return array();
+ }
+
+ $index = count($block[$name]) - 1;
}
$block = $block[$name];
$block = $block[$index];
@@ -355,39 +346,26 @@ class context
{
// For nested block, $blockcount > 0, for top-level block, $blockcount == 0
$blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
+ $blockcount = count($blocks) - 1;
$block = $this->tpldata;
for ($i = 0; $i < $blockcount; $i++)
{
- if (($pos = strpos($blocks[$i], '[')) !== false)
- {
- $name = substr($blocks[$i], 0, $pos);
+ $pos = strpos($blocks[$i], '[');
+ $name = ($pos !== false) ? substr($blocks[$i], 0, $pos) : $blocks[$i];
- if (strpos($blocks[$i], '[]') === $pos)
- {
- $index = sizeof($block[$name]) - 1;
- }
- else
- {
- $index = min((int) substr($blocks[$i], $pos + 1, -1), sizeof($block[$name]) - 1);
- }
- }
- else
- {
- $name = $blocks[$i];
- $index = sizeof($block[$name]) - 1;
- }
if (!isset($block[$name]))
{
return false;
}
- $block = $block[$name];
- if (!isset($block[$index]))
+
+ $index = (!$pos || strpos($blocks[$i], '[]') === $pos) ? (count($block[$name]) - 1) : (min((int) substr($blocks[$i], $pos + 1, -1), count($block[$name]) - 1));
+
+ if (!isset($block[$name][$index]))
{
return false;
}
- $block = $block[$index];
+ $block = $block[$name][$index];
}
if (!isset($block[$blocks[$i]]))
@@ -397,9 +375,9 @@ class context
$block = $block[$blocks[$i]]; // Traverse the last block
// Change key to zero (change first position) if false and to last position if true
- if ($key === false || $key === true)
+ if (is_bool($key))
{
- return ($key === false) ? 0 : sizeof($block) - 1;
+ return (!$key) ? 0 : count($block) - 1;
}
// Get correct position if array given
@@ -416,7 +394,7 @@ class context
}
}
- return (is_int($key) && ((0 <= $key) && ($key < sizeof($block)))) ? $key : false;
+ return (is_int($key) && ((0 <= $key) && ($key < count($block)))) ? $key : false;
}
/**
@@ -453,7 +431,7 @@ class context
// For nested block, $blockcount > 0, for top-level block, $blockcount == 0
$blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
+ $blockcount = count($blocks) - 1;
$block = &$this->tpldata;
for ($i = 0; $i < $blockcount; $i++)
@@ -464,17 +442,17 @@ class context
if (strpos($blocks[$i], '[]') === $pos)
{
- $index = sizeof($block[$name]) - 1;
+ $index = count($block[$name]) - 1;
}
else
{
- $index = min((int) substr($blocks[$i], $pos + 1, -1), sizeof($block[$name]) - 1);
+ $index = min((int) substr($blocks[$i], $pos + 1, -1), count($block[$name]) - 1);
}
}
else
{
$name = $blocks[$i];
- $index = sizeof($block[$name]) - 1;
+ $index = count($block[$name]) - 1;
}
$block = &$block[$name];
$block = &$block[$index];
@@ -496,7 +474,7 @@ class context
// Change key to zero (change first position) if false and to last position if true
if ($key === false || $key === true)
{
- $key = ($key === false) ? 0 : sizeof($block);
+ $key = ($key === false) ? 0 : count($block);
}
// Get correct position if array given
@@ -526,9 +504,9 @@ class context
if ($mode == 'insert')
{
// Make sure we are not exceeding the last iteration
- if ($key >= sizeof($block))
+ if ($key >= count($block))
{
- $key = sizeof($block);
+ $key = count($block);
unset($block[($key - 1)]['S_LAST_ROW']);
$vararray['S_LAST_ROW'] = true;
}
@@ -543,7 +521,7 @@ class context
$vararray['S_BLOCK_NAME'] = $name;
// Re-position template blocks
- for ($i = sizeof($block); $i > $key; $i--)
+ for ($i = count($block); $i > $key; $i--)
{
$block[$i] = $block[$i-1];
@@ -561,12 +539,12 @@ class context
if ($mode == 'change')
{
// If key is out of bounds, do not change anything
- if ($key > sizeof($block) || $key < 0)
+ if ($key > count($block) || $key < 0)
{
return false;
}
- if ($key == sizeof($block))
+ if ($key == count($block))
{
$key--;
}
@@ -580,26 +558,26 @@ class context
if ($mode == 'delete')
{
// If we are exceeding last iteration, do not delete anything
- if ($key > sizeof($block) || $key < 0)
+ if ($key > count($block) || $key < 0)
{
return false;
}
// If we are positioned at the end, we remove the last element
- if ($key == sizeof($block))
+ if ($key == count($block))
{
$key--;
}
// We are deleting the last element in the block, so remove the block
- if (sizeof($block) === 1)
+ if (count($block) === 1)
{
$block = null; // unset($block); does not work on references
return true;
}
// Re-position template blocks
- for ($i = $key; $i < sizeof($block)-1; $i++)
+ for ($i = $key; $i < count($block)-1; $i++)
{
$block[$i] = $block[$i+1];
$block[$i]['S_ROW_COUNT'] = $block[$i]['S_ROW_NUM'] = $i;
@@ -610,7 +588,7 @@ class context
// Set first and last elements again, in case they were removed
$block[0]['S_FIRST_ROW'] = true;
- $block[sizeof($block)-1]['S_LAST_ROW'] = true;
+ $block[count($block)-1]['S_LAST_ROW'] = true;
return true;
}
@@ -631,13 +609,13 @@ class context
{
// Nested block.
$blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
+ $blockcount = count($blocks) - 1;
$str = &$this->tpldata;
for ($i = 0; $i < $blockcount; $i++)
{
$str = &$str[$blocks[$i]];
- $str = &$str[sizeof($str) - 1];
+ $str = &$str[count($str) - 1];
}
unset($str[$blocks[$blockcount]]);
diff --git a/phpBB/phpbb/template/twig/extension.php b/phpBB/phpbb/template/twig/extension.php
index f0e716d697..f6f8e03ca2 100644
--- a/phpBB/phpbb/template/twig/extension.php
+++ b/phpBB/phpbb/template/twig/extension.php
@@ -146,7 +146,7 @@ class extension extends \Twig_Extension
// of items to grab (length)
// Start must always be the actual starting number for this calculation (not negative)
- $start = ($start < 0) ? sizeof($item) + $start : $start;
+ $start = ($start < 0) ? count($item) + $start : $start;
$end = $end - $start;
}
@@ -172,7 +172,7 @@ class extension extends \Twig_Extension
$context_vars = $this->context->get_root_ref();
- if (isset($context_vars['L_' . $key]))
+ if (is_string($key) && isset($context_vars['L_' . $key]))
{
return $context_vars['L_' . $key];
}
diff --git a/phpBB/phpbb/template/twig/node/includeasset.php b/phpBB/phpbb/template/twig/node/includeasset.php
index 6d50eafc9d..12034b7820 100644
--- a/phpBB/phpbb/template/twig/node/includeasset.php
+++ b/phpBB/phpbb/template/twig/node/includeasset.php
@@ -50,7 +50,12 @@ abstract class includeasset extends \Twig_Node
->write("\$asset->set_path(\$local_file, true);\n")
->outdent()
->write("}\n")
- ->write("\$asset->add_assets_version('{$config['assets_version']}');\n")
+ ->outdent()
+ ->write("}\n")
+ ->write("\n")
+ ->write("if (\$asset->is_relative()) {\n")
+ ->indent()
+ ->write("\$asset->add_assets_version('{$config['assets_version']}');\n")
->outdent()
->write("}\n")
->write("\$this->getEnvironment()->get_assets_bag()->add_{$this->get_setters_name()}(\$asset);")
diff --git a/phpBB/phpbb/textformatter/s9e/bbcode_merger.php b/phpBB/phpbb/textformatter/s9e/bbcode_merger.php
new file mode 100644
index 0000000000..a05ca3c2b8
--- /dev/null
+++ b/phpBB/phpbb/textformatter/s9e/bbcode_merger.php
@@ -0,0 +1,183 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace phpbb\textformatter\s9e;
+
+use phpbb\textformatter\s9e\factory;
+use s9e\TextFormatter\Configurator\Helpers\TemplateHelper;
+use s9e\TextFormatter\Configurator\Items\UnsafeTemplate;
+
+class bbcode_merger
+{
+ /**
+ * @var \s9e\TextFormatter\Configurator $configurator Configurator instance used to inspect BBCodes
+ */
+ protected $configurator;
+
+ /**
+ * @param \phpbb\textformatter\s9e\factory $factory
+ */
+ public function __construct(factory $factory)
+ {
+ $this->configurator = $factory->get_configurator();
+ }
+
+ /**
+ * Merge two BBCode definitions
+ *
+ * All of the arrays contain a "usage" element and a "template" element
+ *
+ * @throws InvalidArgumentException if a definition cannot be interpreted
+ * @throws RuntimeException if something unexpected occurs
+ *
+ * @param array $without BBCode definition without an attribute
+ * @param array $with BBCode definition with an attribute
+ * @return array Merged definition
+ */
+ public function merge_bbcodes(array $without, array $with)
+ {
+ $without = $this->create_bbcode($without);
+ $with = $this->create_bbcode($with);
+
+ // Select the appropriate strategy for merging this BBCode
+ if ($this->is_content_bbcode($without, $with))
+ {
+ $merged = $this->merge_content_bbcode($without, $with);
+ }
+ else
+ {
+ $merged = $this->merge_optional_bbcode($without, $with);
+ }
+
+ $merged['template'] = $this->normalize_template($merged['template']);
+
+ return $merged;
+ }
+
+ /**
+ * Create a custom BBCode for inspection
+ *
+ * @param array $definition Original BBCode definition
+ * @return array Updated definition containing a BBCode object and a Tag
+ */
+ protected function create_bbcode(array $definition)
+ {
+ $bbcode = $this->configurator->BBCodes->addCustom(
+ $definition['usage'],
+ new UnsafeTemplate($definition['template'])
+ );
+
+ $definition['bbcode'] = $bbcode;
+ $definition['tag'] = $this->configurator->tags[$bbcode->tagName];
+
+ return $definition;
+ }
+
+ /**
+ * Indent given template for readability
+ *
+ * @param string $template
+ * @return string
+ */
+ protected function indent_template($template)
+ {
+ $dom = TemplateHelper::loadTemplate($template);
+ $dom->formatOutput = true;
+ $template = TemplateHelper::saveTemplate($dom);
+
+ // Remove the first level of indentation if the template starts with whitespace
+ if (preg_match('(^\\n +)', $template, $m))
+ {
+ $template = str_replace($m[0], "\n", $template);
+ }
+
+ return trim($template);
+ }
+
+ /**
+ * Test whether the two definitions form a "content"-style BBCode
+ *
+ * Such BBCodes include the [URL] BBCode, which uses its text content as
+ * attribute if none is provided
+ *
+ * @param array $without BBCode definition without an attribute
+ * @param array $with BBCode definition with an attribute
+ * @return array Merged definition
+ */
+ protected function is_content_bbcode(array $without, array $with)
+ {
+ // Test whether we find the same non-TEXT token between "]" and "[" in the usage
+ // as between ">" and "<" in the template
+ return (preg_match('(\\]\\s*(\\{(?!TEXT)[^}]+\\})\\s*\\[)', $without['usage'], $m)
+ && preg_match('(>[^<]*?' . preg_quote($m[1]) . '[^>]*?<)s', $without['template']));
+ }
+
+ /**
+ * Merge the two BBCode definitions of a "content"-style BBCode
+ *
+ * @param array $without BBCode definition without an attribute
+ * @param array $with BBCode definition with an attribute
+ * @return array Merged definition
+ */
+ protected function merge_content_bbcode(array $without, array $with)
+ {
+ // Convert [X={X}] into [X={X;useContent}]
+ $usage = preg_replace('(\\})', ';useContent}', $with['usage'], 1);
+
+ // Use the template from the definition that uses an attribute
+ $template = $with['tag']->template;
+
+ return ['usage' => $usage, 'template' => $template];
+ }
+
+ /**
+ * Merge the two BBCode definitions of a BBCode with an optional argument
+ *
+ * Such BBCodes include the [QUOTE] BBCode, which takes an optional argument
+ * but otherwise does not behave differently
+ *
+ * @param array $without BBCode definition without an attribute
+ * @param array $with BBCode definition with an attribute
+ * @return array Merged definition
+ */
+ protected function merge_optional_bbcode(array $without, array $with)
+ {
+ // Convert [X={X}] into [X={X?}]
+ $usage = preg_replace('(\\})', '?}', $with['usage'], 1);
+
+ // Build a template for both versions
+ $template = '<xsl:choose><xsl:when test="@' . $with['bbcode']->defaultAttribute . '">' . $with['tag']->template . '</xsl:when><xsl:otherwise>' . $without['tag']->template . '</xsl:otherwise></xsl:choose>';
+
+ return ['usage' => $usage, 'template' => $template];
+ }
+
+ /**
+ * Normalize a template
+ *
+ * @param string $template
+ * @return string
+ */
+ protected function normalize_template($template)
+ {
+ // Normalize the template to simplify it
+ $template = $this->configurator->templateNormalizer->normalizeTemplate($template);
+
+ // Convert xsl:value-of elements back to {L_} tokens where applicable
+ $template = preg_replace('(<xsl:value-of select="\\$(L_\\w+)"/>)', '{$1}', $template);
+
+ // Beautify the template
+ $template = $this->indent_template($template);
+
+ return $template;
+ }
+}
diff --git a/phpBB/phpbb/textformatter/s9e/factory.php b/phpBB/phpbb/textformatter/s9e/factory.php
index d5ad8283d9..6191b9a315 100644
--- a/phpBB/phpbb/textformatter/s9e/factory.php
+++ b/phpBB/phpbb/textformatter/s9e/factory.php
@@ -78,7 +78,7 @@ class factory implements \phpbb\textformatter\cache_interface
'b' => '[B]{TEXT}[/B]',
'code' => '[CODE lang={IDENTIFIER;optional}]{TEXT}[/CODE]',
'color' => '[COLOR={COLOR}]{TEXT}[/COLOR]',
- 'email' => '[EMAIL={EMAIL;useContent} subject={TEXT;optional;postFilter=rawurlencode} body={TEXT;optional;postFilter=rawurlencode}]{TEXT}[/EMAIL]',
+ 'email' => '[EMAIL={EMAIL;useContent} subject={TEXT1;optional;postFilter=rawurlencode} body={TEXT2;optional;postFilter=rawurlencode}]{TEXT}[/EMAIL]',
'flash' => '[FLASH={NUMBER1},{NUMBER2} width={NUMBER1;postFilter=#flashwidth} height={NUMBER2;postFilter=#flashheight} url={URL;useContent} /]',
'i' => '[I]{TEXT}[/I]',
'img' => '[IMG src={IMAGEURL;useContent}]',
@@ -132,6 +132,11 @@ class factory implements \phpbb\textformatter\cache_interface
protected $dispatcher;
/**
+ * @var \phpbb\log\log_interface
+ */
+ protected $log;
+
+ /**
* Constructor
*
* @param \phpbb\textformatter\data_access $data_access
@@ -139,11 +144,12 @@ class factory implements \phpbb\textformatter\cache_interface
* @param \phpbb\event\dispatcher_interface $dispatcher
* @param \phpbb\config\config $config
* @param \phpbb\textformatter\s9e\link_helper $link_helper
+ * @param \phpbb\log\log_interface $log
* @param string $cache_dir Path to the cache dir
* @param string $cache_key_parser Cache key used for the parser
* @param string $cache_key_renderer Cache key used for the renderer
*/
- public function __construct(\phpbb\textformatter\data_access $data_access, \phpbb\cache\driver\driver_interface $cache, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\config\config $config, \phpbb\textformatter\s9e\link_helper $link_helper, $cache_dir, $cache_key_parser, $cache_key_renderer)
+ public function __construct(\phpbb\textformatter\data_access $data_access, \phpbb\cache\driver\driver_interface $cache, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\config\config $config, \phpbb\textformatter\s9e\link_helper $link_helper, \phpbb\log\log_interface $log, $cache_dir, $cache_key_parser, $cache_key_renderer)
{
$this->link_helper = $link_helper;
$this->cache = $cache;
@@ -153,6 +159,7 @@ class factory implements \phpbb\textformatter\cache_interface
$this->config = $config;
$this->data_access = $data_access;
$this->dispatcher = $dispatcher;
+ $this->log = $log;
}
/**
@@ -266,12 +273,13 @@ class factory implements \phpbb\textformatter\cache_interface
->addParameterByName('logger')
->addParameterByName('max_img_height')
->addParameterByName('max_img_width')
- ->markAsSafeAsURL();
+ ->markAsSafeAsURL()
+ ->setJS('UrlFilter.filter');
// Add default BBCodes
foreach ($this->get_default_bbcodes($configurator) as $bbcode)
{
- $configurator->BBCodes->addCustom($bbcode['usage'], $bbcode['template']);
+ $this->add_bbcode($configurator, $bbcode['usage'], $bbcode['template']);
}
if (isset($configurator->tags['QUOTE']))
{
@@ -298,17 +306,7 @@ class factory implements \phpbb\textformatter\cache_interface
},
$row['bbcode_tpl']
);
-
- try
- {
- $configurator->BBCodes->addCustom($row['bbcode_match'], new UnsafeTemplate($tpl));
- }
- catch (\Exception $e)
- {
- /**
- * @todo log an error?
- */
- }
+ $this->add_bbcode($configurator, $row['bbcode_match'], $tpl);
}
// Load smilies
@@ -355,9 +353,15 @@ class factory implements \phpbb\textformatter\cache_interface
$configurator->registeredVars['max_img_width'] = 0;
// Load the Emoji plugin and modify its tag's template to obey viewsmilies
- $configurator->Emoji->omitImageSize();
- $configurator->Emoji->useSVG();
$tag = $configurator->Emoji->getTag();
+ $tag->template = '<xsl:choose>
+ <xsl:when test="@tseq">
+ <img alt="{.}" class="emoji" draggable="false" src="//twemoji.maxcdn.com/2/svg/{@tseq}.svg"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="{.}" class="emoji" draggable="false" src="https://cdn.jsdelivr.net/gh/s9e/emoji-assets-twemoji@11.2/dist/svgz/{@seq}.svgz"/>
+ </xsl:otherwise>
+ </xsl:choose>';
$tag->template = '<xsl:choose><xsl:when test="$S_VIEWSMILIES">' . str_replace('class="emoji"', 'class="emoji smilies"', $tag->template) . '</xsl:when><xsl:otherwise><xsl:value-of select="."/></xsl:otherwise></xsl:choose>';
/**
@@ -420,6 +424,26 @@ class factory implements \phpbb\textformatter\cache_interface
}
/**
+ * Add a BBCode to given configurator
+ *
+ * @param Configurator $configurator
+ * @param string $usage
+ * @param string $template
+ * @return void
+ */
+ protected function add_bbcode(Configurator $configurator, $usage, $template)
+ {
+ try
+ {
+ $configurator->BBCodes->addCustom($usage, new UnsafeTemplate($template));
+ }
+ catch (\Exception $e)
+ {
+ $this->log->add('critical', null, null, 'LOG_BBCODE_CONFIGURATION_ERROR', false, [$usage, $e->getMessage()]);
+ }
+ }
+
+ /**
* Configure the Autolink / Autoemail plugins used to linkify text
*
* @param \s9e\TextFormatter\Configurator $configurator
diff --git a/phpBB/phpbb/textformatter/s9e/link_helper.php b/phpBB/phpbb/textformatter/s9e/link_helper.php
index 0f44603dec..483794a83e 100644
--- a/phpBB/phpbb/textformatter/s9e/link_helper.php
+++ b/phpBB/phpbb/textformatter/s9e/link_helper.php
@@ -23,14 +23,16 @@ class link_helper
*
* @param \s9e\TextFormatter\Parser\Tag $tag LINK_TEXT tag
* @param \s9e\TextFormatter\Parser $parser Parser
- * @return bool Whether the tag is valid
+ * @return void
*/
public function cleanup_tag(\s9e\TextFormatter\Parser\Tag $tag, \s9e\TextFormatter\Parser $parser)
{
// Invalidate if the content of the tag matches the text attribute
$text = substr($parser->getText(), $tag->getPos(), $tag->getLen());
-
- return ($text !== $tag->getAttribute('text'));
+ if ($text === $tag->getAttribute('text'))
+ {
+ $tag->invalidate();
+ }
}
/**
@@ -40,7 +42,7 @@ class link_helper
*
* @param \s9e\TextFormatter\Parser\Tag $tag URL tag (start tag)
* @param \s9e\TextFormatter\Parser $parser Parser
- * @return bool Always true to indicate that the tag is valid
+ * @return void
*/
public function generate_link_text_tag(\s9e\TextFormatter\Parser\Tag $tag, \s9e\TextFormatter\Parser $parser)
{
@@ -49,7 +51,7 @@ class link_helper
// the [url] BBCode when its content is used for the URL
if (!$tag->getEndTag() || !$this->should_shorten($tag, $parser->getText()))
{
- return true;
+ return;
}
// Capture the text between the start tag and its end tag
@@ -58,10 +60,10 @@ class link_helper
$length = $end - $start;
$text = substr($parser->getText(), $start, $length);
- // Create a tag that consumes the link's text
- $parser->addSelfClosingTag('LINK_TEXT', $start, $length)->setAttribute('text', $text);
-
- return true;
+ // Create a tag that consumes the link's text and make it depends on this tag
+ $link_text_tag = $parser->addSelfClosingTag('LINK_TEXT', $start, $length);
+ $link_text_tag->setAttribute('text', $text);
+ $tag->cascadeInvalidationTo($link_text_tag);
}
/**
@@ -84,7 +86,7 @@ class link_helper
*
* @param \s9e\TextFormatter\Parser\Tag $tag LINK_TEXT tag
* @param string $board_url Forum's root URL (with trailing slash)
- * @return bool Always true to indicate that the tag is valid
+ * @return void
*/
public function truncate_local_url(\s9e\TextFormatter\Parser\Tag $tag, $board_url)
{
@@ -93,15 +95,13 @@ class link_helper
{
$tag->setAttribute('text', substr($text, strlen($board_url)));
}
-
- return true;
}
/**
* Truncate the replacement text set in a LINK_TEXT tag
*
* @param \s9e\TextFormatter\Parser\Tag $tag LINK_TEXT tag
- * @return bool Always true to indicate that the tag is valid
+ * @return void
*/
public function truncate_text(\s9e\TextFormatter\Parser\Tag $tag)
{
@@ -109,10 +109,7 @@ class link_helper
if (utf8_strlen($text) > 55)
{
$text = utf8_substr($text, 0, 39) . ' ... ' . utf8_substr($text, -10);
+ $tag->setAttribute('text', $text);
}
-
- $tag->setAttribute('text', $text);
-
- return true;
}
}
diff --git a/phpBB/phpbb/textformatter/s9e/parser.php b/phpBB/phpbb/textformatter/s9e/parser.php
index 05ddfffa11..3698dca224 100644
--- a/phpBB/phpbb/textformatter/s9e/parser.php
+++ b/phpBB/phpbb/textformatter/s9e/parser.php
@@ -13,7 +13,7 @@
namespace phpbb\textformatter\s9e;
-use s9e\TextFormatter\Parser\BuiltInFilters;
+use s9e\TextFormatter\Parser\AttributeFilters\UrlFilter;
use s9e\TextFormatter\Parser\Logger;
/**
@@ -196,7 +196,7 @@ class parser implements \phpbb\textformatter\parser_interface
public function get_errors()
{
$errors = array();
- foreach ($this->parser->getLogger()->get() as $entry)
+ foreach ($this->parser->getLogger()->getLogs() as $entry)
{
list(, $msg, $context) = $entry;
@@ -365,7 +365,7 @@ class parser implements \phpbb\textformatter\parser_interface
static public function filter_img_url($url, array $url_config, Logger $logger, $max_height, $max_width)
{
// Validate the URL
- $url = BuiltInFilters::filterUrl($url, $url_config, $logger);
+ $url = UrlFilter::filter($url, $url_config, $logger);
if ($url === false)
{
return false;
diff --git a/phpBB/phpbb/textreparser/base.php b/phpBB/phpbb/textreparser/base.php
index 27d7bc1f27..2ee6ea2cb3 100644
--- a/phpBB/phpbb/textreparser/base.php
+++ b/phpBB/phpbb/textreparser/base.php
@@ -153,8 +153,8 @@ abstract class base implements reparser_interface
{
// Look for the closing tag inside of a e element, in an element of the same name, e.g.
// <e>[/url]</e></URL>
- $match = '<e>[/' . $bbcode . ']</e></' . strtoupper($bbcode) . '>';
- if (strpos($record['text'], $match) !== false)
+ $match = '<e>[/' . $bbcode . ']</e></' . $bbcode . '>';
+ if (stripos($record['text'], $match) !== false)
{
return true;
}
diff --git a/phpBB/phpbb/textreparser/plugins/poll_title.php b/phpBB/phpbb/textreparser/plugins/poll_title.php
index 76d30655c9..5ca8bb063b 100644
--- a/phpBB/phpbb/textreparser/plugins/poll_title.php
+++ b/phpBB/phpbb/textreparser/plugins/poll_title.php
@@ -34,7 +34,7 @@ class poll_title extends \phpbb\textreparser\row_based_plugin
$sql = 'SELECT t.topic_id AS id, t.poll_title AS text, p.enable_bbcode, p.enable_smilies, p.enable_magic_url, p.bbcode_uid
FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
WHERE t.topic_id BETWEEN ' . $min_id . ' AND ' . $max_id .'
- AND t.poll_max_options > 0
+ AND t.poll_start > 0
AND p.post_id = t.topic_first_post_id';
return $sql;
diff --git a/phpBB/phpbb/tree/nestedset.php b/phpBB/phpbb/tree/nestedset.php
index 7149513fd9..eadd2b3273 100644
--- a/phpBB/phpbb/tree/nestedset.php
+++ b/phpBB/phpbb/tree/nestedset.php
@@ -533,7 +533,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
$row = $this->db->sql_fetchrow($result);
$this->db->sql_freeresult($result);
- $diff = ' + ' . ($row[$this->column_right_id] - (int) $item[$this->column_left_id] + 1);
+ $diff = ' + ' . ((int) $row[$this->column_right_id] - (int) $item[$this->column_left_id] + 1);
}
$sql = 'UPDATE ' . $this->table_name . '
@@ -706,7 +706,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
{
$acquired_new_lock = $this->acquire_lock();
- $diff = sizeof($subset_items) * 2;
+ $diff = count($subset_items) * 2;
$sql_subset_items = $this->db->sql_in_set($this->column_item_id, $subset_items);
$sql_not_subset_items = $this->db->sql_in_set($this->column_item_id, $subset_items, true);
@@ -746,7 +746,7 @@ abstract class nestedset implements \phpbb\tree\tree_interface
*/
protected function prepare_adding_subset(array $subset_items, array $new_parent)
{
- $diff = sizeof($subset_items) * 2;
+ $diff = count($subset_items) * 2;
$sql_not_subset_items = $this->db->sql_in_set($this->column_item_id, $subset_items, true);
$set_left_id = $this->db->sql_case($this->column_left_id . ' > ' . (int) $new_parent[$this->column_right_id], $this->column_left_id . ' + ' . $diff, $this->column_left_id);
diff --git a/phpBB/phpbb/user.php b/phpBB/phpbb/user.php
index d4097f53ee..7363290e11 100644
--- a/phpBB/phpbb/user.php
+++ b/phpBB/phpbb/user.php
@@ -189,6 +189,9 @@ class user extends \phpbb\session
/**
* Event to load language files and modify user data on every page
*
+ * Note: To load language file with this event, see description
+ * of lang_set_ext variable.
+ *
* @event core.user_setup
* @var array user_data Array with user's data row
* @var string user_lang_name Basename of the user's langauge
@@ -278,24 +281,6 @@ class user extends \phpbb\session
$db->sql_freeresult($result);
}
- // User has wrong style
- if (!$this->style && $style_id == $this->data['user_style'])
- {
- $style_id = $this->data['user_style'] = $config['default_style'];
-
- $sql = 'UPDATE ' . USERS_TABLE . "
- SET user_style = $style_id
- WHERE user_id = {$this->data['user_id']}";
- $db->sql_query($sql);
-
- $sql = 'SELECT *
- FROM ' . STYLES_TABLE . " s
- WHERE s.style_id = $style_id";
- $result = $db->sql_query($sql, 3600);
- $this->style = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- }
-
if (!$this->style)
{
trigger_error('NO_STYLE_DATA', E_USER_ERROR);
@@ -358,7 +343,7 @@ class user extends \phpbb\session
}
// Is board disabled and user not an admin or moderator?
- if ($config['board_disable'] && !defined('IN_LOGIN') && !defined('SKIP_CHECK_DISABLED') && !$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
+ if ($config['board_disable'] && !defined('IN_INSTALL') && !defined('IN_LOGIN') && !defined('SKIP_CHECK_DISABLED') && !$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
{
if ($this->data['is_bot'])
{
diff --git a/phpBB/phpbb/user_loader.php b/phpBB/phpbb/user_loader.php
index cdd28329db..9297450f3e 100644
--- a/phpBB/phpbb/user_loader.php
+++ b/phpBB/phpbb/user_loader.php
@@ -64,8 +64,9 @@ class user_loader
* Load user helper
*
* @param array $user_ids
+ * @param array $ignore_types user types to ignore
*/
- public function load_users(array $user_ids)
+ public function load_users(array $user_ids, array $ignore_types = array())
{
$user_ids[] = ANONYMOUS;
@@ -75,11 +76,12 @@ class user_loader
// Do not load users we already have in $this->users
$user_ids = array_diff($user_ids, array_keys($this->users));
- if (sizeof($user_ids))
+ if (count($user_ids))
{
$sql = 'SELECT *
FROM ' . $this->users_table . '
- WHERE ' . $this->db->sql_in_set('user_id', $user_ids);
+ WHERE ' . $this->db->sql_in_set('user_id', $user_ids) . '
+ AND ' . $this->db->sql_in_set('user_type', $ignore_types, true, true);
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
diff --git a/phpBB/posting.php b/phpBB/posting.php
index 02bf1c1d07..5089448483 100644
--- a/phpBB/posting.php
+++ b/phpBB/posting.php
@@ -33,7 +33,6 @@ $post_id = $request->variable('p', 0);
$topic_id = $request->variable('t', 0);
$forum_id = $request->variable('f', 0);
$draft_id = $request->variable('d', 0);
-$lastclick = $request->variable('lastclick', 0);
$preview = (isset($_POST['preview'])) ? true : false;
$save = (isset($_POST['save'])) ? true : false;
@@ -68,7 +67,6 @@ $current_time = time();
* @var int topic_id ID of the topic
* @var int forum_id ID of the forum
* @var int draft_id ID of the draft
-* @var int lastclick Timestamp of when the form was last loaded
* @var bool submit Whether or not the form has been submitted
* @var bool preview Whether or not the post is being previewed
* @var bool save Whether or not a draft is being saved
@@ -85,13 +83,13 @@ $current_time = time();
* language keys.
* @since 3.1.0-a1
* @changed 3.1.2-RC1 Removed 'delete' var as it does not exist
+* @changed 3.2.4-RC1 Remove unused 'lastclick' var
*/
$vars = array(
'post_id',
'topic_id',
'forum_id',
'draft_id',
- 'lastclick',
'submit',
'preview',
'save',
@@ -224,6 +222,25 @@ if (!$post_data)
trigger_error(($mode == 'post' || $mode == 'bump' || $mode == 'reply') ? 'NO_TOPIC' : 'NO_POST');
}
+/**
+* This event allows you to bypass reply/quote test of an unapproved post.
+*
+* @event core.posting_modify_row_data
+* @var array post_data All post data from database
+* @var string mode What action to take if the form has been submitted
+* post|reply|quote|edit|delete|bump|smilies|popup
+* @var int topic_id ID of the topic
+* @var int forum_id ID of the forum
+* @since 3.2.8-RC1
+*/
+$vars = array(
+ 'post_data',
+ 'mode',
+ 'topic_id',
+ 'forum_id',
+);
+extract($phpbb_dispatcher->trigger_event('core.posting_modify_row_data', compact($vars)));
+
// Not able to reply to unapproved posts/topics
// TODO: add more descriptive language key
if ($auth->acl_get('m_approve', $forum_id) && ((($mode == 'reply' || $mode == 'bump') && $post_data['topic_visibility'] != ITEM_APPROVED) || ($mode == 'quote' && $post_data['post_visibility'] != ITEM_APPROVED)))
@@ -354,7 +371,6 @@ switch ($mode)
* @var int topic_id ID of the topic
* @var int forum_id ID of the forum
* @var int draft_id ID of the draft
-* @var int lastclick Timestamp of when the form was last loaded
* @var bool submit Whether or not the form has been submitted
* @var bool preview Whether or not the post is being previewed
* @var bool save Whether or not a draft is being saved
@@ -370,13 +386,13 @@ switch ($mode)
* @var array post_data All post data from database
* @since 3.1.3-RC1
* @changed 3.1.10-RC1 Added post_data
+* @changed 3.2.4-RC1 Remove unused 'lastclick' var
*/
$vars = array(
'post_id',
'topic_id',
'forum_id',
'draft_id',
- 'lastclick',
'submit',
'preview',
'save',
@@ -581,7 +597,7 @@ if ($mode == 'edit')
);
}
-$orig_poll_options_size = sizeof($post_data['poll_options']);
+$orig_poll_options_size = count($post_data['poll_options']);
$message_parser = new parse_message();
/* @var $plupload \phpbb\plupload\plupload */
@@ -600,6 +616,20 @@ if (isset($post_data['post_text']))
// Set some default variables
$uninit = array('post_attachment' => 0, 'poster_id' => $user->data['user_id'], 'enable_magic_url' => 0, 'topic_status' => 0, 'topic_type' => POST_NORMAL, 'post_subject' => '', 'topic_title' => '', 'post_time' => 0, 'post_edit_reason' => '', 'notify_set' => 0);
+/**
+* This event allows you to modify the default variables for post_data, and unset them in post_data if needed
+*
+* @event core.posting_modify_default_variables
+* @var array post_data Array with post data
+* @var array uninit Array with default vars to put into post_data, if they aren't there
+* @since 3.2.5-RC1
+*/
+$vars = array(
+ 'post_data',
+ 'uninit',
+);
+extract($phpbb_dispatcher->trigger_event('core.posting_modify_default_variables', compact($vars)));
+
foreach ($uninit as $var_name => $default_value)
{
if (!isset($post_data[$var_name]))
@@ -835,6 +865,7 @@ if ($load && ($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_
load_drafts($topic_id, $forum_id);
}
+/** @var \phpbb\textformatter\utils_interface $bbcode_utils */
$bbcode_utils = $phpbb_container->get('text_formatter.utils');
if ($submit || $preview || $refresh)
@@ -884,7 +915,7 @@ if ($submit || $preview || $refresh)
}
// Delete Poll
- if ($poll_delete && $mode == 'edit' && sizeof($post_data['poll_options']) &&
+ if ($poll_delete && $mode == 'edit' && count($post_data['poll_options']) &&
((!$post_data['poll_last_vote'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id)) || $auth->acl_get('m_delete', $forum_id)))
{
if ($submit && check_form_key('posting'))
@@ -1034,7 +1065,7 @@ if ($submit || $preview || $refresh)
// Parse message
if ($update_message)
{
- if (sizeof($message_parser->warn_msg))
+ if (count($message_parser->warn_msg))
{
$error[] = implode('<br />', $message_parser->warn_msg);
$message_parser->warn_msg = array();
@@ -1046,7 +1077,7 @@ if ($submit || $preview || $refresh)
}
// On a refresh we do not care about message parsing errors
- if (sizeof($message_parser->warn_msg) && $refresh && !$preview)
+ if (count($message_parser->warn_msg) && $refresh && !$preview)
{
$message_parser->warn_msg = array();
}
@@ -1268,7 +1299,7 @@ if ($submit || $preview || $refresh)
}
}
- if (sizeof($message_parser->warn_msg))
+ if (count($message_parser->warn_msg))
{
$error[] = implode('<br />', $message_parser->warn_msg);
}
@@ -1313,7 +1344,7 @@ if ($submit || $preview || $refresh)
extract($phpbb_dispatcher->trigger_event('core.posting_modify_submission_errors', compact($vars)));
// Store message, sync counters
- if (!sizeof($error) && $submit)
+ if (!count($error) && $submit)
{
if ($submit)
{
@@ -1510,7 +1541,7 @@ if ($submit || $preview || $refresh)
}
// Preview
-if (!sizeof($error) && $preview)
+if (!count($error) && $preview)
{
$post_data['post_time'] = ($mode == 'edit') ? $post_data['post_time'] : $current_time;
@@ -1552,7 +1583,7 @@ if (!sizeof($error) && $preview)
}
$template->assign_vars(array(
- 'S_HAS_POLL_OPTIONS' => (sizeof($post_data['poll_options'])),
+ 'S_HAS_POLL_OPTIONS' => (count($post_data['poll_options'])),
'S_IS_MULTI_CHOICE' => ($post_data['poll_max_options'] > 1) ? true : false,
'POLL_QUESTION' => $parse_poll->message,
@@ -1581,7 +1612,7 @@ if (!sizeof($error) && $preview)
}
// Attachment Preview
- if (sizeof($message_parser->attachment_data))
+ if (count($message_parser->attachment_data))
{
$template->assign_var('S_HAS_ATTACHMENTS', true);
@@ -1599,7 +1630,7 @@ if (!sizeof($error) && $preview)
unset($attachment_data);
}
- if (!sizeof($error))
+ if (!count($error))
{
$template->assign_vars(array(
'PREVIEW_SUBJECT' => $preview_subject,
@@ -1622,7 +1653,7 @@ if ($generate_quote && $config['max_quote_depth'] > 0)
}
// Decode text for message display
-$post_data['bbcode_uid'] = ($mode == 'quote' && !$preview && !$refresh && !sizeof($error)) ? $post_data['bbcode_uid'] : $message_parser->bbcode_uid;
+$post_data['bbcode_uid'] = ($mode == 'quote' && !$preview && !$refresh && !count($error)) ? $post_data['bbcode_uid'] : $message_parser->bbcode_uid;
$message_parser->decode_message($post_data['bbcode_uid']);
if ($generate_quote)
@@ -1630,47 +1661,56 @@ if ($generate_quote)
// Remove attachment bbcode tags from the quoted message to avoid mixing with the new post attachments if any
$message_parser->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#uis', '\\2', $message_parser->message);
- if ($config['allow_bbcode'])
- {
- $message_parser->message = $bbcode_utils->generate_quote(
- censor_text($message_parser->message),
- array(
- 'author' => $post_data['quote_username'],
- 'post_id' => $post_data['post_id'],
- 'time' => $post_data['post_time'],
- 'user_id' => $post_data['poster_id'],
- )
- );
- $message_parser->message .= "\n\n";
- }
- else
- {
- $offset = 0;
- $quote_string = "&gt; ";
- $message = censor_text(trim($message_parser->message));
- // see if we are nesting. It's easily tricked but should work for one level of nesting
- if (strpos($message, "&gt;") !== false)
- {
- $offset = 10;
- }
- $message = utf8_wordwrap($message, 75 + $offset, "\n");
+ $quote_attributes = array(
+ 'author' => $post_data['quote_username'],
+ 'post_id' => $post_data['post_id'],
+ 'time' => $post_data['post_time'],
+ 'user_id' => $post_data['poster_id'],
+ );
- $message = $quote_string . $message;
- $message = str_replace("\n", "\n" . $quote_string, $message);
- $message_parser->message = $post_data['quote_username'] . " " . $user->lang['WROTE'] . ":\n" . $message . "\n";
- }
+ /**
+ * This event allows you to modify the quote attributes of the post being quoted
+ *
+ * @event core.posting_modify_quote_attributes
+ * @var array quote_attributes Array with quote attributes
+ * @var array post_data Array with post data
+ * @since 3.2.6-RC1
+ */
+ $vars = array(
+ 'quote_attributes',
+ 'post_data',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.posting_modify_quote_attributes', compact($vars)));
+
+ /** @var \phpbb\language\language $language */
+ $language = $phpbb_container->get('language');
+ phpbb_format_quote($language, $message_parser, $bbcode_utils, $bbcode_status, $quote_attributes);
}
if (($mode == 'reply' || $mode == 'quote') && !$submit && !$preview && !$refresh)
{
$post_data['post_subject'] = ((strpos($post_data['post_subject'], 'Re: ') !== 0) ? 'Re: ' : '') . censor_text($post_data['post_subject']);
+
+ $post_subject = $post_data['post_subject'];
+
+ /**
+ * This event allows you to modify the post subject of the post being quoted
+ *
+ * @event core.posting_modify_post_subject
+ * @var string post_subject String with the post subject already censored.
+ * @since 3.2.8-RC1
+ */
+ $vars = array('post_subject');
+ extract($phpbb_dispatcher->trigger_event('core.posting_modify_post_subject', compact($vars)));
+
+ $post_data['post_subject'] = $post_subject;
}
$attachment_data = $message_parser->attachment_data;
$filename_data = $message_parser->filename_data;
$post_data['post_text'] = $message_parser->message;
-if (sizeof($post_data['poll_options']) || (isset($post_data['poll_title']) && !$bbcode_utils->is_empty($post_data['poll_title'])))
+if (count($post_data['poll_options']) || (isset($post_data['poll_title']) && !$bbcode_utils->is_empty($post_data['poll_title'])))
{
$message_parser->message = $post_data['poll_title'];
$message_parser->bbcode_uid = $post_data['bbcode_uid'];
@@ -1762,7 +1802,6 @@ if ($config['enable_post_confirm'] && !$user->data['is_registered'] && (isset($c
}
$s_hidden_fields = ($mode == 'reply' || $mode == 'quote') ? '<input type="hidden" name="topic_cur_post_id" value="' . $post_data['topic_last_post_id'] . '" />' : '';
-$s_hidden_fields .= '<input type="hidden" name="lastclick" value="' . $current_time . '" />';
$s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . $request->variable('draft_loaded', $draft_id) . '" />' : '';
if ($mode == 'edit')
@@ -1795,7 +1834,7 @@ $page_data = array(
'FORUM_NAME' => $post_data['forum_name'],
'FORUM_DESC' => ($post_data['forum_desc']) ? generate_text_for_display($post_data['forum_desc'], $post_data['forum_desc_uid'], $post_data['forum_desc_bitfield'], $post_data['forum_desc_options']) : '',
'TOPIC_TITLE' => censor_text($post_data['topic_title']),
- 'MODERATORS' => (sizeof($moderators)) ? implode($user->lang['COMMA_SEPARATOR'], $moderators[$forum_id]) : '',
+ 'MODERATORS' => (count($moderators)) ? implode($user->lang['COMMA_SEPARATOR'], $moderators[$forum_id]) : '',
'USERNAME' => ((!$preview && $mode != 'quote') || $preview) ? $post_data['username'] : '',
'SUBJECT' => $post_data['post_subject'],
'MESSAGE' => $post_data['post_text'],
@@ -1807,7 +1846,7 @@ $page_data = array(
'MAX_FONT_SIZE' => (int) $config['max_post_font_size'],
'MINI_POST_IMG' => $user->img('icon_post_target', $user->lang['POST']),
'POST_DATE' => ($post_data['post_time']) ? $user->format_date($post_data['post_time']) : '',
- 'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
+ 'ERROR' => (count($error)) ? implode('<br />', $error) : '',
'TOPIC_TIME_LIMIT' => (int) $post_data['topic_time_limit'],
'EDIT_REASON' => $request->variable('edit_reason', '', true),
'SHOW_PANEL' => $request->variable('show_panel', ''),
@@ -1867,7 +1906,7 @@ if (($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_
$page_data = array_merge($page_data, array(
'S_SHOW_POLL_BOX' => true,
'S_POLL_VOTE_CHANGE' => ($auth->acl_get('f_votechg', $forum_id) && $auth->acl_get('f_vote', $forum_id)),
- 'S_POLL_DELETE' => ($mode == 'edit' && sizeof($post_data['poll_options']) && ((!$post_data['poll_last_vote'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id)) || $auth->acl_get('m_delete', $forum_id))),
+ 'S_POLL_DELETE' => ($mode == 'edit' && count($post_data['poll_options']) && ((!$post_data['poll_last_vote'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id)) || $auth->acl_get('m_delete', $forum_id))),
'S_POLL_DELETE_CHECKED' => (!empty($poll_delete)) ? true : false,
'L_POLL_OPTIONS_EXPLAIN' => $user->lang('POLL_OPTIONS_' . (($mode == 'edit') ? 'EDIT_' : '') . 'EXPLAIN', (int) $config['max_poll_options']),
diff --git a/phpBB/search.php b/phpBB/search.php
index f3988d7d04..791e5cc448 100644
--- a/phpBB/search.php
+++ b/phpBB/search.php
@@ -198,7 +198,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$sql_author_match = (strpos($author, '*') !== false) ? ' ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($author))) : " = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
}
- if (!sizeof($author_id_ary))
+ if (!count($author_id_ary))
{
trigger_error('NO_SEARCH_RESULTS');
}
@@ -220,7 +220,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
}
// Which forums should not be searched? Author searches are also carried out in unindexed forums
- if (empty($keywords) && sizeof($author_id_ary))
+ if (empty($keywords) && count($author_id_ary))
{
$ex_fid_ary = array_keys($auth->acl_getf('!f_read', true));
}
@@ -229,7 +229,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$ex_fid_ary = array_unique(array_merge(array_keys($auth->acl_getf('!f_read', true)), array_keys($auth->acl_getf('!f_search', true))));
}
- $not_in_fid = (sizeof($ex_fid_ary)) ? 'WHERE ' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . " OR (f.forum_password <> '' AND fa.user_id <> " . (int) $user->data['user_id'] . ')' : "";
+ $not_in_fid = (count($ex_fid_ary)) ? 'WHERE ' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . " OR (f.forum_password <> '' AND fa.user_id <> " . (int) $user->data['user_id'] . ')' : "";
$sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.right_id, f.forum_password, f.forum_flags, fa.user_id
FROM ' . FORUMS_TABLE . ' f
@@ -256,7 +256,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
continue;
}
- if (sizeof($search_forum))
+ if (count($search_forum))
{
if ($search_child)
{
@@ -309,9 +309,9 @@ if ($keywords || $author || $author_id || $search_id || $submit)
{
$correct_query = $search->split_keywords($keywords, $search_terms);
$common_words = $search->get_common_words();
- if (!$correct_query || (!$search->get_search_query() && !sizeof($author_id_ary) && !$search_id))
+ if (!$correct_query || (!$search->get_search_query() && !count($author_id_ary) && !$search_id))
{
- $ignored = (sizeof($common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $common_words)) . '<br />' : '';
+ $ignored = (count($common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $common_words)) . '<br />' : '';
$word_length = $search->get_word_length();
if ($word_length)
{
@@ -324,7 +324,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
}
}
- if (!$keywords && sizeof($author_id_ary))
+ if (!$keywords && count($author_id_ary))
{
// if it is an author search we want to show topics by default
$show_results = ($topic_id) ? 'posts' : $request->variable('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
@@ -384,7 +384,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
WHERE t.topic_moved_id = 0
$last_post_time_sql
AND " . $m_approve_topics_fid_sql . '
- ' . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . '
+ ' . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . '
ORDER BY t.topic_last_post_time DESC';
$field = 'topic_id';
break;
@@ -422,7 +422,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
AND p.topic_id = t.topic_id
$last_post_time
AND $m_approve_posts_fid_sql
- " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
+ " . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
$sql_sort";
$field = 'post_id';
}
@@ -435,7 +435,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
AND p.topic_id = t.topic_id
$last_post_time
AND $m_approve_topics_fid_sql
- " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
+ " . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
$sql_sort";
$field = 'topic_id';
}
@@ -451,7 +451,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$sql_where = 'AND t.topic_moved_id = 0
AND ' . $m_approve_topics_fid_sql . '
- ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '');
+ ' . ((count($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '');
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
$s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
@@ -477,7 +477,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
FROM ' . POSTS_TABLE . ' p
WHERE p.post_time > ' . $user->data['user_lastvisit'] . '
AND ' . $m_approve_posts_fid_sql . '
- ' . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
+ ' . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
$sql_sort";
$field = 'post_id';
}
@@ -488,7 +488,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . '
AND t.topic_moved_id = 0
AND ' . $m_approve_topics_fid_sql . '
- ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . "
+ ' . ((count($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . "
$sql_sort";
/*
[Fix] queued replies missing from "view new posts" (Bug #42705 - Patch by Paul)
@@ -562,7 +562,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$search_id = '';
}
- $total_match_count = sizeof($id_ary);
+ $total_match_count = count($id_ary);
if ($total_match_count)
{
// Limit the number to $total_matches_limit for pre-made searches
@@ -592,7 +592,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
{
$total_match_count = $search->keyword_search($show_results, $search_fields, $search_terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_posts_fid_sql, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);
}
- else if (sizeof($author_id_ary))
+ else if (count($author_id_ary))
{
$firstpost_only = ($search_fields === 'firstpost' || $search_fields == 'titleonly') ? true : false;
$total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_posts_fid_sql, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);
@@ -642,10 +642,10 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$sql_where = '';
- if (sizeof($id_ary))
+ if (count($id_ary))
{
$sql_where .= $db->sql_in_set(($show_results == 'posts') ? 'p.post_id' : 't.topic_id', $id_ary);
- $sql_where .= (sizeof($ex_fid_ary)) ? ' AND (' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . ' OR f.forum_id IS NULL)' : '';
+ $sql_where .= (count($ex_fid_ary)) ? ' AND (' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . ' OR f.forum_id IS NULL)' : '';
$sql_where .= ' AND ' . (($show_results == 'posts') ? $m_approve_posts_fid_sql : $m_approve_topics_fid_sql);
}
@@ -883,7 +883,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
$db->sql_freeresult($result);
// If we have some shadow topics, update the rowset to reflect their topic information
- if (sizeof($shadow_topic_list))
+ if (count($shadow_topic_list))
{
$sql = 'SELECT *
FROM ' . TOPICS_TABLE . '
@@ -932,6 +932,26 @@ if ($keywords || $author || $author_id || $search_id || $submit)
while ($row = $db->sql_fetchrow($result))
{
+ /**
+ * Modify the row of a post result before the post_text is trimmed
+ *
+ * @event core.search_modify_post_row
+ * @var string hilit String to highlight
+ * @var array row Array with the post data
+ * @var string u_hilit Highlight string to be injected into URL
+ * @var string view Search results view mode
+ * @var array zebra Array with zebra data for the current user
+ * @since 3.2.2-RC1
+ */
+ $vars = array(
+ 'hilit',
+ 'row',
+ 'u_hilit',
+ 'view',
+ 'zebra',
+ );
+ extract($phpbb_dispatcher->trigger_event('core.search_modify_post_row', compact($vars)));
+
// We pre-process some variables here for later usage
$row['post_text'] = censor_text($row['post_text']);
@@ -967,7 +987,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
unset($text_only_message);
// Pull attachment data
- if (sizeof($attach_list))
+ if (count($attach_list))
{
$use_attach_list = $attach_list;
$attach_list = array();
@@ -981,7 +1001,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
}
}
- if (sizeof($attach_list))
+ if (count($attach_list))
{
$sql = 'SELECT *
FROM ' . ATTACHMENTS_TABLE . '
diff --git a/phpBB/styles/prosilver/style.cfg b/phpBB/styles/prosilver/style.cfg
index 2deceef788..8e3ba24aaa 100644
--- a/phpBB/styles/prosilver/style.cfg
+++ b/phpBB/styles/prosilver/style.cfg
@@ -21,11 +21,11 @@
# General Information about this style
name = prosilver
copyright = © phpBB Limited, 2007
-style_version = 3.2.1
-phpbb_version = 3.2.1
+style_version = 3.2.8
+phpbb_version = 3.2.8
# Defining a different template bitfield
-# template_bitfield = lNg=
+# template_bitfield = //g=
# Parent style
# Set value to empty or to this style's name if this style does not have a parent style
diff --git a/phpBB/styles/prosilver/template/ajax.js b/phpBB/styles/prosilver/template/ajax.js
index 6903ad2261..5e66e5cda1 100644
--- a/phpBB/styles/prosilver/template/ajax.js
+++ b/phpBB/styles/prosilver/template/ajax.js
@@ -199,7 +199,7 @@ phpbb.addAjaxCallback('zebra', function(res) {
*/
phpbb.addAjaxCallback('vote_poll', function(res) {
if (typeof res.success !== 'undefined') {
- var poll = $('.topic_poll');
+ var poll = $(this).closest('.topic_poll');
var panel = poll.find('.panel');
var resultsVisible = poll.find('dl:first-child .resultbar').is(':visible');
var mostVotes = 0;
diff --git a/phpBB/styles/prosilver/template/attachment.html b/phpBB/styles/prosilver/template/attachment.html
index 0978d9189e..615717e026 100644
--- a/phpBB/styles/prosilver/template/attachment.html
+++ b/phpBB/styles/prosilver/template/attachment.html
@@ -8,14 +8,14 @@
<!-- IF _file.S_THUMBNAIL -->
<dl class="thumbnail">
- <dt><a href="{_file.U_DOWNLOAD_LINK}"><img src="{_file.THUMB_IMAGE}" class="postimage" alt="{_file.DOWNLOAD_NAME}" title="{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}" /></a></dt>
+ <dt><a href="{_file.U_DOWNLOAD_LINK}"><img src="{_file.THUMB_IMAGE}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" title="{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}" /></a></dt>
<!-- IF _file.COMMENT --><dd> {_file.COMMENT}</dd><!-- ENDIF -->
</dl>
<!-- ENDIF -->
<!-- IF _file.S_IMAGE -->
<dl class="file">
- <dt class="attach-image"><img src="{_file.U_INLINE_LINK}" class="postimage" alt="{_file.DOWNLOAD_NAME}" onclick="viewableArea(this);" /></dt>
+ <dt class="attach-image"><img src="{_file.U_INLINE_LINK}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" onclick="viewableArea(this);" /></dt>
<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
<dd>{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
</dl>
diff --git a/phpBB/styles/prosilver/template/confirm_delete_body.html b/phpBB/styles/prosilver/template/confirm_delete_body.html
index 98974963c0..637830a5bc 100644
--- a/phpBB/styles/prosilver/template/confirm_delete_body.html
+++ b/phpBB/styles/prosilver/template/confirm_delete_body.html
@@ -49,6 +49,8 @@
</dl>
<!-- ENDIF -->
+ {% EVENT confirm_delete_body_delete_reason_before %}
+
<dl>
<dt><label for="delete_reason">{L_DELETE_REASON}{L_COLON}</label><br /><span>{L_DELETE_REASON_EXPLAIN}</span></dt>
<dd><input type="text" name="delete_reason" id="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" /></dd>
diff --git a/phpBB/styles/prosilver/template/forum_fn.js b/phpBB/styles/prosilver/template/forum_fn.js
index 3f59709ac6..3f28f8a326 100644
--- a/phpBB/styles/prosilver/template/forum_fn.js
+++ b/phpBB/styles/prosilver/template/forum_fn.js
@@ -273,11 +273,9 @@ function insertUser(formId, value) {
function insert_marked_users(formId, users) {
'use strict';
- for (var i = 0; i < users.length; i++) {
- if (users[i].checked) {
- insertUser(formId, users[i].value);
- }
- }
+ $(users).filter(':checked').each(function() {
+ insertUser(formId, this.value);
+ });
window.close();
}
@@ -612,7 +610,7 @@ function parseDocument($container) {
// If there are any images in the links list, run the check again after they have loaded
$linksAll.find('img').each(function() {
- $(this).load(function() {
+ $(this).on('load', function() {
check();
});
});
diff --git a/phpBB/styles/prosilver/template/forumlist_body.html b/phpBB/styles/prosilver/template/forumlist_body.html
index c1a1445483..4932860f8c 100644
--- a/phpBB/styles/prosilver/template/forumlist_body.html
+++ b/phpBB/styles/prosilver/template/forumlist_body.html
@@ -42,7 +42,11 @@
</a>
-->
<!-- ENDIF -->
- <!-- IF forumrow.FORUM_IMAGE --><span class="forum-image">{forumrow.FORUM_IMAGE}</span><!-- ENDIF -->
+ <!-- IF forumrow.FORUM_IMAGE -->
+ <!-- EVENT forumlist_body_forum_image_before -->
+ <span class="forum-image"><!-- EVENT forumlist_body_forum_image_prepend -->{forumrow.FORUM_IMAGE}<!-- EVENT forumlist_body_forum_image_append --></span>
+ <!-- EVENT forumlist_body_forum_image_after -->
+ <!-- ENDIF -->
<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a>
<!-- IF forumrow.FORUM_DESC --><br />{forumrow.FORUM_DESC}<!-- ENDIF -->
<!-- IF forumrow.MODERATORS -->
@@ -91,7 +95,7 @@
<!-- EVENT forumlist_body_last_post_title_prepend -->
<a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_SUBJECT}" class="lastsubject">{forumrow.LAST_POST_SUBJECT_TRUNCATED}</a> <br />
<!-- ENDIF -->
- {L_POST_BY_AUTHOR} {forumrow.LAST_POSTER_FULL}
+ {L_POST_BY_AUTHOR} <!-- EVENT forumlist_body_last_poster_username_prepend -->{forumrow.LAST_POSTER_FULL}<!-- EVENT forumlist_body_last_poster_username_append -->
<!-- IF not S_IS_BOT -->
<a href="{forumrow.U_LAST_POST}" title="{L_VIEW_LATEST_POST}">
<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{L_VIEW_LATEST_POST}</span>
@@ -99,7 +103,11 @@
<!-- ENDIF -->
<br /><time datetime="{forumrow.LAST_POST_TIME_RFC3339}">{forumrow.LAST_POST_TIME}</time>
<!-- ELSE -->
- {L_NO_POSTS}<br />&nbsp;
+ {% if forumrow.U_UNAPPROVED_TOPICS %}
+ {{ lang('TOPIC_UNAPPROVED_FORUM', forumrow.TOPICS) }}
+ {% else %}
+ {{ lang('NO_POSTS') }}
+ {% endif %}
<!-- ENDIF -->
</span>
</dd>
diff --git a/phpBB/styles/prosilver/template/index_body.html b/phpBB/styles/prosilver/template/index_body.html
index b292c40eb2..239a91c580 100644
--- a/phpBB/styles/prosilver/template/index_body.html
+++ b/phpBB/styles/prosilver/template/index_body.html
@@ -29,6 +29,7 @@
<!-- ENDIF -->
<input type="submit" tabindex="5" name="login" value="{L_LOGIN}" class="button2" />
{S_LOGIN_REDIRECT}
+ {S_FORM_TOKEN_LOGIN}
</fieldset>
</form>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/login_body.html b/phpBB/styles/prosilver/template/login_body.html
index ef08035717..dc597af51d 100644
--- a/phpBB/styles/prosilver/template/login_body.html
+++ b/phpBB/styles/prosilver/template/login_body.html
@@ -33,6 +33,7 @@
<!-- ENDIF -->
{S_LOGIN_REDIRECT}
+ {S_FORM_TOKEN_LOGIN}
<dl>
<dt>&nbsp;</dt>
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" tabindex="6" value="{L_LOGIN}" class="button1" /></dd>
diff --git a/phpBB/styles/prosilver/template/login_body_oauth.html b/phpBB/styles/prosilver/template/login_body_oauth.html
index 156485d211..1364d01ccb 100644
--- a/phpBB/styles/prosilver/template/login_body_oauth.html
+++ b/phpBB/styles/prosilver/template/login_body_oauth.html
@@ -1,8 +1,6 @@
+<br>
<div class="content">
- <!-- BEGIN oauth -->
- <dl>
- <dt>&nbsp;</dt>
- <dd><a href="{oauth.REDIRECT_URL}" class="button2">{oauth.SERVICE_NAME}</a></dd>
- </dl>
- <!-- END oauth -->
+ {% for oauth in oauth %}
+ <a href="{{ oauth.REDIRECT_URL }}" class="button2">{{ oauth.SERVICE_NAME }}</a>
+ {% endfor %}
</div>
diff --git a/phpBB/styles/prosilver/template/login_forum.html b/phpBB/styles/prosilver/template/login_forum.html
index 7fa9736a96..c5c36d4564 100644
--- a/phpBB/styles/prosilver/template/login_forum.html
+++ b/phpBB/styles/prosilver/template/login_forum.html
@@ -25,6 +25,7 @@
<dd><input type="password" tabindex="1" id="password" name="password" size="25" class="inputbox narrow" autocomplete="off" /></dd>
</dl>
{S_LOGIN_REDIRECT}
+ {S_FORM_TOKEN_LOGIN}
<dl>
<dt>&nbsp;</dt>
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" id="login" class="button1" value="{L_LOGIN}" tabindex="2" /></dd>
diff --git a/phpBB/styles/prosilver/template/mcp_ban.html b/phpBB/styles/prosilver/template/mcp_ban.html
index 5b798d9b6c..86a322435d 100644
--- a/phpBB/styles/prosilver/template/mcp_ban.html
+++ b/phpBB/styles/prosilver/template/mcp_ban.html
@@ -1,8 +1,6 @@
<!-- INCLUDE mcp_header.html -->
-<script type="text/javascript">
-// <![CDATA[
-
+<script>
var ban_length = new Array();
ban_length[-1] = '';
var ban_reason = new Array();
@@ -11,12 +9,12 @@
ban_give_reason[-1] = '';
<!-- BEGIN bans -->
- ban_length['{bans.BAN_ID}'] = '{bans.A_LENGTH}';
+ ban_length['{bans.BAN_ID}'] = '{{ bans.A_LENGTH }}';
<!-- IF bans.A_REASON -->
- ban_reason['{bans.BAN_ID}'] = '{bans.A_REASON}';
+ ban_reason['{bans.BAN_ID}'] = '{{ bans.REASON | e('js') }}';
<!-- ENDIF -->
<!-- IF bans.A_GIVE_REASON -->
- ban_give_reason['{bans.BAN_ID}'] = '{bans.A_GIVE_REASON}';
+ ban_give_reason['{bans.BAN_ID}'] = '{{ bans.GIVE_REASON | e('js') }}';
<!-- ENDIF -->
<!-- END bans -->
@@ -34,8 +32,6 @@
document.getElementById('unbangivereason').innerHTML = '';
}
}
-
-// ]]>
</script>
<form id="mcp_ban" method="post" action="{U_ACTION}">
diff --git a/phpBB/styles/prosilver/template/mcp_forum.html b/phpBB/styles/prosilver/template/mcp_forum.html
index f6c518e1df..82df5d5dbe 100644
--- a/phpBB/styles/prosilver/template/mcp_forum.html
+++ b/phpBB/styles/prosilver/template/mcp_forum.html
@@ -86,7 +86,9 @@
<div class="responsive-hide">
<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
+ {% EVENT topiclist_row_topic_by_author_before %}
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; {topicrow.FIRST_POST_TIME}
+ {% EVENT topiclist_row_topic_by_author_after %}
</div>
<!-- EVENT topiclist_row_append -->
</div>
diff --git a/phpBB/styles/prosilver/template/mcp_move.html b/phpBB/styles/prosilver/template/mcp_move.html
index 45a9ae83bc..63197ef274 100644
--- a/phpBB/styles/prosilver/template/mcp_move.html
+++ b/phpBB/styles/prosilver/template/mcp_move.html
@@ -43,12 +43,14 @@
<!-- IF ADDITIONAL_MSG --><p>{ADDITIONAL_MSG}</p><!-- ENDIF -->
<fieldset>
+ {% EVENT mcp_move_destination_forum_before %}
<dl class="fields2">
<dt><label>{L_SELECT_DESTINATION_FORUM}{L_COLON}</label></dt>
<dd><select name="to_forum_id">{S_FORUM_SELECT}</select></dd>
<!-- IF S_CAN_LEAVE_SHADOW --><dd><label for="move_leave_shadow"><input type="checkbox" name="move_leave_shadow" id="move_leave_shadow" />{L_LEAVE_SHADOW}</label></dd><!-- ENDIF -->
<!-- IF S_CAN_LOCK_TOPIC --><dd><label for="move_lock_topics"><input type="checkbox" name="move_lock_topics" id="move_lock_topics" />{L_LOCK_TOPIC}</label></dd><!-- ENDIF -->
</dl>
+ {% EVENT mcp_move_destination_forum_after %}
<dl class="fields2">
<dt>&nbsp;</dt>
<dd><strong>{MESSAGE_TEXT}</strong></dd>
diff --git a/phpBB/styles/prosilver/template/mcp_post.html b/phpBB/styles/prosilver/template/mcp_post.html
index af16c8ab84..c2297a8053 100644
--- a/phpBB/styles/prosilver/template/mcp_post.html
+++ b/phpBB/styles/prosilver/template/mcp_post.html
@@ -31,10 +31,12 @@
<form method="post" id="mcp_report" action="{S_CLOSE_ACTION}">
<fieldset class="submit-buttons">
+ {% EVENT mcp_post_report_buttons_top_before %}
<!-- IF not S_REPORT_CLOSED -->
<input class="button1" type="submit" value="{L_CLOSE_REPORT}" name="action[close]" /> &nbsp;
<!-- ENDIF -->
<input class="button2" type="submit" value="{L_DELETE_REPORT}" name="action[delete]" />
+ {% EVENT mcp_post_report_buttons_top_after %}
<input type="hidden" name="report_id_list[]" value="{REPORT_ID}" />
{S_FORM_TOKEN}
</fieldset>
@@ -69,8 +71,8 @@
<p class="author">
<strong>{L_SENT_AT}{L_COLON}</strong> {POST_DATE}
<br /><strong>{L_PM_FROM}{L_COLON}</strong> {POST_AUTHOR_FULL}
- <!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}{L_COLON}</strong> <!-- BEGIN to_recipient --><!-- IF to_recipient.NAME_FULL -->{to_recipient.NAME_FULL}<!-- ELSE --><a href="{to_recipient.U_VIEW}" style="color:<!-- IF to_recipient.COLOUR -->{to_recipient.COLOUR}<!-- ELSEIF to_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{to_recipient.NAME}</a><!-- ENDIF -->&nbsp;<!-- END to_recipient --><!-- ENDIF -->
- <!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}{L_COLON}</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}" style="color:<!-- IF bcc_recipient.COLOUR -->{bcc_recipient.COLOUR}<!-- ELSEIF bcc_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{bcc_recipient.NAME}</a><!-- ENDIF -->&nbsp;<!-- END bcc_recipient --><!-- ENDIF -->
+ <!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}{L_COLON}</strong> <!-- BEGIN to_recipient --><!-- IF to_recipient.NAME_FULL -->{to_recipient.NAME_FULL}<!-- ELSE --><a href="{to_recipient.U_VIEW}"<!-- IF to_recipient.COLOUR --> style="color:{to_recipient.COLOUR};"<!-- ENDIF -->><strong>{to_recipient.NAME}</strong></a><!-- ENDIF -->&nbsp;<!-- END to_recipient --><!-- ENDIF -->
+ <!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}{L_COLON}</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}"<!-- IF bcc_recipient.COLOUR --> style="color:{bcc_recipient.COLOUR};"<!-- ENDIF -->><strong>{bcc_recipient.NAME}</strong></a><!-- ENDIF -->&nbsp;<!-- END bcc_recipient --><!-- ENDIF -->
</p>
<!-- ELSE -->
<p class="author"><span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{MINI_POST_IMG}</span></span> {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} &raquo; {POST_DATE}</p>
@@ -106,10 +108,14 @@
</p>
<!-- ENDIF -->
+ {% EVENT mcp_post_text_before %}
+
<div id="post_details" class="content post_details">
{POST_PREVIEW}
</div>
+ {% EVENT mcp_post_text_after %}
+
<!-- IF S_HAS_ATTACHMENTS -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
diff --git a/phpBB/styles/prosilver/template/mcp_topic.html b/phpBB/styles/prosilver/template/mcp_topic.html
index 35b1ecca0a..090e24041e 100644
--- a/phpBB/styles/prosilver/template/mcp_topic.html
+++ b/phpBB/styles/prosilver/template/mcp_topic.html
@@ -94,6 +94,7 @@
<div id="topicreview" class="topicreview">
<!-- BEGIN postrow -->
+ <!-- EVENT mcp_topic_postrow_post_before -->
<div class="post <!-- IF postrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
<div class="inner">
@@ -119,7 +120,7 @@
<p class="author">
<a href="#pr{postrow.POST_ID}" title="{postrow.MINI_POST}">
<i class="icon fa-file fa-fw icon-lightgray icon-tiny" aria-hidden="true"></i><span class="sr-only">{postrow.MINI_POST}</span>
- </a> {L_POSTED} {postrow.POST_DATE} {L_POST_BY_AUTHOR} <strong>{postrow.POST_AUTHOR_FULL}</strong><!-- IF postrow.U_MCP_DETAILS --> [ <a href="{postrow.U_MCP_DETAILS}">{L_POST_DETAILS}</a> ]<!-- ENDIF -->
+ </a> {L_POSTED} {postrow.POST_DATE} {L_POST_BY_AUTHOR} {% EVENT mcp_topic_post_author_full_prepend %}<strong>{postrow.POST_AUTHOR_FULL}</strong>{% EVENT mcp_topic_post_author_full_append %}<!-- IF postrow.U_MCP_DETAILS --> [ <a href="{postrow.U_MCP_DETAILS}">{L_POST_DETAILS}</a> ]<!-- ENDIF -->
</p>
<!-- EVENT mcp_topic_postrow_post_details_after -->
@@ -143,6 +144,8 @@
<div class="content" id="message_{postrow.POST_ID}">{postrow.MESSAGE}</div>
+ <!-- EVENT mcp_topic_postrow_attachments_before -->
+
<!-- IF postrow.S_HAS_ATTACHMENTS -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
@@ -152,6 +155,8 @@
</dl>
<!-- ENDIF -->
+ <!-- EVENT mcp_topic_postrow_attachments_after -->
+
</div>
</div>
diff --git a/phpBB/styles/prosilver/template/memberlist_body.html b/phpBB/styles/prosilver/template/memberlist_body.html
index 255e6746e1..5f03ad99cc 100644
--- a/phpBB/styles/prosilver/template/memberlist_body.html
+++ b/phpBB/styles/prosilver/template/memberlist_body.html
@@ -12,19 +12,28 @@
<!-- ENDIF -->
+{% EVENT memberlist_body_page_header_after %}
+
<!-- IF S_SHOW_GROUP -->
+ {% EVENT memberlist_body_group_name_before %}
<h2 class="group-title"<!-- IF GROUP_COLOR --> style="color:#{GROUP_COLOR};"<!-- ENDIF -->>{GROUP_NAME}</h2>
+ {% EVENT memberlist_body_group_name_after %}
<!-- IF U_MANAGE -->
<p class="right responsive-center manage rightside"><a href="{U_MANAGE}">{L_MANAGE_GROUP}</a></p>
<!-- ENDIF -->
<p>{GROUP_DESC} {GROUP_TYPE}</p>
+ {% EVENT memberlist_body_group_desc_after %}
+
<p>
<!-- IF AVATAR_IMG -->{AVATAR_IMG}<!-- ENDIF -->
+ {% EVENT memberlist_body_group_rank_before %}
<!-- IF RANK_IMG -->{RANK_IMG}<!-- ENDIF -->
<!-- IF GROUP_RANK -->{GROUP_RANK}<!-- ENDIF -->
+ {% EVENT memberlist_body_group_rank_after %}
</p>
<!-- ELSE -->
+ {% EVENT memberlist_body_page_title_before %}
<h2 class="solo">{PAGE_TITLE}<!-- IF SEARCH_WORDS -->{L_COLON} <a href="{U_SEARCH_WORDS}">{SEARCH_WORDS}</a><!-- ENDIF --></h2>
<div class="action-bar bar-top">
@@ -60,6 +69,7 @@
<th class="info"><!-- BEGIN custom_fields --><!-- IF not custom_fields.S_FIRST_ROW -->{L_COMMA_SEPARATOR} <!-- ENDIF -->{custom_fields.PROFILE_FIELD_NAME}<!-- END custom_fields --></th>
<th class="joined"><a href="{U_SORT_JOINED}#memberlist">{L_JOINED}</a></th>
<!-- IF U_SORT_ACTIVE --><th class="active"><a href="{U_SORT_ACTIVE}#memberlist">{L_LAST_ACTIVE}</a></th><!-- ENDIF -->
+ {% EVENT memberlist_body_memberlist_after %}
</tr>
</thead>
<tbody>
@@ -88,15 +98,17 @@
<!-- IF not S_LEADERS_SET -->
<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}{L_USERNAME}"><span class="rank-img"><a href="{U_SORT_RANK}">{L_RANK}</a></span><a href="{U_SORT_USERNAME}"><!-- IF S_SHOW_GROUP -->{L_GROUP_MEMBERS}<!-- ELSE -->{L_USERNAME}<!-- ENDIF --></a></th>
<th class="posts"><a href="{U_SORT_POSTS}#memberlist">{L_POSTS}</a></th>
- <th class="info"><!-- BEGIN custom_fields --><!-- IF not custom_fields.S_FIRST_ROW -->{L_COMMA_SEPARATOR} <!-- ENDIF -->{custom_fields.PROFILE_FIELD_NAME}<!-- END custom_fields --></th>
+ <th class="info">{% for field in custom_fields %}{% if not loop.first %}{L_COMMA_SEPARATOR} {% endif %}{{ field.PROFILE_FIELD_NAME }}{% endfor %}</th>
<th class="joined"><a href="{U_SORT_JOINED}#memberlist">{L_JOINED}</a></th>
<!-- IF U_SORT_ACTIVE --><th class="active"><a href="{U_SORT_ACTIVE}#memberlist">{L_LAST_ACTIVE}</a></th><!-- ENDIF -->
+ {% EVENT memberlist_body_leaders_set_after %}
<!-- ELSEIF S_SHOW_GROUP -->
<th class="name">{L_GROUP_MEMBERS}</th>
<th class="posts">{L_POSTS}</th>
<th class="info"><!-- BEGIN custom_fields --><!-- IF not custom_fields.S_FIRST_ROW -->{L_COMMA_SEPARATOR} <!-- ENDIF -->{custom_fields.PROFILE_FIELD_NAME}<!-- END custom_fields --></th>
<th class="joined">{L_JOINED}</th>
<!-- IF U_SORT_ACTIVE --><th class="active">{L_LAST_ACTIVE}</th><!-- ENDIF -->
+ {% EVENT memberlist_body_show_group_after %}
<!-- ENDIF -->
</tr>
</thead>
@@ -111,6 +123,7 @@
<td class="info"><!-- BEGIN custom_fields --><div>{memberrow.custom_fields.PROFILE_FIELD_VALUE}</div><!-- BEGINELSE -->&nbsp;<!-- END custom_fields --></td>
<td>{memberrow.JOINED}</td>
<!-- IF S_VIEWONLINE --><td>{memberrow.LAST_ACTIVE}&nbsp;</td><!-- ENDIF -->
+ {% EVENT memberlist_body_memberrow_after %}
</tr>
<!-- BEGINELSE -->
<tr class="bg1">
@@ -156,6 +169,8 @@
</div>
</div>
+{% EVENT memberlist_body_page_footer_before %}
+
<!-- IF S_IN_SEARCH_POPUP -->
<!-- INCLUDE simple_footer.html -->
<!-- ELSE -->
diff --git a/phpBB/styles/prosilver/template/memberlist_email.html b/phpBB/styles/prosilver/template/memberlist_email.html
index d9752bed00..eea699da08 100644
--- a/phpBB/styles/prosilver/template/memberlist_email.html
+++ b/phpBB/styles/prosilver/template/memberlist_email.html
@@ -77,7 +77,7 @@
<dl>
<dt><label for="message">{L_MESSAGE_BODY}{L_COLON}</label><br />
<span>{L_EMAIL_BODY_EXPLAIN}</span></dt>
- <dd><textarea name="message" id="message" rows="15" cols="76" tabindex="4">{MESSAGE}</textarea></dd>
+ <dd><textarea class="inputbox" name="message" id="message" rows="15" cols="76" tabindex="4">{MESSAGE}</textarea></dd>
</dl>
<!-- IF S_REGISTERED_USER -->
<dl>
diff --git a/phpBB/styles/prosilver/template/memberlist_view.html b/phpBB/styles/prosilver/template/memberlist_view.html
index a7439bc759..debf64cba2 100644
--- a/phpBB/styles/prosilver/template/memberlist_view.html
+++ b/phpBB/styles/prosilver/template/memberlist_view.html
@@ -21,7 +21,7 @@
<dl class="left-box details profile-details">
<dt>{L_USERNAME}{L_COLON}</dt>
<dd>
- <!-- IF USER_COLOR --><span style="color: {USER_COLOR}; font-weight: bold;"><!-- ELSE --><span><!-- ENDIF -->{USERNAME}</span>
+ <!-- EVENT memberlist_view_username_prepend --><!-- IF USER_COLOR --><span style="color: {USER_COLOR}; font-weight: bold;"><!-- ELSE --><span><!-- ENDIF -->{USERNAME}</span><!-- EVENT memberlist_view_username_append -->
<!-- IF U_EDIT_SELF --> [ <a href="{U_EDIT_SELF}">{L_EDIT_PROFILE}</a> ]<!-- ENDIF -->
<!-- IF U_USER_ADMIN --> [ <a href="{U_USER_ADMIN}">{L_USER_ADMIN}</a> ]<!-- ENDIF -->
<!-- IF U_USER_BAN --> [ <a href="{U_USER_BAN}">{L_USER_BAN}</a> ]<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/navbar_header.html b/phpBB/styles/prosilver/template/navbar_header.html
index b8080a6be3..dc29285922 100644
--- a/phpBB/styles/prosilver/template/navbar_header.html
+++ b/phpBB/styles/prosilver/template/navbar_header.html
@@ -123,11 +123,13 @@
<i class="icon fa-sliders fa-fw" aria-hidden="true"></i><span>{L_PROFILE}</span>
</a>
</li>
- <li>
- <a href="{U_USER_PROFILE}" title="{L_READ_PROFILE}" role="menuitem">
- <i class="icon fa-user fa-fw" aria-hidden="true"></i><span>{L_READ_PROFILE}</span>
- </a>
- </li>
+ <!-- IF U_USER_PROFILE -->
+ <li>
+ <a href="{U_USER_PROFILE}" title="{L_READ_PROFILE}" role="menuitem">
+ <i class="icon fa-user fa-fw" aria-hidden="true"></i><span>{L_READ_PROFILE}</span>
+ </a>
+ </li>
+ <!-- ENDIF -->
<!-- EVENT navbar_header_profile_list_after -->
@@ -176,18 +178,19 @@
</ul>
<ul id="nav-breadcrumbs" class="nav-breadcrumbs linklist navlinks" role="menubar">
- <!-- DEFINE $MICRODATA = ' itemtype="http://data-vocabulary.org/Breadcrumb" itemscope=""' -->
+ <!-- DEFINE $MICRODATA = ' itemtype="http://schema.org/ListItem" itemprop="itemListElement" itemscope' -->
+ {% set navlink_position = 1 %}
<!-- EVENT overall_header_breadcrumbs_before -->
- <li class="breadcrumbs">
+ <li class="breadcrumbs" itemscope itemtype="http://schema.org/BreadcrumbList">
<!-- IF U_SITE_HOME -->
- <span class="crumb" {$MICRODATA}><a href="{U_SITE_HOME}" itemprop="url" data-navbar-reference="home"><i class="icon fa-home fa-fw" aria-hidden="true"></i><span itemprop="title">{L_SITE_HOME}</span></a></span>
+ <span class="crumb" {$MICRODATA}><a href="{U_SITE_HOME}" itemtype="https://schema.org/Thing" itemprop="item" data-navbar-reference="home"><i class="icon fa-home fa-fw" aria-hidden="true"></i><span itemprop="name">{L_SITE_HOME}</span></a><meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}" /></span>
<!-- ENDIF -->
<!-- EVENT overall_header_breadcrumb_prepend -->
- <span class="crumb" {$MICRODATA}><a href="{U_INDEX}" itemprop="url" accesskey="h" data-navbar-reference="index"><!-- IF not U_SITE_HOME --><i class="icon fa-home fa-fw"></i><!-- ENDIF --><span itemprop="title">{L_INDEX}</span></a></span>
+ <span class="crumb" {$MICRODATA}><a href="{U_INDEX}" itemtype="https://schema.org/Thing" itemprop="item" accesskey="h" data-navbar-reference="index"><!-- IF not U_SITE_HOME --><i class="icon fa-home fa-fw"></i><!-- ENDIF --><span itemprop="name">{L_INDEX}</span></a><meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}" /></span>
<!-- BEGIN navlinks -->
<!-- EVENT overall_header_navlink_prepend -->
- <span class="crumb" {$MICRODATA}<!-- IF navlinks.MICRODATA --> {navlinks.MICRODATA}<!-- ENDIF -->><a href="{navlinks.U_VIEW_FORUM}" itemprop="url"><span itemprop="title">{navlinks.FORUM_NAME}</span></a></span>
+ <span class="crumb" {$MICRODATA}<!-- IF navlinks.MICRODATA --> {navlinks.MICRODATA}<!-- ENDIF -->><a href="{navlinks.U_VIEW_FORUM}" itemtype="https://schema.org/Thing" itemprop="item"><span itemprop="name">{navlinks.FORUM_NAME}</span></a><meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}" /></span>
<!-- EVENT overall_header_navlink_append -->
<!-- END navlinks -->
<!-- EVENT overall_header_breadcrumb_append -->
diff --git a/phpBB/styles/prosilver/template/overall_footer.html b/phpBB/styles/prosilver/template/overall_footer.html
index 97a21f9a6e..bdff1a0c05 100644
--- a/phpBB/styles/prosilver/template/overall_footer.html
+++ b/phpBB/styles/prosilver/template/overall_footer.html
@@ -8,11 +8,34 @@
<div class="copyright">
<!-- EVENT overall_footer_copyright_prepend -->
- {CREDIT_LINE}
- <!-- IF TRANSLATION_INFO --><br />{TRANSLATION_INFO}<!-- ENDIF -->
+ <p class="footer-row">
+ <span class="footer-copyright">{{ CREDIT_LINE }}</span>
+ </p>
+ <!-- IF TRANSLATION_INFO -->
+ <p class="footer-row">
+ <span class="footer-copyright">{{ TRANSLATION_INFO }}</span>
+ </p>
+ <!-- ENDIF -->
<!-- EVENT overall_footer_copyright_append -->
- <!-- IF DEBUG_OUTPUT --><br />{DEBUG_OUTPUT}<!-- ENDIF -->
- <!-- IF U_ACP --><br /><strong><a href="{U_ACP}">{L_ACP}</a></strong><!-- ENDIF -->
+ <p class="footer-row">
+ <a class="footer-link" href="{{ U_PRIVACY }}" title="{{ lang('PRIVACY_LINK') }}" role="menuitem">
+ <span class="footer-link-text">{{ lang('PRIVACY_LINK') }}</span>
+ </a>
+ |
+ <a class="footer-link" href="{{ U_TERMS_USE }}" title="{{ lang('TERMS_LINK') }}" role="menuitem">
+ <span class="footer-link-text">{{ lang('TERMS_LINK') }}</span>
+ </a>
+ </p>
+ <!-- IF DEBUG_OUTPUT -->
+ <p class="footer-row">
+ <span class="footer-info">{{ DEBUG_OUTPUT }}</span>
+ </p>
+ <!-- ENDIF -->
+ <!-- IF U_ACP -->
+ <p class="footer-row">
+ <a class="footer-link text-strong" href="{{ U_ACP }}">{{ lang('ACP') }}</a>
+ </p>
+ <!-- ENDIF -->
</div>
<div id="darkenwrapper" class="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
@@ -40,13 +63,13 @@
<!-- IF not S_IS_BOT -->{RUN_CRON_TASK}<!-- ENDIF -->
</div>
-<script type="text/javascript" src="{T_JQUERY_LINK}"></script>
-<!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
-<script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
+<script src="{T_JQUERY_LINK}"></script>
+<!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
+<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
<!-- INCLUDEJS forum_fn.js -->
<!-- INCLUDEJS ajax.js -->
<!-- IF S_ALLOW_CDN -->
- <script type="text/javascript">
+ <script>
(function($){
var $fa_cdn = $('head').find('link[rel="stylesheet"]').first(),
$span = $('<span class="fa" style="display:none"></span>').appendTo('body');
@@ -62,24 +85,27 @@
<!-- IF S_COOKIE_NOTICE -->
<script src="{T_ASSETS_PATH}/cookieconsent/cookieconsent.min.js?assets_version={T_ASSETS_VERSION}"></script>
<script>
- window.addEventListener("load", function(){
- window.cookieconsent.initialise({
- "palette": {
- "popup": {
- "background": "#0F538A"
+ if (typeof window.cookieconsent === "object") {
+ window.addEventListener("load", function(){
+ window.cookieconsent.initialise({
+ "palette": {
+ "popup": {
+ "background": "#0F538A"
+ },
+ "button": {
+ "background": "#E5E5E5"
+ }
},
- "button": {
- "background": "#E5E5E5"
+ "theme": "classic",
+ "content": {
+ "message": "{LA_COOKIE_CONSENT_MSG}",
+ "dismiss": "{LA_COOKIE_CONSENT_OK}",
+ "link": "{LA_COOKIE_CONSENT_INFO}",
+ "href": "{UA_PRIVACY}"
}
- },
- "theme": "classic",
- "content": {
- "message": "{LA_COOKIE_CONSENT_MSG}",
- "dismiss": "{LA_COOKIE_CONSENT_OK}",
- "link": "{LA_COOKIE_CONSENT_INFO}",
- "href": "{LA_COOKIE_CONSENT_HREF}"
- }
- })});
+ });
+ });
+ }
</script>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/plupload.html b/phpBB/styles/prosilver/template/plupload.html
index fc663118c1..1eb84372e8 100644
--- a/phpBB/styles/prosilver/template/plupload.html
+++ b/phpBB/styles/prosilver/template/plupload.html
@@ -1,5 +1,4 @@
-<script type="text/javascript">
-//<![CDATA[
+<script>
phpbb.plupload = {
i18n: {
'b': '{LA_BYTES_SHORT}',
@@ -63,7 +62,6 @@ phpbb.plupload = {
maxFiles: {MAX_ATTACHMENTS},
data: {S_ATTACH_DATA},
}
-//]]>
</script>
<!-- INCLUDEJS {T_ASSETS_PATH}/plupload/plupload.full.min.js -->
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/plupload.js -->
diff --git a/phpBB/styles/prosilver/template/posting_attach_body.html b/phpBB/styles/prosilver/template/posting_attach_body.html
index 444713d6e0..ff5bfe1b55 100644
--- a/phpBB/styles/prosilver/template/posting_attach_body.html
+++ b/phpBB/styles/prosilver/template/posting_attach_body.html
@@ -21,6 +21,7 @@
<input type="button" class="button2" value="{L_PLUPLOAD_ADD_FILES}" id="add_files" />
</div>
+ {% EVENT posting_attach_body_file_list_before %}
<div class="panel<!-- IF not .attach_row --> hidden<!-- ENDIF --> file-list-container" id="file-list-container">
<div class="inner">
<table class="table1 zebra-list fixed-width-table">
@@ -33,7 +34,7 @@
</tr>
</thead>
<tbody class="responsive-skip-empty file-list" id="file-list">
- <tr class="attach-row" id="attach-row-tpl">
+ <tr class="attach-row attach-row-tpl" id="attach-row-tpl">
<td class="attach-name">
<span class="file-name ellipsis-text"></span>
<span class="attach-controls">
@@ -55,16 +56,18 @@
<span class="file-status"></span>
</td>
</tr>
+ {% EVENT posting_attach_body_attach_row_before %}
<!-- BEGIN attach_row -->
+ {% EVENT posting_attach_body_attach_row_prepend %}
<tr class="attach-row" data-attach-id="{attach_row.ATTACH_ID}">
<td class="attach-name">
<span class="file-name ellipsis-text"><a href="{attach_row.U_VIEW_ATTACHMENT}">{attach_row.FILENAME}</a></span>
- <!-- EVENT posting_attach_body_attach_row_controls_prepend -->
+ {% EVENT posting_attach_body_attach_row_controls_prepend %}
<span class="attach-controls">
<!-- IF S_INLINE_ATTACHMENT_OPTIONS --><input type="button" value="{L_PLACE_INLINE}" class="button2 file-inline-bbcode" />&nbsp; <!-- ENDIF -->
<input type="submit" name="delete_file[{attach_row.ASSOC_INDEX}]" value="{L_DELETE_FILE}" class="button2 file-delete" />
</span>
- <!-- EVENT posting_attach_body_attach_row_controls_append -->
+ {% EVENT posting_attach_body_attach_row_controls_append %}
<span class="clear"></span>
</td>
<td class="attach-comment">
@@ -78,10 +81,13 @@
<span class="file-status file-uploaded"></span>
</td>
</tr>
+ {% EVENT posting_attach_body_attach_row_append %}
<!-- END attach_row -->
+ {% EVENT posting_attach_body_attach_row_after %}
</tbody>
</table>
</div>
</div>
+ {% EVENT posting_attach_body_file_list_after %}
</div>
</div>
diff --git a/phpBB/styles/prosilver/template/posting_buttons.html b/phpBB/styles/prosilver/template/posting_buttons.html
index 14185ed66b..122afdf978 100644
--- a/phpBB/styles/prosilver/template/posting_buttons.html
+++ b/phpBB/styles/prosilver/template/posting_buttons.html
@@ -1,6 +1,5 @@
-<script type="text/javascript">
-// <![CDATA[
+<script>
var form_name = 'postform';
var text_name = <!-- IF $SIG_EDIT -->'signature'<!-- ELSE -->'message'<!-- ENDIF -->;
var load_draft = false;
@@ -46,8 +45,6 @@
document.getElementById('bbpalette').value = '{LA_FONT_COLOR}';
}
}
-
-// ]]>
</script>
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/editor.js -->
diff --git a/phpBB/styles/prosilver/template/posting_pm_header.html b/phpBB/styles/prosilver/template/posting_pm_header.html
index 032d8c6a6f..7fee914525 100644
--- a/phpBB/styles/prosilver/template/posting_pm_header.html
+++ b/phpBB/styles/prosilver/template/posting_pm_header.html
@@ -32,7 +32,7 @@
<!-- BEGIN to_recipient -->
<li>
<!-- IF not S_EDIT_POST --><input type="submit" name="remove_{to_recipient.TYPE}[{to_recipient.UG_ID}]" value="x" class="button2" /><!-- ENDIF -->
- <!-- IF to_recipient.IS_GROUP --><a href="{to_recipient.U_VIEW}"><strong>{to_recipient.NAME}</strong></a><!-- ELSE -->{to_recipient.NAME_FULL}<!-- ENDIF -->
+ <!-- IF to_recipient.IS_GROUP --><a href="{to_recipient.U_VIEW}" style="color: {{ to_recipient.COLOUR }}"><strong>{to_recipient.NAME}</strong></a><!-- ELSE -->{to_recipient.NAME_FULL}<!-- ENDIF -->
</li>
<!-- END to_recipient -->
</ul>
@@ -49,7 +49,7 @@
<!-- BEGIN bcc_recipient -->
<li>
<!-- IF not S_EDIT_POST --><input type="submit" name="remove_{bcc_recipient.TYPE}[{bcc_recipient.UG_ID}]" value="x" class="button2" /><!-- ENDIF -->
- <!-- IF bcc_recipient.IS_GROUP --><a href="{bcc_recipient.U_VIEW}"><strong>{bcc_recipient.NAME}</strong></a><!-- ELSE -->{bcc_recipient.NAME_FULL}<!-- ENDIF -->
+ <!-- IF bcc_recipient.IS_GROUP --><a href="{bcc_recipient.U_VIEW}" style="color: {{ bcc_recipient.COLOUR }}"><strong>{bcc_recipient.NAME}</strong></a><!-- ELSE -->{bcc_recipient.NAME_FULL}<!-- ENDIF -->
</li>
<!-- END bcc_recipient -->
</ul>
diff --git a/phpBB/styles/prosilver/template/posting_poll_body.html b/phpBB/styles/prosilver/template/posting_poll_body.html
index ee7100aded..795649650d 100644
--- a/phpBB/styles/prosilver/template/posting_poll_body.html
+++ b/phpBB/styles/prosilver/template/posting_poll_body.html
@@ -15,8 +15,8 @@
<!-- IF S_SHOW_POLL_BOX -->
<dl>
- <dt><label for="poll_title">{L_POLL_QUESTION}{L_COLON}</label></dt>
- <dd><input type="text" name="poll_title" id="poll_title" maxlength="255" value="{POLL_TITLE}" class="inputbox" /></dd>
+ <dt><label for="poll_title">{{ lang('POLL_QUESTION') ~ lang('COLON') }}</label></dt>
+ <dd><input type="text" name="poll_title" id="poll_title" maxlength="100" value="{{ POLL_TITLE }}" class="inputbox" /></dd>
</dl>
<dl>
<dt><label for="poll_option_text">{L_POLL_OPTIONS}{L_COLON}</label><br /><span>{L_POLL_OPTIONS_EXPLAIN}</span></dt>
diff --git a/phpBB/styles/prosilver/template/posting_preview.html b/phpBB/styles/prosilver/template/posting_preview.html
index aac117c090..781d0de06b 100644
--- a/phpBB/styles/prosilver/template/posting_preview.html
+++ b/phpBB/styles/prosilver/template/posting_preview.html
@@ -31,6 +31,8 @@
<div class="content">{PREVIEW_MESSAGE}</div>
+ <!-- EVENT posting_preview_content_after -->
+
<!-- IF .attachment -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
diff --git a/phpBB/styles/prosilver/template/posting_review.html b/phpBB/styles/prosilver/template/posting_review.html
index 1304046b23..033a88485e 100644
--- a/phpBB/styles/prosilver/template/posting_review.html
+++ b/phpBB/styles/prosilver/template/posting_review.html
@@ -22,7 +22,7 @@
<i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{post_review_row.MINI_POST}</span>
</a>
<!-- ENDIF -->
- {L_POST_BY_AUTHOR}<strong> {post_review_row.POST_AUTHOR_FULL}</strong> &raquo; {post_review_row.POST_DATE}
+ {L_POST_BY_AUTHOR} <!-- EVENT posting_review_row_post_author_username_prepend --><strong>{post_review_row.POST_AUTHOR_FULL}</strong><!-- EVENT posting_review_row_post_author_username_append --> &raquo; {post_review_row.POST_DATE}
</p>
<div class="content">{post_review_row.MESSAGE}</div>
diff --git a/phpBB/styles/prosilver/template/posting_smilies.html b/phpBB/styles/prosilver/template/posting_smilies.html
index 54e82a58bc..b5794d5aff 100644
--- a/phpBB/styles/prosilver/template/posting_smilies.html
+++ b/phpBB/styles/prosilver/template/posting_smilies.html
@@ -1,10 +1,8 @@
<!-- INCLUDE simple_header.html -->
-<script type="text/javascript">
-// <![CDATA[
+<script>
var form_name = opener.form_name;
var text_name = opener.text_name;
-// ]]>
</script>
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/editor.js -->
diff --git a/phpBB/styles/prosilver/template/posting_topic_review.html b/phpBB/styles/prosilver/template/posting_topic_review.html
index 857c686774..8faece3447 100644
--- a/phpBB/styles/prosilver/template/posting_topic_review.html
+++ b/phpBB/styles/prosilver/template/posting_topic_review.html
@@ -5,10 +5,8 @@
</h3>
<div id="topicreview" class="topicreview">
-<script type="text/javascript">
-// <![CDATA[
+<script>
bbcodeEnabled = {S_BBCODE_ALLOWED};
-// ]]>
</script>
<!-- BEGIN topic_review_row -->
@@ -56,12 +54,14 @@
<i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{topic_review_row.MINI_POST}</span>
</a>
<!-- ENDIF -->
- {L_POST_BY_AUTHOR} <strong>{topic_review_row.POST_AUTHOR_FULL}</strong> &raquo; {topic_review_row.POST_DATE}
+ {L_POST_BY_AUTHOR} <!-- EVENT posting_topic_review_row_post_author_username_prepend --><strong>{topic_review_row.POST_AUTHOR_FULL}</strong><!-- EVENT posting_topic_review_row_post_author_username_append --> &raquo; {topic_review_row.POST_DATE}
</p>
<!-- EVENT posting_topic_review_row_post_details_after -->
<div class="content">{topic_review_row.MESSAGE}</div>
+ <!-- EVENT posting_topic_review_row_content_after -->
+
<!-- IF topic_review_row.S_HAS_ATTACHMENTS -->
<dl class="attachbox">
<dt>{L_ATTACHMENTS}</dt>
diff --git a/phpBB/styles/prosilver/template/search_results.html b/phpBB/styles/prosilver/template/search_results.html
index 3e1be4d4cb..9ee13a4224 100644
--- a/phpBB/styles/prosilver/template/search_results.html
+++ b/phpBB/styles/prosilver/template/search_results.html
@@ -108,7 +108,7 @@
<!-- IF not S_IS_BOT -->
<div class="responsive-show" style="display: none;">
- {L_LAST_POST} {L_POST_BY_AUTHOR} {searchresults.LAST_POST_AUTHOR_FULL} &laquo; <a href="{searchresults.U_LAST_POST}" title="{L_GOTO_LAST_POST}"><time datetime="{searchresults.LAST_POST_TIME_RFC3339}">{searchresults.LAST_POST_TIME}</time></a>
+ {L_LAST_POST} {L_POST_BY_AUTHOR} <!-- EVENT search_results_last_post_author_username_prepend -->{searchresults.LAST_POST_AUTHOR_FULL}<!-- EVENT search_results_last_post_author_username_append --> &laquo; <a href="{searchresults.U_LAST_POST}" title="{L_GOTO_LAST_POST}"><time datetime="{searchresults.LAST_POST_TIME_RFC3339}">{searchresults.LAST_POST_TIME}</time></a>
<br />{L_POSTED} {L_IN} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a>
</div>
<!-- IF searchresults.TOPIC_REPLIES --><span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{searchresults.TOPIC_REPLIES}</strong></span><!-- ENDIF -->
@@ -117,7 +117,9 @@
<div class="responsive-hide left-box">
<!-- IF searchresults.S_HAS_POLL --><i class="icon fa-bar-chart fa-fw" aria-hidden="true"></i><!-- ENDIF -->
<!-- IF searchresults.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i><!-- ENDIF -->
- {L_POST_BY_AUTHOR} {searchresults.TOPIC_AUTHOR_FULL} &raquo; <time datetime="{searchresults.FIRST_POST_TIME_RFC3339}">{searchresults.FIRST_POST_TIME}</time> &raquo; {L_IN} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a>
+ {% EVENT topiclist_row_topic_by_author_before %}
+ {L_POST_BY_AUTHOR} <!-- EVENT search_results_topic_author_username_prepend -->{searchresults.TOPIC_AUTHOR_FULL}<!-- EVENT search_results_topic_author_username_append --> &raquo; <time datetime="{searchresults.FIRST_POST_TIME_RFC3339}">{searchresults.FIRST_POST_TIME}</time> &raquo; {L_IN} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a>
+ {% EVENT topiclist_row_topic_by_author_after %}
</div>
<!-- IF .searchresults.pagination -->
@@ -142,7 +144,7 @@
<dd class="posts">{searchresults.TOPIC_REPLIES} <dfn>{L_REPLIES}</dfn></dd>
<dd class="views">{searchresults.TOPIC_VIEWS} <dfn>{L_VIEWS}</dfn></dd>
<dd class="lastpost">
- <span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {searchresults.LAST_POST_AUTHOR_FULL}
+ <span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} <!-- EVENT search_results_last_post_author_username_prepend -->{searchresults.LAST_POST_AUTHOR_FULL}<!-- EVENT search_results_last_post_author_username_append -->
<!-- IF not S_IS_BOT -->
<a href="{searchresults.U_LAST_POST}" title="{L_GOTO_LAST_POST}">
<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
@@ -181,7 +183,7 @@
<!-- ELSE -->
<dl class="postprofile">
<!-- EVENT search_results_postprofile_before -->
- <dt class="author">{L_POST_BY_AUTHOR} {searchresults.POST_AUTHOR_FULL}</dt>
+ <dt class="author">{L_POST_BY_AUTHOR} <!-- EVENT search_results_post_author_username_prepend -->{searchresults.POST_AUTHOR_FULL}<!-- EVENT search_results_post_author_username_append --></dt>
<dd class="search-result-date">{searchresults.POST_DATE}</dd>
<dd>{L_FORUM}{L_COLON} <a href="{searchresults.U_VIEW_FORUM}">{searchresults.FORUM_TITLE}</a></dd>
<dd>{L_TOPIC}{L_COLON} <a href="{searchresults.U_VIEW_TOPIC}">{searchresults.TOPIC_TITLE}</a></dd>
@@ -194,6 +196,7 @@
<div class="postbody">
<h3><a href="{searchresults.U_VIEW_POST}">{searchresults.POST_SUBJECT}</a></h3>
<div class="content">{searchresults.MESSAGE}</div>
+ <!-- EVENT search_results_content_after -->
</div>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/simple_footer.html b/phpBB/styles/prosilver/template/simple_footer.html
index 614c137835..1ef44d1688 100644
--- a/phpBB/styles/prosilver/template/simple_footer.html
+++ b/phpBB/styles/prosilver/template/simple_footer.html
@@ -24,9 +24,9 @@
</div>
</div>
-<script type="text/javascript" src="{T_JQUERY_LINK}"></script>
-<!-- IF S_ALLOW_CDN --><script type="text/javascript">window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
-<script type="text/javascript" src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
+<script src="{T_JQUERY_LINK}"></script>
+<!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
+<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
<!-- INCLUDEJS forum_fn.js -->
<!-- INCLUDEJS ajax.js -->
@@ -34,5 +34,7 @@
{$SCRIPTS}
+{% EVENT simple_footer_body_after %}
+
</body>
</html>
diff --git a/phpBB/styles/prosilver/template/ucp_agreement.html b/phpBB/styles/prosilver/template/ucp_agreement.html
index 943774c6ec..d4fef9f0a5 100644
--- a/phpBB/styles/prosilver/template/ucp_agreement.html
+++ b/phpBB/styles/prosilver/template/ucp_agreement.html
@@ -3,8 +3,7 @@
<!-- IF S_SHOW_COPPA or S_REGISTRATION -->
<!-- IF S_LANG_OPTIONS -->
-<script type="text/javascript">
-// <![CDATA[
+<script>
/**
* Change language
*/
@@ -14,8 +13,6 @@
document.forms['register'].change_lang.value = lang_iso;
document.forms['register'].submit();
}
-
-// ]]>
</script>
<form method="post" action="{S_UCP_ACTION}" id="register">
@@ -65,8 +62,6 @@
<div class="content">
<h2 class="sitename-title">{SITENAME} - {AGREEMENT_TITLE}</h2>
<p>{AGREEMENT_TEXT}</p>
- <hr class="dashed" />
- <p><a href="{U_BACK}" class="button2">{L_BACK}</a></p>
</div>
</div>
</div>
diff --git a/phpBB/styles/prosilver/template/ucp_attachments.html b/phpBB/styles/prosilver/template/ucp_attachments.html
index 696f621116..cfdbf9c7ea 100644
--- a/phpBB/styles/prosilver/template/ucp_attachments.html
+++ b/phpBB/styles/prosilver/template/ucp_attachments.html
@@ -44,7 +44,7 @@
</dt>
<dd class="extra">{attachrow.DOWNLOAD_COUNT}</dd>
<dd class="time"><span>{attachrow.POST_TIME}</span></dd>
- <dd class="mark"><input type="checkbox" name="attachment[{attachrow.ATTACH_ID}]" value="1" /></dd>
+ <dd class="mark"><input type="checkbox" name="attachment[{attachrow.ATTACH_ID}]" value="1"{% if attachrow.S_LOCKED %} disabled title="{{ lang('ATTACHMENT_LOCKED') }}"{% endif %} /></dd>
</dl>
</li>
<!-- END attachrow -->
diff --git a/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html b/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html
index 18316613b0..60061a3139 100644
--- a/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html
+++ b/phpBB/styles/prosilver/template/ucp_auth_link_oauth.html
@@ -1,5 +1,5 @@
<!-- BEGIN oauth -->
- <form id="ucp" method="post" action="{S_UCP_ACTION}">
+ <form id="ucp_oauth_{oauth.SERVICE_ID}" method="post" action="{S_UCP_ACTION}">
<h3>{oauth.SERVICE_NAME}</h3>
<fieldset class="fields2">
diff --git a/phpBB/styles/prosilver/template/ucp_footer.html b/phpBB/styles/prosilver/template/ucp_footer.html
index f2f1a68db3..eb07f52e05 100644
--- a/phpBB/styles/prosilver/template/ucp_footer.html
+++ b/phpBB/styles/prosilver/template/ucp_footer.html
@@ -9,6 +9,4 @@
</form>
<!-- ENDIF -->
-<!-- INCLUDE jumpbox.html -->
-
<!-- INCLUDE overall_footer.html -->
diff --git a/phpBB/styles/prosilver/template/ucp_pm_history.html b/phpBB/styles/prosilver/template/ucp_pm_history.html
index e97befc552..b53eb0c7ec 100644
--- a/phpBB/styles/prosilver/template/ucp_pm_history.html
+++ b/phpBB/styles/prosilver/template/ucp_pm_history.html
@@ -6,10 +6,8 @@
<!-- EVENT ucp_pm_history_review_before -->
<div id="topicreview" class="topicreview">
- <script type="text/javascript">
- // <![CDATA[
+ <script>
bbcodeEnabled = {S_BBCODE_ALLOWED};
- // ]]>
</script>
<!-- BEGIN history_row -->
<div class="post <!-- IF history_row.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
@@ -38,7 +36,7 @@
<p class="author">
<span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{history_row.MINI_POST}</span></span> {L_SENT_AT}{L_COLON} <strong>{history_row.SENT_DATE}</strong>
<br />
- {L_MESSAGE_BY_AUTHOR} {history_row.MESSAGE_AUTHOR_FULL}
+ {L_MESSAGE_BY_AUTHOR} <!-- EVENT ucp_pm_history_row_message_author_username_prepend -->{history_row.MESSAGE_AUTHOR_FULL}<!-- EVENT ucp_pm_history_row_message_author_username_append -->
</p>
<div class="content"><!-- IF history_row.MESSAGE -->{history_row.MESSAGE}<!-- ELSE --><span class="error">{L_MESSAGE_REMOVED_FROM_OUTBOX}</span><!-- ENDIF --></div>
<div id="message_{history_row.MSG_ID}" style="display: none;">{history_row.DECODED_MESSAGE}</div>
@@ -56,4 +54,3 @@
<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i><span>{L_BACK_TO_TOP}</span>
</a>
</p>
-
diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
index 4295867c05..7cb44a0189 100644
--- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
+++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage.html
@@ -91,28 +91,28 @@
<!-- IF U_EDIT -->
<li>
<a href="{U_EDIT}" title="{L_POST_EDIT_PM}" class="button button-icon-only">
- <i class="icon fa-pencil fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_EDIT_PM}</span>
+ <i class="icon fa-pencil fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_EDIT}</span>
</a>
</li>
<!-- ENDIF -->
<!-- IF U_DELETE -->
<li>
<a href="{U_DELETE}" title="{L_DELETE_MESSAGE}" class="button button-icon-only">
- <i class="icon fa-times fa-fw" aria-hidden="true"></i><span class="sr-only">{L_DELETE_MESSAGE}</span>
+ <i class="icon fa-times fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_DELETE}</span>
</a>
</li>
<!-- ENDIF -->
<!-- IF U_REPORT -->
<li>
<a href="{U_REPORT}" title="{L_REPORT_PM}" class="button button-icon-only">
- <i class="icon fa-exclamation fa-fw" aria-hidden="true"></i><span class="sr-only">{L_REPORT_PM}</span>
+ <i class="icon fa-exclamation fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_REPORT}</span>
</a>
</li>
<!-- ENDIF -->
<!-- IF U_QUOTE -->
<li>
<a href="{U_QUOTE}" title="{L_POST_QUOTE_PM}" class="button button-icon-only">
- <i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_QUOTE_PM}</span>
+ <i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_QUOTE}</span>
</a>
</li>
<!-- ENDIF -->
@@ -124,8 +124,8 @@
<p class="author">
<strong>{L_SENT_AT}{L_COLON}</strong> {SENT_DATE}
<br /><strong>{L_PM_FROM}{L_COLON}</strong> {MESSAGE_AUTHOR_FULL}
- <!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}{L_COLON}</strong> <!-- BEGIN to_recipient --><!-- IF to_recipient.NAME_FULL -->{to_recipient.NAME_FULL}<!-- ELSE --><a href="{to_recipient.U_VIEW}" style="color:<!-- IF to_recipient.COLOUR -->{to_recipient.COLOUR}<!-- ELSEIF to_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{to_recipient.NAME}</a><!-- ENDIF -->&nbsp;<!-- END to_recipient --><!-- ENDIF -->
- <!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}{L_COLON}</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}" style="color:<!-- IF bcc_recipient.COLOUR -->{bcc_recipient.COLOUR}<!-- ELSEIF bcc_recipient.IS_GROUP -->#0000FF<!-- ENDIF -->;">{bcc_recipient.NAME}</a><!-- ENDIF -->&nbsp;<!-- END bcc_recipient --><!-- ENDIF -->
+ <!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}{L_COLON}</strong> <!-- BEGIN to_recipient --><!-- IF to_recipient.NAME_FULL -->{to_recipient.NAME_FULL}<!-- ELSE --><a href="{to_recipient.U_VIEW}"<!-- IF to_recipient.COLOUR --> style="color:{to_recipient.COLOUR};"<!-- ENDIF -->><strong>{to_recipient.NAME}</strong></a><!-- ENDIF -->&nbsp;<!-- END to_recipient --><!-- ENDIF -->
+ <!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}{L_COLON}</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}"<!-- IF bcc_recipient.COLOUR --> style="color:{bcc_recipient.COLOUR};"<!-- ENDIF -->><strong>{bcc_recipient.NAME}</strong></a><!-- ENDIF -->&nbsp;<!-- END bcc_recipient --><!-- ENDIF -->
</p>
diff --git a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
index 9377eeb9f5..41ff5b898a 100644
--- a/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
+++ b/phpBB/styles/prosilver/template/ucp_pm_viewmessage_print.html
@@ -8,6 +8,7 @@
<title>{SITENAME} &bull; {PAGE_TITLE}</title>
<link href="{T_THEME_PATH}/print.css" rel="stylesheet">
+<link href="{T_THEME_PATH}/bidi.css" rel="stylesheet">
<!-- EVENT ucp_pm_viewmessage_print_head_append -->
</head>
<body id="phpbb">
@@ -41,7 +42,14 @@
<div id="page-footer" class="page-footer">
<div class="page-number">{S_TIMEZONE}<br />{PAGE_NUMBER}</div>
- <div class="copyright">Powered by phpBB&reg; Forum Software &copy; phpBB Limited<br />https://www.phpbb.com/</div>
+ <div class="copyright">
+ <p>{{ CREDIT_LINE }}
+ </p>
+ {% if TRANSLATION_INFO %}
+ <p>{{ TRANSLATION_INFO }}
+ </p>
+ {% endif %}
+ </div>
</div>
</div>
diff --git a/phpBB/styles/prosilver/template/ucp_prefs_personal.html b/phpBB/styles/prosilver/template/ucp_prefs_personal.html
index 4cd9f6655b..1650705d4b 100644
--- a/phpBB/styles/prosilver/template/ucp_prefs_personal.html
+++ b/phpBB/styles/prosilver/template/ucp_prefs_personal.html
@@ -85,8 +85,7 @@
</fieldset>
</form>
-<script type="text/javascript">
-// <![CDATA[
+<script>
var date_format = '{A_DATE_FORMAT}';
var default_dateformat = '{A_DEFAULT_DATEFORMAT}';
@@ -118,7 +117,6 @@
}
window.onload = customDates;
-// ]]>
</script>
<!-- INCLUDE ucp_footer.html -->
diff --git a/phpBB/styles/prosilver/template/ucp_profile_signature.html b/phpBB/styles/prosilver/template/ucp_profile_signature.html
index 614f6f440d..ed28b7ab02 100644
--- a/phpBB/styles/prosilver/template/ucp_profile_signature.html
+++ b/phpBB/styles/prosilver/template/ucp_profile_signature.html
@@ -24,6 +24,7 @@
<!-- INCLUDE posting_editor.html -->
<h3>{L_OPTIONS}</h3>
<fieldset>
+ {% EVENT ucp_profile_signature_posting_editor_options_prepend %}
<!-- IF S_BBCODE_ALLOWED -->
<div><label for="disable_bbcode"><input type="checkbox" name="disable_bbcode" id="disable_bbcode"{S_BBCODE_CHECKED} /> {L_DISABLE_BBCODE}</label></div>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/ucp_register.html b/phpBB/styles/prosilver/template/ucp_register.html
index 38413addba..bf39990c35 100644
--- a/phpBB/styles/prosilver/template/ucp_register.html
+++ b/phpBB/styles/prosilver/template/ucp_register.html
@@ -1,7 +1,6 @@
<!-- INCLUDE overall_header.html -->
-<script type="text/javascript">
-// <![CDATA[
+<script>
/**
* Change language
*/
@@ -11,7 +10,6 @@
document.forms['register'].change_lang.value = lang_iso;
document.forms['register'].submit.click();
}
-// ]]>
</script>
<form id="register" method="post" action="{S_UCP_ACTION}"{S_FORM_ENCTYPE}>
diff --git a/phpBB/styles/prosilver/template/ucp_remind.html b/phpBB/styles/prosilver/template/ucp_remind.html
index 0ab1251d9e..8b700de430 100644
--- a/phpBB/styles/prosilver/template/ucp_remind.html
+++ b/phpBB/styles/prosilver/template/ucp_remind.html
@@ -9,14 +9,19 @@
<h2>{L_SEND_PASSWORD}</h2>
<fieldset>
+ {% if USERNAME_REQUIRED %}
+ <p class="error">{{ lang('EMAIL_NOT_UNIQUE') }}</p>
+ {% endif %}
<dl>
- <dt><label for="username">{L_USERNAME}{L_COLON}</label></dt>
- <dd><input class="inputbox narrow" type="text" name="username" id="username" size="25" /></dd>
+ <dt><label for="email">{L_EMAIL_ADDRESS}{L_COLON}</label><br /><span>{L_EMAIL_REMIND}</span></dt>
+ <dd><input class="inputbox narrow" type="email" name="email" id="email" size="25" maxlength="100" value="{{ EMAIL }}" autofocus /></dd>
</dl>
+ {% if USERNAME_REQUIRED %}
<dl>
- <dt><label for="email">{L_EMAIL_ADDRESS}{L_COLON}</label><br /><span>{L_EMAIL_REMIND}</span></dt>
- <dd><input class="inputbox narrow" type="email" name="email" id="email" size="25" maxlength="100" /></dd>
+ <dt><label for="username">{L_USERNAME}{L_COLON}</label></dt>
+ <dd><input class="inputbox narrow" type="text" name="username" id="username" size="25" /></dd>
</dl>
+ {% endif %}
<dl>
<dt>&nbsp;</dt>
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="submit" id="submit" class="button1" value="{L_SUBMIT}" tabindex="2" />&nbsp; <input type="reset" value="{L_RESET}" name="reset" class="button2" /></dd>
diff --git a/phpBB/styles/prosilver/template/viewforum_body.html b/phpBB/styles/prosilver/template/viewforum_body.html
index b7093cbac5..40beb784d7 100644
--- a/phpBB/styles/prosilver/template/viewforum_body.html
+++ b/phpBB/styles/prosilver/template/viewforum_body.html
@@ -114,6 +114,7 @@
<dd><input type="submit" name="login" tabindex="5" value="{L_LOGIN}" class="button1" /></dd>
</dl>
{S_LOGIN_REDIRECT}
+ {S_FORM_TOKEN_LOGIN}
</fieldset>
</div>
@@ -156,7 +157,7 @@
<li class="row<!-- IF topicrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_POST_GLOBAL --> global-announce<!-- ENDIF --><!-- IF topicrow.S_POST_ANNOUNCE --> announce<!-- ENDIF --><!-- IF topicrow.S_POST_STICKY --> sticky<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
<!-- EVENT viewforum_body_topic_row_prepend -->
<dl class="row-item {topicrow.TOPIC_IMG_STYLE}">
- <dt<!-- IF topicrow.TOPIC_ICON_IMG and S_TOPIC_ICONS --> style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF --> title="{topicrow.TOPIC_FOLDER_IMG_ALT}">
+ <dt<!-- IF topicrow.TOPIC_ICON_IMG and S_TOPIC_ICONS --> style="background-image: url('{T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}'); background-repeat: no-repeat;"<!-- ENDIF --> title="{topicrow.TOPIC_FOLDER_IMG_ALT}">
<!-- IF topicrow.S_UNREAD_TOPIC and not S_IS_BOT --><a href="{topicrow.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
<div class="list-inner">
<!-- EVENT topiclist_row_prepend -->
@@ -165,10 +166,10 @@
<i class="icon fa-file fa-fw icon-red icon-md" aria-hidden="true"></i><span class="sr-only">{NEW_POST}</span>
</a>
<!-- ENDIF -->
- <a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
+ <!-- IF topicrow.U_VIEW_TOPIC --><a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a><!-- ELSE -->{topicrow.TOPIC_TITLE}<!-- ENDIF -->
<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED -->
- <a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
- <i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_UNAPPROVED}</span>
+ <a href="{topicrow.U_MCP_QUEUE}" title="<!-- IF topicrow.S_TOPIC_UNAPPROVED -->{L_TOPIC_UNAPPROVED}<!-- ELSE -->{L_POSTS_UNAPPROVED}<!-- ENDIF -->">
+ <i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only"><!-- IF topicrow.S_TOPIC_UNAPPROVED -->{L_TOPIC_UNAPPROVED}<!-- ELSE -->{L_POSTS_UNAPPROVED}<!-- ENDIF --></span>
</a>
<!-- ENDIF -->
<!-- IF topicrow.S_TOPIC_DELETED -->
@@ -186,7 +187,7 @@
<!-- IF not S_IS_BOT -->
<div class="responsive-show" style="display: none;">
- {L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} &laquo; <a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}"><time datetime="{topicrow.LAST_POST_TIME_RFC3339}">{topicrow.LAST_POST_TIME}</time></a>
+ {L_LAST_POST} {L_POST_BY_AUTHOR} <!-- EVENT viewforum_body_last_post_author_username_prepend -->{topicrow.LAST_POST_AUTHOR_FULL}<!-- EVENT viewforum_body_last_post_author_username_append --> &laquo; <a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}"><time datetime="{topicrow.LAST_POST_TIME_RFC3339}">{topicrow.LAST_POST_TIME}</time></a>
<!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --><br />{L_POSTED} {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF -->
</div>
<!-- IF topicrow.REPLIES -->
@@ -197,7 +198,9 @@
<div class="topic-poster responsive-hide left-box">
<!-- IF topicrow.S_HAS_POLL --><i class="icon fa-bar-chart fa-fw" aria-hidden="true"></i><!-- ENDIF -->
<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i><!-- ENDIF -->
- {L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} &raquo; <time datetime="{topicrow.FIRST_POST_TIME_RFC3339}">{topicrow.FIRST_POST_TIME}</time>
+ {% EVENT topiclist_row_topic_by_author_before %}
+ {L_POST_BY_AUTHOR} <!-- EVENT viewforum_body_topic_author_username_prepend -->{topicrow.TOPIC_AUTHOR_FULL}<!-- EVENT viewforum_body_topic_author_username_append --> &raquo; <time datetime="{topicrow.FIRST_POST_TIME_RFC3339}">{topicrow.FIRST_POST_TIME}</time>
+ {% EVENT topiclist_row_topic_by_author_after %}
<!-- IF topicrow.S_POST_GLOBAL and FORUM_ID != topicrow.FORUM_ID --> &raquo; {L_IN} <a href="{topicrow.U_VIEW_FORUM}">{topicrow.FORUM_NAME}</a><!-- ENDIF -->
</div>
@@ -223,8 +226,8 @@
<dd class="posts">{topicrow.REPLIES} <dfn>{L_REPLIES}</dfn></dd>
<dd class="views">{topicrow.VIEWS} <dfn>{L_VIEWS}</dfn></dd>
<dd class="lastpost">
- <span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}
- <!-- IF not S_IS_BOT -->
+ <span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} <!-- EVENT viewforum_body_last_post_author_username_prepend -->{topicrow.LAST_POST_AUTHOR_FULL}<!-- EVENT viewforum_body_last_post_author_username_append -->
+ <!-- IF not S_IS_BOT and topicrow.U_LAST_POST -->
<a href="{topicrow.U_LAST_POST}" title="{L_GOTO_LAST_POST}">
<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{VIEW_LATEST_POST}</span>
</a>
@@ -250,10 +253,10 @@
<strong>{L_NO_TOPICS}</strong>
</div>
</div>
- <!-- ELSE IF not S_USER_CAN_POST -->
+ <!-- ELSE IF not S_HAS_SUBFORUM -->
<div class="panel">
<div class="inner">
- <strong>{L_NO_FORUMS}</strong>
+ <strong>{L_NO_FORUMS_IN_CATEGORY}</strong>
</div>
</div>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/template/viewonline_body.html b/phpBB/styles/prosilver/template/viewonline_body.html
index dd0ca72502..c019977179 100644
--- a/phpBB/styles/prosilver/template/viewonline_body.html
+++ b/phpBB/styles/prosilver/template/viewonline_body.html
@@ -29,7 +29,7 @@
<tbody>
<!-- BEGIN user_row -->
<tr class="<!-- IF user_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
- <td>{user_row.USERNAME_FULL}<!-- IF user_row.USER_IP --> <span style="float: {S_CONTENT_FLOW_END};">{L_IP}{L_COLON} <a href="{user_row.U_USER_IP}">{user_row.USER_IP}</a> &#187; <a href="{user_row.U_WHOIS}" onclick="popup(this.href, 750, 500); return false;">{L_WHOIS}</a></span><!-- ENDIF -->
+ <td><!-- EVENT viewonline_body_username_prepend -->{user_row.USERNAME_FULL}<!-- EVENT viewonline_body_username_append --><!-- IF user_row.USER_IP --> <span style="float: {S_CONTENT_FLOW_END};">{L_IP}{L_COLON} <a href="{user_row.U_USER_IP}">{user_row.USER_IP}</a> &#187; <a href="{user_row.U_WHOIS}" onclick="popup(this.href, 750, 500); return false;">{L_WHOIS}</a></span><!-- ENDIF -->
<!-- IF user_row.USER_BROWSER --><br />{user_row.USER_BROWSER}<!-- ENDIF --></td>
<td class="info"><a href="{user_row.U_FORUM_LOCATION}">{user_row.FORUM_LOCATION}</a></td>
<td class="active">{user_row.LASTUPDATE}</td>
diff --git a/phpBB/styles/prosilver/template/viewtopic_body.html b/phpBB/styles/prosilver/template/viewtopic_body.html
index 0de641c985..f77b99dc29 100644
--- a/phpBB/styles/prosilver/template/viewtopic_body.html
+++ b/phpBB/styles/prosilver/template/viewtopic_body.html
@@ -242,35 +242,35 @@
<!-- IF postrow.U_DELETE -->
<li>
<a href="{postrow.U_DELETE}" title="{L_DELETE_POST}" class="button button-icon-only">
- <i class="icon fa-times fa-fw" aria-hidden="true"></i><span class="sr-only">{L_DELETE_POST}</span>
+ <i class="icon fa-times fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_DELETE}</span>
</a>
</li>
<!-- ENDIF -->
<!-- IF postrow.U_REPORT -->
<li>
<a href="{postrow.U_REPORT}" title="{L_REPORT_POST}" class="button button-icon-only">
- <i class="icon fa-exclamation fa-fw" aria-hidden="true"></i><span class="sr-only">{L_REPORT_POST}</span>
+ <i class="icon fa-exclamation fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_REPORT}</span>
</a>
</li>
<!-- ENDIF -->
<!-- IF postrow.U_WARN -->
<li>
<a href="{postrow.U_WARN}" title="{L_WARN_USER}" class="button button-icon-only">
- <i class="icon fa-exclamation-triangle fa-fw" aria-hidden="true"></i><span class="sr-only">{L_WARN_USER}</span>
+ <i class="icon fa-exclamation-triangle fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_WARN}</span>
</a>
</li>
<!-- ENDIF -->
<!-- IF postrow.U_INFO -->
<li>
<a href="{postrow.U_INFO}" title="{L_INFORMATION}" class="button button-icon-only">
- <i class="icon fa-info fa-fw" aria-hidden="true"></i><span class="sr-only">{L_INFORMATION}</span>
+ <i class="icon fa-info fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_INFORMATION}</span>
</a>
</li>
<!-- ENDIF -->
<!-- IF postrow.U_QUOTE -->
<li>
<a href="{postrow.U_QUOTE}" title="{L_REPLY_WITH_QUOTE}" class="button button-icon-only">
- <i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_QUOTE}</span>
+ <i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_BUTTON_QUOTE}</span>
</a>
</li>
<!-- ENDIF -->
@@ -326,6 +326,8 @@
<div class="content">{postrow.MESSAGE}</div>
+ <!-- EVENT viewtopic_body_postrow_content_after -->
+
<!-- IF postrow.S_HAS_ATTACHMENTS -->
<dl class="attachbox">
<dt>
diff --git a/phpBB/styles/prosilver/template/viewtopic_print.html b/phpBB/styles/prosilver/template/viewtopic_print.html
index 3c1ed4c3f1..658062f9fd 100644
--- a/phpBB/styles/prosilver/template/viewtopic_print.html
+++ b/phpBB/styles/prosilver/template/viewtopic_print.html
@@ -8,9 +8,10 @@
<title>{SITENAME} &bull; {PAGE_TITLE}</title>
<link href="{T_THEME_PATH}/print.css" rel="stylesheet">
+<link href="{T_THEME_PATH}/bidi.css" rel="stylesheet">
<!-- EVENT viewtopic_print_head_append -->
</head>
-<body id="phpbb">
+<body id="phpbb" class="{S_CONTENT_DIRECTION}">
<div id="wrap" class="wrap">
<a id="top" class="top-anchor" accesskey="t"></a>
@@ -37,7 +38,14 @@
<div id="page-footer" class="page-footer">
<div class="page-number">{S_TIMEZONE}<br />{PAGE_NUMBER}</div>
- <div class="copyright">Powered by phpBB&reg; Forum Software &copy; phpBB Limited<br />https://www.phpbb.com/</div>
+ <div class="copyright">
+ <p>{{ CREDIT_LINE }}
+ </p>
+ {% if TRANSLATION_INFO %}
+ <p>{{ TRANSLATION_INFO }}
+ </p>
+ {% endif %}
+ </div>
</div>
</div>
diff --git a/phpBB/styles/prosilver/template/viewtopic_topic_tools.html b/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
index 397c807bb3..272a434f6a 100644
--- a/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
+++ b/phpBB/styles/prosilver/template/viewtopic_topic_tools.html
@@ -11,7 +11,7 @@
<!-- IF U_WATCH_TOPIC -->
<li>
<a href="{U_WATCH_TOPIC}" class="watch-topic-link" title="{S_WATCH_TOPIC_TITLE}" data-ajax="toggle_link" data-toggle-class="icon <!-- IF S_WATCHING_TOPIC -->fa-check-square-o<!-- ELSE -->fa-square-o<!-- ENDIF --> fa-fw" data-toggle-text="{S_WATCH_TOPIC_TOGGLE}" data-toggle-url="{U_WATCH_TOPIC_TOGGLE}" data-update-all=".watch-topic-link">
- <i class="icon <!-- IF S_WATCHING_FORUM -->fa-square-o<!-- ELSE -->fa-check-square-o<!-- ENDIF --> fa-fw" aria-hidden="true"></i><span>{S_WATCH_TOPIC_TITLE}</span>
+ <i class="icon <!-- IF S_WATCHING_TOPIC -->fa-square-o<!-- ELSE -->fa-check-square-o<!-- ENDIF --> fa-fw" aria-hidden="true"></i><span>{S_WATCH_TOPIC_TITLE}</span>
</a>
</li>
<!-- ENDIF -->
diff --git a/phpBB/styles/prosilver/theme/bidi.css b/phpBB/styles/prosilver/theme/bidi.css
index 923ff3e792..79b769b1e7 100644
--- a/phpBB/styles/prosilver/theme/bidi.css
+++ b/phpBB/styles/prosilver/theme/bidi.css
@@ -239,6 +239,10 @@
/* Pagination
---------------------------------------- */
+.rtl .page-number {
+ float: left;
+}
+
.rtl .pagination {
text-align: left;
float: left;
@@ -451,6 +455,10 @@ li.breadcrumbs span:first-child > a {
/* Post body styles
----------------------------------------*/
+.rtl .date {
+ float: left;
+}
+
.rtl .postbody, .rtl .postbody h3 {
float: right;
}
diff --git a/phpBB/styles/prosilver/theme/common.css b/phpBB/styles/prosilver/theme/common.css
index 348355e8c4..a0dc5e043b 100644
--- a/phpBB/styles/prosilver/theme/common.css
+++ b/phpBB/styles/prosilver/theme/common.css
@@ -981,8 +981,15 @@ fieldset.fields1 dl.pmlist dd.recipients {
/* Miscellaneous styles
---------------------------------------- */
.copyright {
- padding: 5px;
+ font-size: 10px;
text-align: center;
+ padding: 10px;
+}
+
+.footer-row {
+ font-size: 10px;
+ line-height: 1.8;
+ margin: 0;
}
.small {
@@ -1267,6 +1274,10 @@ ul.linklist:after,
width: 50px;
}
+.dropdown .clone.hidden {
+ display: none;
+}
+
.dropdown .clone.hidden + li.separator {
display: none;
}
diff --git a/phpBB/styles/prosilver/theme/content.css b/phpBB/styles/prosilver/theme/content.css
index a071e63c69..807633864c 100644
--- a/phpBB/styles/prosilver/theme/content.css
+++ b/phpBB/styles/prosilver/theme/content.css
@@ -18,7 +18,7 @@ ul.topiclist dl {
}
ul.topiclist li.row dl {
- padding: 2px 0;
+ margin: 2px 0;
}
ul.topiclist dt, ul.topiclist dd {
@@ -70,6 +70,11 @@ ul.topiclist dd {
box-sizing: border-box;
}
+ul.topiclist li.row dd {
+ padding: 4px 0 999px 0;
+ margin-bottom: -995px;
+}
+
ul.topiclist dfn {
/* Labels for post/view counts */
position: absolute;
@@ -524,6 +529,7 @@ blockquote .codebox {
/* Attachments
----------------------------------------*/
.attachbox {
+ font-size: 13px;
float: left;
width: auto;
max-width: 100%;
diff --git a/phpBB/styles/prosilver/theme/cp.css b/phpBB/styles/prosilver/theme/cp.css
index d54c948343..0041417022 100644
--- a/phpBB/styles/prosilver/theme/cp.css
+++ b/phpBB/styles/prosilver/theme/cp.css
@@ -300,11 +300,14 @@ ol.def-rules li {
padding: 0 3px;
}
+/* DEPRECATED 3.2.6
.pmlist li.pm_message_reported_colour, .pm_message_reported_colour {
border-left-color: transparent;
border-right-color: transparent;
}
+*/
+.pmlist li.pm_message_reported_colour, .pm_message_reported_colour,
.pmlist li.pm_marked_colour, .pm_marked_colour,
.pmlist li.pm_replied_colour, .pm_replied_colour,
.pmlist li.pm_friend_colour, .pm_friend_colour,
diff --git a/phpBB/styles/prosilver/theme/plupload.css b/phpBB/styles/prosilver/theme/plupload.css
index f466803964..b1f3ae2da8 100644
--- a/phpBB/styles/prosilver/theme/plupload.css
+++ b/phpBB/styles/prosilver/theme/plupload.css
@@ -3,6 +3,10 @@
margin-bottom: 1em;
}
+.attach-row-tpl {
+ display: none;
+}
+
.file-list td {
vertical-align: middle;
}
diff --git a/phpBB/styles/prosilver/theme/print.css b/phpBB/styles/prosilver/theme/print.css
index a83270b742..9445279773 100644
--- a/phpBB/styles/prosilver/theme/print.css
+++ b/phpBB/styles/prosilver/theme/print.css
@@ -133,6 +133,8 @@ ol, ul {
/* Misc page elements */
div.spacer { clear: both; }
+code { display: block; }
+
/* Accessibility tweaks: Mozilla.org */
.skip_link { display: none; }
diff --git a/phpBB/styles/prosilver/theme/responsive.css b/phpBB/styles/prosilver/theme/responsive.css
index fcc11f1fc2..ca4054c27f 100644
--- a/phpBB/styles/prosilver/theme/responsive.css
+++ b/phpBB/styles/prosilver/theme/responsive.css
@@ -421,6 +421,7 @@
.column1, .column2, .left-box.profile-details {
float: none;
width: auto;
+ clear: both;
}
/* Polls
diff --git a/phpBB/ucp.php b/phpBB/ucp.php
index 7eca5ede62..96a3efea97 100644
--- a/phpBB/ucp.php
+++ b/phpBB/ucp.php
@@ -30,6 +30,12 @@ if (in_array($mode, array('login', 'login_link', 'logout', 'confirm', 'sendpassw
define('IN_LOGIN', true);
}
+if ($mode === 'delete_cookies')
+{
+ define('SKIP_CHECK_BAN', true);
+ define('SKIP_CHECK_DISABLED', true);
+}
+
// Start session management
$user->session_begin();
$auth->acl($user->data);
@@ -138,7 +144,7 @@ switch ($mode)
'AGREEMENT_TITLE' => $user->lang[$title],
'AGREEMENT_TEXT' => sprintf($user->lang[$message], $config['sitename'], generate_board_url()),
'U_BACK' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=login'),
- 'L_BACK' => $user->lang['BACK_TO_LOGIN'],
+ 'L_BACK' => $user->lang['BACK_TO_PREV'],
));
page_footer();
diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php
index 94309afc5a..a77c08cdd0 100644
--- a/phpBB/viewforum.php
+++ b/phpBB/viewforum.php
@@ -87,7 +87,7 @@ if (isset($_GET['e']) && !$user->data['is_registered'])
}
// Permissions check
-if (!$auth->acl_gets('f_list', 'f_read', $forum_id) || ($forum_data['forum_type'] == FORUM_LINK && $forum_data['forum_link'] && !$auth->acl_get('f_read', $forum_id)))
+if (!$auth->acl_gets('f_list', 'f_list_topics', 'f_read', $forum_id) || ($forum_data['forum_type'] == FORUM_LINK && $forum_data['forum_link'] && !$auth->acl_get('f_read', $forum_id)))
{
if ($user->data['user_id'] != ANONYMOUS)
{
@@ -161,7 +161,22 @@ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
$topics_count = $phpbb_content_visibility->get_count('forum_topics', $forum_data, $forum_id);
$start = $pagination->validate_start($start, $config['topics_per_page'], $topics_count);
-page_header($forum_data['forum_name'] . ($start ? ' - ' . $user->lang('PAGE_TITLE_NUMBER', $pagination->get_on_page($config['topics_per_page'], $start)) : ''), true, $forum_id);
+$page_title = $forum_data['forum_name'] . ($start ? ' - ' . $user->lang('PAGE_TITLE_NUMBER', $pagination->get_on_page($config['topics_per_page'], $start)) : '');
+
+/**
+* You can use this event to modify the page title of the viewforum page
+*
+* @event core.viewforum_modify_page_title
+* @var string page_title Title of the viewforum page
+* @var array forum_data Array with forum data
+* @var int forum_id The forum ID
+* @var int start Start offset used to calculate the page
+* @since 3.2.2-RC1
+*/
+$vars = array('page_title', 'forum_data', 'forum_id', 'start');
+extract($phpbb_dispatcher->trigger_event('core.viewforum_modify_page_title', compact($vars)));
+
+page_header($page_title, true, $forum_id);
$template->set_filenames(array(
'body' => 'viewforum_body.html')
@@ -181,7 +196,7 @@ if (!($forum_data['forum_type'] == FORUM_POST || (($forum_data['forum_flags'] &
// Ok, if someone has only list-access, we only display the forum list.
// We also make this circumstance available to the template in case we want to display a notice. ;)
-if (!$auth->acl_get('f_read', $forum_id))
+if (!$auth->acl_gets('f_read', 'f_list_topics', $forum_id))
{
$template->assign_vars(array(
'S_NO_READ_ACCESS' => true,
@@ -270,6 +285,20 @@ $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7
$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
$sort_by_sql = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 'LOWER(t.topic_title)', 'v' => 't.topic_views');
+/**
+ * Modify the topic ordering if needed
+ *
+ * @event core.viewforum_modify_topic_ordering
+ * @var array sort_by_text Topic ordering options
+ * @var array sort_by_sql Topic orderings options SQL equivalent
+ * @since 3.2.5-RC1
+ */
+$vars = array(
+ 'sort_by_text',
+ 'sort_by_sql',
+);
+extract($phpbb_dispatcher->trigger_event('core.viewforum_modify_topic_ordering', compact($vars)));
+
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);
@@ -385,7 +414,7 @@ $template->assign_vars(array(
'S_SELECT_SORT_DIR' => $s_sort_dir,
'S_SELECT_SORT_KEY' => $s_sort_key,
'S_SELECT_SORT_DAYS' => $s_limit_days,
- 'S_TOPIC_ICONS' => ($s_display_active && sizeof($active_forum_ary)) ? max($active_forum_ary['enable_icons']) : (($forum_data['enable_icons']) ? true : false),
+ 'S_TOPIC_ICONS' => ($s_display_active && count($active_forum_ary)) ? max($active_forum_ary['enable_icons']) : (($forum_data['enable_icons']) ? true : false),
'U_WATCH_FORUM_LINK' => $s_watching_forum['link'],
'U_WATCH_FORUM_TOGGLE' => $s_watching_forum['link_toggle'],
'S_WATCH_FORUM_TITLE' => $s_watching_forum['title'],
@@ -395,7 +424,7 @@ $template->assign_vars(array(
'S_DISPLAY_SEARCHBOX' => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
'S_SEARCHBOX_ACTION' => append_sid("{$phpbb_root_path}search.$phpEx"),
'S_SEARCH_LOCAL_HIDDEN_FIELDS' => build_hidden_fields($s_search_hidden_fields),
- 'S_SINGLE_MODERATOR' => (!empty($moderators[$forum_id]) && sizeof($moderators[$forum_id]) > 1) ? false : true,
+ 'S_SINGLE_MODERATOR' => (!empty($moderators[$forum_id]) && count($moderators[$forum_id]) > 1) ? false : true,
'S_IS_LOCKED' => ($forum_data['forum_status'] == ITEM_LOCKED) ? true : false,
'S_VIEWFORUM' => true,
@@ -465,7 +494,7 @@ if ($user->data['is_registered'])
$sql_array['LEFT_JOIN'][] = array('FROM' => array(TOPICS_TRACK_TABLE => 'tt'), 'ON' => 'tt.topic_id = t.topic_id AND tt.user_id = ' . $user->data['user_id']);
$sql_array['SELECT'] .= ', tt.mark_time';
- if ($s_display_active && sizeof($active_forum_ary))
+ if ($s_display_active && count($active_forum_ary))
{
$sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.forum_id = t.forum_id AND ft.user_id = ' . $user->data['user_id']);
$sql_array['SELECT'] .= ', ft.mark_time AS forum_mark_time';
@@ -491,7 +520,7 @@ if ($forum_data['forum_type'] == FORUM_POST)
'WHERE' => '(t.forum_id = ' . $forum_id . '
AND t.topic_type = ' . POST_ANNOUNCE . ') OR
- (' . $db->sql_in_set('t.forum_id', $g_forum_ary) . '
+ (' . $db->sql_in_set('t.forum_id', $g_forum_ary, false, true) . '
AND t.topic_type = ' . POST_GLOBAL . ')',
'ORDER_BY' => 't.topic_time DESC',
@@ -523,7 +552,7 @@ if ($forum_data['forum_type'] == FORUM_POST)
while ($row = $db->sql_fetchrow($result))
{
- if ($row['topic_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id']))
+ if (!$phpbb_content_visibility->is_visible('topic', $row['forum_id'], $row))
{
// Do not display announcements that are waiting for approval or soft deleted.
continue;
@@ -573,8 +602,8 @@ if ($start > $topics_count / 2)
// Select the sort order
$direction = (($sort_dir == 'd') ? 'ASC' : 'DESC');
- $sql_limit = $pagination->reverse_limit($start, $sql_limit, $topics_count - sizeof($announcement_list));
- $sql_start = $pagination->reverse_start($start, $sql_limit, $topics_count - sizeof($announcement_list));
+ $sql_limit = $pagination->reverse_limit($start, $sql_limit, $topics_count - count($announcement_list));
+ $sql_start = $pagination->reverse_start($start, $sql_limit, $topics_count - count($announcement_list));
}
else
{
@@ -583,6 +612,18 @@ else
$sql_start = $start;
}
+/**
+ * Modify the topics sort ordering if needed
+ *
+ * @event core.viewforum_modify_sort_direction
+ * @var string direction Topics sort order
+ * @since 3.2.5-RC1
+ */
+$vars = array(
+ 'direction',
+);
+extract($phpbb_dispatcher->trigger_event('core.viewforum_modify_sort_direction', compact($vars)));
+
if (is_array($sort_by_sql[$sort_key]))
{
$sql_sort_order = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction;
@@ -592,7 +633,7 @@ else
$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction;
}
-if ($forum_data['forum_type'] == FORUM_POST || !sizeof($active_forum_ary))
+if ($forum_data['forum_type'] == FORUM_POST || !count($active_forum_ary))
{
$sql_where = 't.forum_id = ' . $forum_id;
}
@@ -603,7 +644,7 @@ else if (empty($active_forum_ary['exclude_forum_id']))
else
{
$get_forum_ids = array_diff($active_forum_ary['forum_id'], $active_forum_ary['exclude_forum_id']);
- $sql_where = (sizeof($get_forum_ids)) ? $db->sql_in_set('t.forum_id', $get_forum_ids) : 't.forum_id = ' . $forum_id;
+ $sql_where = (count($get_forum_ids)) ? $db->sql_in_set('t.forum_id', $get_forum_ids) : 't.forum_id = ' . $forum_id;
}
// Grab just the sorted topic ids
@@ -662,7 +703,7 @@ $db->sql_freeresult($result);
// For storing shadow topics
$shadow_topic_list = array();
-if (sizeof($topic_list))
+if (count($topic_list))
{
// SQL array for obtaining topics/stickies
$sql_array = array(
@@ -692,7 +733,7 @@ if (sizeof($topic_list))
}
// If we have some shadow topics, update the rowset to reflect their topic information
-if (sizeof($shadow_topic_list))
+if (count($shadow_topic_list))
{
// SQL array for obtaining shadow topics
$sql_array = array(
@@ -732,7 +773,7 @@ if (sizeof($shadow_topic_list))
}
// Do not include those topics the user has no permission to access
- if (!$auth->acl_get('f_read', $row['forum_id']))
+ if (!$auth->acl_gets('f_read', 'f_list_topics', $row['forum_id']))
{
// We need to remove any trace regarding this topic. :)
unset($rowset[$orig_topic_id]);
@@ -767,7 +808,7 @@ if ($s_display_active)
// We need to remove the global announcements from the forums total topic count,
// otherwise the number is different from the one on the forum list
-$total_topic_count = $topics_count - sizeof($announcement_list);
+$total_topic_count = $topics_count - count($announcement_list);
$base_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : ''));
$pagination->generate_template_pagination($base_url, 'pagination', 'start', $total_topic_count, $config['topics_per_page'], $start);
@@ -794,7 +835,7 @@ $vars = array('topic_list', 'rowset', 'total_topic_count', 'forum_id');
extract($phpbb_dispatcher->trigger_event('core.viewforum_modify_topics_data', compact($vars)));
// Okay, lets dump out the page ...
-if (sizeof($topic_list))
+if (count($topic_list))
{
$mark_forum_read = true;
$mark_time_forum = 0;
@@ -875,7 +916,7 @@ if (sizeof($topic_list))
// Generate all the URIs ...
$view_topic_url_params = 'f=' . $row['forum_id'] . '&amp;t=' . $topic_id;
- $view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params);
+ $view_topic_url = $auth->acl_get('f_read', $forum_id) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params) : false;
$topic_unapproved = (($row['topic_visibility'] == ITEM_UNAPPROVED || $row['topic_visibility'] == ITEM_REAPPROVE) && $auth->acl_get('m_approve', $row['forum_id']));
$posts_unapproved = ($row['topic_visibility'] == ITEM_APPROVED && $row['topic_posts_unapproved'] && $auth->acl_get('m_approve', $row['forum_id']));
@@ -932,8 +973,8 @@ if (sizeof($topic_list))
'S_TOPIC_LOCKED' => ($row['topic_status'] == ITEM_LOCKED) ? true : false,
'S_TOPIC_MOVED' => ($row['topic_status'] == ITEM_MOVED) ? true : false,
- 'U_NEWEST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params . '&amp;view=unread') . '#unread',
- 'U_LAST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params . '&amp;p=' . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'],
+ 'U_NEWEST_POST' => $auth->acl_get('f_read', $forum_id) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params . '&amp;view=unread') . '#unread' : false,
+ 'U_LAST_POST' => $auth->acl_get('f_read', $forum_id) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params . '&amp;p=' . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'] : false,
'U_LAST_POST_AUTHOR' => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
'U_TOPIC_AUTHOR' => get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
'U_VIEW_TOPIC' => $view_topic_url,
@@ -1010,7 +1051,7 @@ extract($phpbb_dispatcher->trigger_event('core.viewforum_generate_page_after', c
// on all topics (as we do in 2.0.x). It looks for unread or new topics, if it doesn't find
// any it updates the forum last read cookie. This requires that the user visit the forum
// after reading a topic
-if ($forum_data['forum_type'] == FORUM_POST && sizeof($topic_list) && $mark_forum_read)
+if ($forum_data['forum_type'] == FORUM_POST && count($topic_list) && $mark_forum_read)
{
update_forum_tracking_info($forum_id, $forum_data['forum_last_post_time'], false, $mark_time_forum);
}
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php
index a1dc60955c..e49959b3b5 100644
--- a/phpBB/viewtopic.php
+++ b/phpBB/viewtopic.php
@@ -32,7 +32,7 @@ $topic_id = $request->variable('t', 0);
$post_id = $request->variable('p', 0);
$voted_id = $request->variable('vote_id', array('' => 0));
-$voted_id = (sizeof($voted_id) > 1) ? array_unique($voted_id) : $voted_id;
+$voted_id = (count($voted_id) > 1) ? array_unique($voted_id) : $voted_id;
$start = $request->variable('start', 0);
@@ -263,8 +263,26 @@ if (!$topic_data)
$forum_id = (int) $topic_data['forum_id'];
+/**
+ * Modify the forum ID to handle the correct display of viewtopic if needed
+ *
+ * @event core.viewtopic_modify_forum_id
+ * @var string forum_id forum ID
+ * @var array topic_data array of topic's data
+ * @since 3.2.5-RC1
+ */
+$vars = array(
+ 'forum_id',
+ 'topic_data',
+);
+extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_forum_id', compact($vars)));
+
+// If the request is missing the f parameter, the forum id in the user session data is 0 at the moment.
+// Let's fix that now so that the user can't hide from the forum's Who Is Online list.
+$user->page['forum'] = $forum_id;
+
// Now we know the forum_id and can check the permissions
-if ($topic_data['topic_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $forum_id))
+if (!$phpbb_content_visibility->is_visible('topic', $forum_id, $topic_data))
{
trigger_error('NO_TOPIC');
}
@@ -338,6 +356,12 @@ if (($topic_data['topic_type'] != POST_NORMAL) && $topic_data['topic_time_limit'
// Setup look and feel
$user->setup('viewtopic', $topic_data['forum_style']);
+if ($view == 'print' && !$auth->acl_get('f_print', $forum_id))
+{
+ send_status_line(403, 'Forbidden');
+ trigger_error('NO_AUTH_PRINT_TOPIC');
+}
+
$overrides_f_read_check = false;
$overrides_forum_password_check = false;
$topic_tracking_info = isset($topic_tracking_info) ? $topic_tracking_info : null;
@@ -429,6 +453,38 @@ $join_user_sql = array('a' => true, 't' => false, 's' => false);
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
+/**
+* Event to add new sorting options
+*
+* @event core.viewtopic_gen_sort_selects_before
+* @var array limit_days Limit results by time
+* @var array sort_by_text Language strings for sorting options
+* @var array sort_by_sql SQL conditions for sorting options
+* @var array join_user_sql SQL joins required for sorting options
+* @var int sort_days User selected sort days
+* @var string sort_key User selected sort key
+* @var string sort_dir User selected sort direction
+* @var string s_limit_days Initial value of limit days selectbox
+* @var string s_sort_key Initial value of sort key selectbox
+* @var string s_sort_dir Initial value of sort direction selectbox
+* @var string u_sort_param Initial value of sorting form action
+* @since 3.2.8-RC1
+*/
+$vars = array(
+ 'limit_days',
+ 'sort_by_text',
+ 'sort_by_sql',
+ 'join_user_sql',
+ 'sort_days',
+ 'sort_key',
+ 'sort_dir',
+ 's_limit_days',
+ 's_sort_key',
+ 's_sort_dir',
+ 'u_sort_param',
+);
+extract($phpbb_dispatcher->trigger_event('core.viewtopic_gen_sort_selects_before', compact($vars)));
+
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);
// Obtain correct post count and ordering SQL if user has
@@ -736,7 +792,7 @@ $template->assign_vars(array(
'TOTAL_POSTS' => $user->lang('VIEW_TOPIC_POSTS', (int) $total_posts),
'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=topic_view&amp;f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start") . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : ''), true, $user->session_id) : '',
- 'MODERATORS' => (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]) : '',
+ 'MODERATORS' => (isset($forum_moderators[$forum_id]) && count($forum_moderators[$forum_id])) ? implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]) : '',
'POST_IMG' => ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'),
'QUOTE_IMG' => $user->img('icon_post_quote', 'REPLY_WITH_QUOTE'),
@@ -759,7 +815,7 @@ $template->assign_vars(array(
'S_SELECT_SORT_DIR' => $s_sort_dir,
'S_SELECT_SORT_KEY' => $s_sort_key,
'S_SELECT_SORT_DAYS' => $s_limit_days,
- 'S_SINGLE_MODERATOR' => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,
+ 'S_SINGLE_MODERATOR' => (!empty($forum_moderators[$forum_id]) && count($forum_moderators[$forum_id]) > 1) ? false : true,
'S_TOPIC_ACTION' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start")),
'S_MOD_ACTION' => $s_quickmod_action,
@@ -776,7 +832,7 @@ $template->assign_vars(array(
'U_TOPIC' => "{$server_path}viewtopic.$phpEx?f=$forum_id&amp;t=$topic_id",
'U_FORUM' => $server_path,
- 'U_VIEW_TOPIC' => $viewtopic_url,
+ 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start") . (strlen($u_sort_param) ? "&amp;$u_sort_param" : '')),
'U_CANONICAL' => generate_board_url() . '/' . append_sid("viewtopic.$phpEx", "t=$topic_id" . (($start) ? "&amp;start=$start" : ''), true, ''),
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
'U_VIEW_OLDER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=previous"),
@@ -852,9 +908,9 @@ if (!empty($topic_data['poll_start']))
(($topic_data['poll_length'] != 0 && $topic_data['poll_start'] + $topic_data['poll_length'] > time()) || $topic_data['poll_length'] == 0) &&
$topic_data['topic_status'] != ITEM_LOCKED &&
$topic_data['forum_status'] != ITEM_LOCKED &&
- (!sizeof($cur_voted_id) ||
+ (!count($cur_voted_id) ||
($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']))) ? true : false;
- $s_display_results = (!$s_can_vote || ($s_can_vote && sizeof($cur_voted_id)) || $view == 'viewpoll') ? true : false;
+ $s_display_results = (!$s_can_vote || ($s_can_vote && count($cur_voted_id)) || $view == 'viewpoll') ? true : false;
/**
* Event to manipulate the poll data
@@ -889,16 +945,16 @@ if (!empty($topic_data['poll_start']))
if ($update && $s_can_vote)
{
- if (!sizeof($voted_id) || sizeof($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id) || !check_form_key('posting'))
+ if (!count($voted_id) || count($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id) || !check_form_key('posting'))
{
$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . (($start == 0) ? '' : "&amp;start=$start"));
meta_refresh(5, $redirect_url);
- if (!sizeof($voted_id))
+ if (!count($voted_id))
{
$message = 'NO_VOTE_OPTION';
}
- else if (sizeof($voted_id) > $topic_data['poll_max_options'])
+ else if (count($voted_id) > $topic_data['poll_max_options'])
{
$message = 'TOO_MANY_VOTE_OPTIONS';
}
@@ -992,8 +1048,31 @@ if (!empty($topic_data['poll_start']))
'user_votes' => array_flip($valid_user_votes),
'vote_counts' => $vote_counts,
'total_votes' => array_sum($vote_counts),
- 'can_vote' => !sizeof($valid_user_votes) || ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']),
+ 'can_vote' => !count($valid_user_votes) || ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']),
+ );
+
+ /**
+ * Event to manipulate the poll data sent by AJAX response
+ *
+ * @event core.viewtopic_modify_poll_ajax_data
+ * @var array data JSON response data
+ * @var array valid_user_votes Valid user votes
+ * @var array vote_counts Vote counts
+ * @var int forum_id Forum ID
+ * @var array topic_data Topic data
+ * @var array poll_info Array with the poll information
+ * @since 3.2.4-RC1
+ */
+ $vars = array(
+ 'data',
+ 'valid_user_votes',
+ 'vote_counts',
+ 'forum_id',
+ 'topic_data',
+ 'poll_info',
);
+ extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_poll_ajax_data', compact($vars)));
+
$json_response = new \phpbb\json_response();
$json_response->send($data);
}
@@ -1012,7 +1091,7 @@ if (!empty($topic_data['poll_start']))
$parse_flags = ($poll_info[0]['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
- for ($i = 0, $size = sizeof($poll_info); $i < $size; $i++)
+ for ($i = 0, $size = count($poll_info); $i < $size; $i++)
{
$poll_info[$i]['poll_option_text'] = generate_text_for_display($poll_info[$i]['poll_option_text'], $poll_info[$i]['bbcode_uid'], $poll_option['bbcode_bitfield'], $parse_flags, true);
}
@@ -1144,6 +1223,29 @@ $sql = 'SELECT p.post_id
" . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': '') . "
$limit_posts_time
ORDER BY $sql_sort_order";
+
+/**
+* Event to modify the SQL query that gets post_list
+*
+* @event core.viewtopic_modify_post_list_sql
+* @var string sql The SQL query to generate the post_list
+* @var int sql_limit The number of posts the query fetches
+* @var int sql_start The index the query starts to fetch from
+* @var string sort_key Key the posts are sorted by
+* @var string sort_days Display posts of previous x days
+* @var int forum_id Forum ID
+* @since 3.2.4-RC1
+*/
+$vars = array(
+ 'sql',
+ 'sql_limit',
+ 'sql_start',
+ 'sort_key',
+ 'sort_days',
+ 'forum_id',
+);
+extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_post_list_sql', compact($vars)));
+
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);
$i = ($store_reverse) ? $sql_limit - 1 : 0;
@@ -1154,7 +1256,7 @@ while ($row = $db->sql_fetchrow($result))
}
$db->sql_freeresult($result);
-if (!sizeof($post_list))
+if (!count($post_list))
{
if ($sort_days)
{
@@ -1478,7 +1580,7 @@ if ($config['load_cpf_viewtopic'])
}
// Generate online information for user
-if ($config['load_onlinetrack'] && sizeof($id_cache))
+if ($config['load_onlinetrack'] && count($id_cache))
{
$sql = 'SELECT session_user_id, MAX(session_time) as online_time, MIN(session_viewonline) AS viewonline
FROM ' . SESSIONS_TABLE . '
@@ -1496,7 +1598,7 @@ if ($config['load_onlinetrack'] && sizeof($id_cache))
unset($id_cache);
// Pull attachment data
-if (sizeof($attach_list))
+if (count($attach_list))
{
if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
{
@@ -1514,7 +1616,7 @@ if (sizeof($attach_list))
$db->sql_freeresult($result);
// No attachments exist, but post table thinks they do so go ahead and reset post_attach flags
- if (!sizeof($attachments))
+ if (!count($attachments))
{
$sql = 'UPDATE ' . POSTS_TABLE . '
SET post_attachment = 0
@@ -1522,7 +1624,7 @@ if (sizeof($attach_list))
$db->sql_query($sql);
// We need to update the topic indicator too if the complete topic is now without an attachment
- if (sizeof($rowset) != $total_posts)
+ if (count($rowset) != $total_posts)
{
// Not all posts are displayed so we query the db to find if there's any attachment for this topic
$sql = 'SELECT a.post_msg_id as post_id
@@ -1572,19 +1674,27 @@ if (sizeof($attach_list))
}
}
-// Get the list of users who can receive private messages
-$can_receive_pm_list = $auth->acl_get_list(array_keys($user_cache), 'u_readpm');
-$can_receive_pm_list = (empty($can_receive_pm_list) || !isset($can_receive_pm_list[0]['u_readpm'])) ? array() : $can_receive_pm_list[0]['u_readpm'];
+if ($config['enable_accurate_pm_button'])
+{
+ // Get the list of users who can receive private messages
+ $can_receive_pm_list = $auth->acl_get_list(array_keys($user_cache), 'u_readpm');
+ $can_receive_pm_list = (empty($can_receive_pm_list) || !isset($can_receive_pm_list[0]['u_readpm'])) ? array() : $can_receive_pm_list[0]['u_readpm'];
-// Get the list of permanently banned users
-$permanently_banned_users = phpbb_get_banned_user_ids(array_keys($user_cache), false);
+ // Get the list of permanently banned users
+ $permanently_banned_users = phpbb_get_banned_user_ids(array_keys($user_cache), false);
+}
+else
+{
+ $can_receive_pm_list = array_keys($user_cache);
+ $permanently_banned_users = [];
+}
-$i_total = sizeof($rowset) - 1;
+$i_total = count($rowset) - 1;
$prev_post_id = '';
$template->assign_vars(array(
'S_HAS_ATTACHMENTS' => $topic_data['topic_attachment'],
- 'S_NUM_POSTS' => sizeof($post_list))
+ 'S_NUM_POSTS' => count($post_list))
);
/**
@@ -1629,7 +1739,7 @@ extract($phpbb_dispatcher->trigger_event('core.viewtopic_modify_post_data', comp
// Output the posts
$first_unread = $post_unread = false;
-for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
+for ($i = 0, $end = count($post_list); $i < $end; ++$i)
{
// A non-existing rowset only happens if there was no user present for the entered poster_id
// This could be a broken posts table.
@@ -1672,7 +1782,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason'])
{
// Get usernames for all following posts if not already stored
- if (!sizeof($post_edit_list) && ($row['post_edit_reason'] || ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))))
+ if (!count($post_edit_list) && ($row['post_edit_reason'] || ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))))
{
// Remove all post_ids already parsed (we do not have to check them)
$post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i);
@@ -1736,7 +1846,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
if ($row['post_visibility'] == ITEM_DELETED && $row['post_delete_user'])
{
// Get usernames for all following posts if not already stored
- if (!sizeof($post_delete_list) && ($row['post_delete_reason'] || ($row['post_delete_user'] && !isset($user_cache[$row['post_delete_user']]))))
+ if (!count($post_delete_list) && ($row['post_delete_reason'] || ($row['post_delete_user'] && !isset($user_cache[$row['post_delete_user']]))))
{
// Remove all post_ids already parsed (we do not have to check them)
$post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i);
@@ -1980,7 +2090,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false,
- 'S_MULTIPLE_ATTACHMENTS' => !empty($attachments[$row['post_id']]) && sizeof($attachments[$row['post_id']]) > 1,
+ 'S_MULTIPLE_ATTACHMENTS' => !empty($attachments[$row['post_id']]) && count($attachments[$row['post_id']]) > 1,
'S_POST_UNAPPROVED' => ($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) ? true : false,
'S_POST_DELETED' => ($row['post_visibility'] == ITEM_DELETED) ? true : false,
'L_POST_DELETED_MESSAGE' => $l_deleted_message,
@@ -1989,8 +2099,9 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
'S_FRIEND' => ($row['friend']) ? true : false,
'S_UNREAD_POST' => $post_unread,
'S_FIRST_UNREAD' => $s_first_unread,
- 'S_CUSTOM_FIELDS' => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
+ 'S_CUSTOM_FIELDS' => (isset($cp_row['row']) && count($cp_row['row'])) ? true : false,
'S_TOPIC_POSTER' => ($topic_data['topic_poster'] == $poster_id) ? true : false,
+ 'S_FIRST_POST' => ($topic_data['topic_first_post_id'] == $row['post_id']) ? true : false,
'S_IGNORE_POST' => ($row['foe']) ? true : false,
'L_IGNORE_POST' => ($row['foe']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '',
@@ -2045,7 +2156,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
$i = $current_row_number;
- if (isset($cp_row['row']) && sizeof($cp_row['row']))
+ if (isset($cp_row['row']) && count($cp_row['row']))
{
$post_row = array_merge($post_row, $cp_row['row']);
}
@@ -2057,7 +2168,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
array(
'ID' => 'pm',
'NAME' => $user->lang['SEND_PRIVATE_MESSAGE'],
- 'U_CONTACT' => $u_pm,
+ 'U_CONTACT' => $post_row['U_PM'],
),
array(
'ID' => 'email',
@@ -2158,7 +2269,7 @@ if (isset($user->data['session_page']) && !$user->data['is_bot'] && (strpos($use
$db->sql_query($sql);
// Update the attachment download counts
- if (sizeof($update_count))
+ if (count($update_count))
{
$sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
SET download_count = download_count + 1
@@ -2237,7 +2348,6 @@ if ($s_can_vote || $s_quick_reply)
$qr_hidden_fields = array(
'topic_cur_post_id' => (int) $topic_data['topic_last_post_id'],
- 'lastclick' => (int) time(),
'topic_id' => (int) $topic_data['topic_id'],
'forum_id' => (int) $forum_id,
);
diff --git a/tests/RUNNING_TESTS.md b/tests/RUNNING_TESTS.md
index c9941d61e5..12ae7fa687 100644
--- a/tests/RUNNING_TESTS.md
+++ b/tests/RUNNING_TESTS.md
@@ -143,14 +143,14 @@ If you want all tests, run:
Functional tests
------------------
+================
Functional tests test software the way a user would. They simulate a user
browsing the website, but they do these steps in an automated way.
phpBB allows you to write such tests.
Running
-=======
+-------
Running the tests requires your phpBB3 repository to be accessible through a
local web server. You will need to supply the URL to the webserver in
@@ -170,6 +170,27 @@ If you only want the functional tests, run:
This will change your board's config.php file, but it makes a backup at
config_dev.php, so you can restore it after the test run is complete.
+UI tests
+========
+
+UI tests are functional tests that also support running JavaScript in a
+headless browser. These should be used when functionality that is only
+executed using JS needs to be tested. They require a running
+[PhantomJS WebDriver instance](http://phantomjs.org/). The executable can
+either be downloaded from [PhantomJS](http://phantomjs.org/download.html)
+or alternatively be installed with npm:
+
+ $ npm install -g phantomjs-prebuilt
+
+You might have to run the command as superuser / administrator on some
+systems. Afterwards, a new WebDriver instance can be started via command
+line:
+
+ $ phantomjs --webdriver=127.0.0.1:8910
+
+Port 8910 is the default port that will be used by UI tests to connect
+to the WebDriver instance.
+
More Information
================
diff --git a/tests/attachment/fixtures/resync.xml b/tests/attachment/fixtures/resync.xml
index 6e2cc62f68..af04701b4a 100644
--- a/tests/attachment/fixtures/resync.xml
+++ b/tests/attachment/fixtures/resync.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_attachments">
+ <column>attach_id</column>
<column>post_msg_id</column>
<column>topic_id</column>
<column>in_message</column>
@@ -11,6 +12,7 @@
<row>
<value>1</value>
<value>1</value>
+ <value>1</value>
<value>0</value>
<value>0</value>
<value>foo</value>
@@ -18,6 +20,7 @@
<value>0</value>
</row>
<row>
+ <value>2</value>
<value>1</value>
<value>1</value>
<value>1</value>
@@ -27,6 +30,7 @@
<value>0</value>
</row>
<row>
+ <value>3</value>
<value>1</value>
<value>1</value>
<value>1</value>
@@ -37,13 +41,16 @@
</row>
</table>
<table name="phpbb_extensions">
+ <column>extension_id</column>
<column>extension</column>
<column>group_id</column>
<row>
+ <value>1</value>
<value>jpg</value>
<value>1</value>
</row>
<row>
+ <value>2</value>
<value>png</value>
<value>1</value>
</row>
diff --git a/tests/avatar/manager_test.php b/tests/avatar/manager_test.php
index 9e826a3a59..d1e907b53d 100644
--- a/tests/avatar/manager_test.php
+++ b/tests/avatar/manager_test.php
@@ -99,7 +99,7 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
$this->config['allow_avatar_' . get_class($this->avatar_barfoo)] = false;
// Set up avatar manager
- $this->manager = new \phpbb\avatar\manager($this->config, $avatar_drivers, $phpbb_container);
+ $this->manager = new \phpbb\avatar\manager($this->config, $dispatcher, $avatar_drivers);
$this->db = $this->new_dbal();
$lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
$lang = new \phpbb\language\language($lang_loader);
@@ -185,7 +185,7 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
$avatar_settings = $this->manager->get_avatar_settings($this->avatar_foobar);
$expected_settings = array(
- 'allow_avatar_' . get_class($this->avatar_foobar) => array('lang' => 'ALLOW_' . strtoupper(get_class($this->avatar_foobar)), 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
+ 'allow_avatar_' . get_class($this->avatar_foobar) => array('lang' => 'ALLOW_' . strtoupper(get_class($this->avatar_foobar)), 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
);
$this->assertEquals($expected_settings, $avatar_settings);
diff --git a/tests/cache/apcu_driver_test.php b/tests/cache/apcu_driver_test.php
index 9de1d82a15..57f640c313 100644
--- a/tests/cache/apcu_driver_test.php
+++ b/tests/cache/apcu_driver_test.php
@@ -49,10 +49,27 @@ class phpbb_cache_apcu_driver_test extends phpbb_cache_common_test_case
protected function setUp()
{
+ global $phpbb_container, $phpbb_root_path;
+
parent::setUp();
+ $phpbb_container = new phpbb_mock_container_builder();
+ $phpbb_container->setParameter('core.cache_dir', $phpbb_root_path . 'cache/' . PHPBB_ENVIRONMENT . '/');
+
$this->driver = new \phpbb\cache\driver\apcu;
$this->driver->purge();
}
+
+ public function test_purge()
+ {
+ /* add a cache entry which does not match our key */
+ $foreign_key = 'test_' . $this->driver->key_prefix . 'test';
+ $this->assertSame(true, apcu_store($foreign_key, 0, 600));
+ $this->assertSame(true, apcu_exists($foreign_key));
+
+ parent::test_purge();
+
+ $this->assertSame(true, apcu_exists($foreign_key));
+ }
}
diff --git a/tests/cache/cache_memory.php b/tests/cache/cache_memory.php
index 806edb963a..565e9a48eb 100644
--- a/tests/cache/cache_memory.php
+++ b/tests/cache/cache_memory.php
@@ -18,7 +18,7 @@ class phpbb_cache_memory extends \phpbb\cache\driver\memory
/**
* Set cache path
*/
- function phpbb_cache_memory()
+ function __construct()
{
}
diff --git a/tests/cache/cache_memory_test.php b/tests/cache/cache_memory_test.php
index 9f92e8d8dc..ba1010bcf3 100644
--- a/tests/cache/cache_memory_test.php
+++ b/tests/cache/cache_memory_test.php
@@ -116,7 +116,7 @@ class phpbb_cache_memory_test extends phpbb_database_test_case
$results[] = $row;
}
$this->cache->sql_freeresult($query_id);
- $this->assertEquals($query[1], sizeof($results));
+ $this->assertEquals($query[1], count($results));
}
$this->cache->destroy('sql', $table);
diff --git a/tests/console/thumbnail_test.php b/tests/console/thumbnail_test.php
index 439e3623fa..e425d998a2 100644
--- a/tests/console/thumbnail_test.php
+++ b/tests/console/thumbnail_test.php
@@ -46,7 +46,7 @@ class phpbb_console_command_thumbnail_test extends phpbb_database_test_case
$config = $this->config = new \phpbb\config\config(array(
'img_min_thumb_filesize' => 2,
'img_max_thumb_width' => 2,
- 'img_imagick' => '',
+ 'upload_path' => 'files',
));
$this->db = $this->db = $this->new_dbal();
@@ -64,8 +64,8 @@ class phpbb_console_command_thumbnail_test extends phpbb_database_test_case
)));
$this->application = new Application();
- $this->application->add(new generate($this->user, $this->db, $this->cache, $this->phpbb_root_path, $this->phpEx));
- $this->application->add(new delete($this->user, $this->db, $this->phpbb_root_path));
+ $this->application->add(new generate($config, $this->user, $this->db, $this->cache, $this->phpbb_root_path, $this->phpEx));
+ $this->application->add(new delete($config, $this->user, $this->db, $this->phpbb_root_path));
$this->application->add(new recreate($this->user));
$phpbb_filesystem = new \phpbb\filesystem\filesystem();
diff --git a/tests/console/user/add_test.php b/tests/console/user/add_test.php
index 8641bf87b6..bdfb8a8d2a 100644
--- a/tests/console/user/add_test.php
+++ b/tests/console/user/add_test.php
@@ -14,12 +14,15 @@
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Tester\CommandTester;
use phpbb\console\command\user\add;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\Question;
require_once dirname(__FILE__) . '/base.php';
class phpbb_console_user_add_test extends phpbb_console_user_base
{
- public function get_command_tester()
+ public function get_command_tester($question_answers = [])
{
$application = new Application();
$application->add(new add(
@@ -34,7 +37,42 @@ class phpbb_console_user_add_test extends phpbb_console_user_base
$command = $application->find('user:add');
$this->command_name = $command->getName();
- $this->question = $command->getHelper('question');
+
+ if (!empty($question_answers))
+ {
+ $ask = function(InputInterface $input, OutputInterface $output, Question $question) use ($question_answers)
+ {
+ $text = $question->getQuestion();
+
+ // handle a question
+ foreach ($question_answers as $expected_question => $answer)
+ {
+ if (strpos($text, $expected_question) !== false)
+ {
+ $response = $answer;
+ }
+ }
+
+ if (!isset($response))
+ {
+ throw new \RuntimeException('Was asked for input on an unhandled question: ' . $text);
+ }
+
+ $output->writeln(print_r($response, true));
+ return $response;
+ };
+ $helper = $this->getMock('\Symfony\Component\Console\Helper\QuestionHelper', array('ask'));
+ $helper->expects($this->any())
+ ->method('ask')
+ ->will($this->returnCallback($ask));
+ $this->question = $helper;
+ $command->getHelperSet()->set($helper, 'question');
+ }
+ else
+ {
+ $this->question = $command->getHelper('question');
+ }
+
return new CommandTester($command);
}
@@ -57,7 +95,11 @@ class phpbb_console_user_add_test extends phpbb_console_user_base
public function test_add_dialog()
{
- $command_tester = $this->get_command_tester();
+ $command_tester = $this->get_command_tester([
+ 'USERNAME' => 'bar',
+ 'PASSWORD' => 'password',
+ 'EMAIL_ADDRESS' => 'bar@test.com',
+ ]);
$this->assertEquals(2, $this->get_user_id('Admin'));
diff --git a/tests/console/user/base.php b/tests/console/user/base.php
index b84c0bb267..ad328ac893 100644
--- a/tests/console/user/base.php
+++ b/tests/console/user/base.php
@@ -94,6 +94,11 @@ abstract class phpbb_console_user_base extends phpbb_database_test_case
'auth.provider_collection',
$provider_collection
);
+ $phpbb_container->setParameter('tables.auth_provider_oauth_token_storage', 'phpbb_oauth_tokens');
+ $phpbb_container->setParameter('tables.auth_provider_oauth_states', 'phpbb_oauth_states');
+ $phpbb_container->setParameter('tables.auth_provider_oauth_account_assoc', 'phpbb_oauth_accounts');
+
+ $phpbb_container->setParameter('tables.user_notifications', 'phpbb_user_notifications');
parent::setUp();
}
diff --git a/tests/cron/manager_test.php b/tests/cron/manager_test.php
index f4dd69b19b..76f8c753bf 100644
--- a/tests/cron/manager_test.php
+++ b/tests/cron/manager_test.php
@@ -40,7 +40,7 @@ class phpbb_cron_manager_test extends \phpbb_test_case
public function test_manager_finds_all_ready_tasks()
{
$tasks = $this->manager->find_all_ready_tasks();
- $this->assertEquals(3, sizeof($tasks));
+ $this->assertEquals(3, count($tasks));
}
public function test_manager_finds_one_ready_task()
diff --git a/tests/dbal/db_tools_test.php b/tests/dbal/db_tools_test.php
index f9243e7266..0365463a48 100644
--- a/tests/dbal/db_tools_test.php
+++ b/tests/dbal/db_tools_test.php
@@ -203,8 +203,15 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
public function test_list_columns()
{
+ $config = $this->get_database_config();
+ $table_columns = $this->table_data['COLUMNS'];
+
+ if (strpos($config['dbms'], 'mssql') !== false)
+ {
+ ksort($table_columns);
+ }
$this->assertEquals(
- array_keys($this->table_data['COLUMNS']),
+ array_keys($table_columns),
array_values($this->tools->sql_list_columns('prefix_table_name'))
);
}
@@ -432,28 +439,37 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
$this->markTestIncomplete('The table prefix length is too long for proper testing of index shortening function.');
}
+ $max_index_length = 30;
+
+ if ($this->tools instanceof \phpbb\db\tools\mssql)
+ {
+ $max_length_method = new ReflectionMethod('\phpbb\db\tools\mssql', 'get_max_index_name_length');
+ $max_length_method->setAccessible(true);
+ $max_index_length = $max_length_method->invoke($this->tools);
+ }
+
$table_suffix = str_repeat('a', 25 - strlen($table_prefix));
$table_name = $table_prefix . $table_suffix;
$this->tools->sql_create_table($table_name, $this->table_data);
- // Index name and table suffix and table prefix have > 30 chars in total.
- // Index name and table suffix have <= 30 chars in total.
- $long_index_name = str_repeat('i', 30 - strlen($table_suffix));
+ // Index name and table suffix and table prefix have > maximum index length chars in total.
+ // Index name and table suffix have <= maximum index length chars in total.
+ $long_index_name = str_repeat('i', $max_index_length - strlen($table_suffix));
$this->assertFalse($this->tools->sql_index_exists($table_name, $long_index_name));
$this->assertTrue($this->tools->sql_create_index($table_name, $long_index_name, array('c_timestamp')));
$this->assertTrue($this->tools->sql_index_exists($table_name, $long_index_name));
- // Index name and table suffix have > 30 chars in total.
- $very_long_index_name = str_repeat('i', 30);
+ // Index name and table suffix have > maximum index length chars in total.
+ $very_long_index_name = str_repeat('i', $max_index_length);
$this->assertFalse($this->tools->sql_index_exists($table_name, $very_long_index_name));
$this->assertTrue($this->tools->sql_create_index($table_name, $very_long_index_name, array('c_timestamp')));
$this->assertTrue($this->tools->sql_index_exists($table_name, $very_long_index_name));
$this->tools->sql_table_drop($table_name);
- // Index name has > 30 chars - that should not be possible.
- $too_long_index_name = str_repeat('i', 31);
+ // Index name has > maximum index length chars - that should not be possible.
+ $too_long_index_name = str_repeat('i', $max_index_length + 1);
$this->assertFalse($this->tools->sql_index_exists('prefix_table_name', $too_long_index_name));
$this->setExpectedTriggerError(E_USER_ERROR);
$this->tools->sql_create_index('prefix_table_name', $too_long_index_name, array('c_timestamp'));
diff --git a/tests/dbal/ext/foo/bar/acp/acp_test_info.php b/tests/dbal/ext/foo/bar/acp/acp_test_info.php
new file mode 100644
index 0000000000..ac92623c3a
--- /dev/null
+++ b/tests/dbal/ext/foo/bar/acp/acp_test_info.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace foo\bar\acp;
+
+class acp_test_info
+{
+ public function module()
+ {
+ return array(
+ 'filename' => '\foo\bar\acp\acp_test_module',
+ 'title' => 'ACP_NEW_MODULE',
+ 'modes' => array(
+ 'mode_1' => array(
+ 'title' => 'ACP_NEW_MODULE_MODE_1',
+ 'auth' => '',
+ 'cat' => array('ACP_NEW_MODULE'),
+ ),
+ 'mode_2' => array(
+ 'title' => 'ACP_NEW_MODULE_MODE_2',
+ 'auth' => '',
+ 'cat' => array('ACP_NEW_MODULE'),
+ ),
+ ),
+ );
+ }
+}
diff --git a/tests/dbal/ext/foo/bar/acp/acp_test_module.php b/tests/dbal/ext/foo/bar/acp/acp_test_module.php
new file mode 100644
index 0000000000..01ce5c17dc
--- /dev/null
+++ b/tests/dbal/ext/foo/bar/acp/acp_test_module.php
@@ -0,0 +1,25 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace foo\bar\acp;
+
+class acp_test_module
+{
+ var $u_action;
+
+ function main($id, $mode)
+ {
+ $this->tpl_name = 'foobar';
+ $this->page_title = 'Bertie';
+ }
+}
diff --git a/tests/dbal/ext/foo/bar/composer.json b/tests/dbal/ext/foo/bar/composer.json
new file mode 100644
index 0000000000..2edfd43d84
--- /dev/null
+++ b/tests/dbal/ext/foo/bar/composer.json
@@ -0,0 +1,24 @@
+{
+ "name": "foo/bar",
+ "type": "phpbb-extension",
+ "description": "An example/sample extension to be used for testing purposes in phpBB Development.",
+ "version": "1.0.0",
+ "time": "2012-02-15 01:01:01",
+ "license": "GNU GPL v2",
+ "authors": [{
+ "name": "John Smith",
+ "username": "JohnSmith27",
+ "email": "email@phpbb.com",
+ "homepage": "http://phpbb.com",
+ "role": "N/A"
+ }],
+ "require": {
+ "php": ">=5.4.7"
+ },
+ "extra": {
+ "display-name": "phpBB BarFoo Extension",
+ "soft-require": {
+ "phpbb/phpbb": "3.2.*@dev"
+ }
+ }
+}
diff --git a/tests/dbal/ext/foo/bar/ucp/ucp_test_info.php b/tests/dbal/ext/foo/bar/ucp/ucp_test_info.php
new file mode 100644
index 0000000000..d3489af832
--- /dev/null
+++ b/tests/dbal/ext/foo/bar/ucp/ucp_test_info.php
@@ -0,0 +1,37 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace foo\bar\ucp;
+
+class ucp_test_info
+{
+ public function module()
+ {
+ return array(
+ 'filename' => '\foo\bar\ucp\ucp_test_module',
+ 'title' => 'UCP_NEW_MODULE',
+ 'modes' => array(
+ 'mode_1' => array(
+ 'title' => 'UCP_NEW_MODULE_MODE_1',
+ 'auth' => '',
+ 'cat' => array('UCP_NEW_MODULE'),
+ ),
+ 'mode_2' => array(
+ 'title' => 'UCP_NEW_MODULE_MODE_2',
+ 'auth' => '',
+ 'cat' => array('UCP_NEW_MODULE'),
+ ),
+ ),
+ );
+ }
+}
diff --git a/tests/dbal/ext/foo/bar/ucp/ucp_test_module.php b/tests/dbal/ext/foo/bar/ucp/ucp_test_module.php
new file mode 100644
index 0000000000..b06b3238b6
--- /dev/null
+++ b/tests/dbal/ext/foo/bar/ucp/ucp_test_module.php
@@ -0,0 +1,25 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+namespace foo\bar\ucp;
+
+class ucp_test_module
+{
+ var $u_action;
+
+ function main($id, $mode)
+ {
+ $this->tpl_name = 'foobar';
+ $this->page_title = 'Bertie';
+ }
+}
diff --git a/tests/dbal/fixtures/boolean_processor.xml b/tests/dbal/fixtures/boolean_processor.xml
index c5da677116..d31d679f45 100644
--- a/tests/dbal/fixtures/boolean_processor.xml
+++ b/tests/dbal/fixtures/boolean_processor.xml
@@ -60,25 +60,31 @@
<table name="phpbb_user_group">
<column>user_id</column>
<column>group_id</column>
+ <column>group_leader</column>
<row>
<value>1</value>
<value>1</value>
+ <value>2</value>
</row>
<row>
<value>2</value>
<value>1</value>
+ <value>2</value>
</row>
<row>
<value>3</value>
<value>1</value>
+ <value>2</value>
</row>
<row>
<value>4</value>
<value>2</value>
+ <value>2</value>
</row>
<row>
<value>5</value>
<value>2</value>
+ <value>2</value>
</row>
</table>
</dataset>
diff --git a/tests/dbal/migrator_tool_module_test.php b/tests/dbal/migrator_tool_module_test.php
index 29b21166b6..e34ee7b59c 100644
--- a/tests/dbal/migrator_tool_module_test.php
+++ b/tests/dbal/migrator_tool_module_test.php
@@ -11,6 +11,9 @@
*
*/
+require_once dirname(__FILE__) . '/ext/foo/bar/acp/acp_test_info.php';
+require_once dirname(__FILE__) . '/ext/foo/bar/ucp/ucp_test_info.php';
+
class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
{
public function getDataSet()
@@ -39,6 +42,9 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
$auth = $this->getMock('\phpbb\auth\auth');
$phpbb_log = new \phpbb\log\log($db, $user, $auth, $phpbb_dispatcher, $phpbb_root_path, 'adm/', $phpEx, LOG_TABLE);
+ // Correctly set the root path for this test to this directory, so the classes can be found
+ $phpbb_root_path = dirname(__FILE__) . '/';
+
$phpbb_extension_manager = new phpbb_mock_extension_manager($phpbb_root_path);
$module_manager = new \phpbb\module\module_manager($cache, $this->db, $phpbb_extension_manager, MODULES_TABLE, $phpbb_root_path, $phpEx);
@@ -52,11 +58,39 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
array(
'',
'ACP_CAT',
+ false,
true,
),
array(
0,
'ACP_CAT',
+ false,
+ true,
+ ),
+ array(
+ false,
+ 'ACP_CAT',
+ false,
+ true,
+ ),
+
+ // Test the existing category lazily
+ array(
+ '',
+ 'ACP_CAT',
+ true,
+ true,
+ ),
+ array(
+ 0,
+ 'ACP_CAT',
+ true,
+ true,
+ ),
+ array(
+ false,
+ 'ACP_CAT',
+ true,
true,
),
@@ -65,16 +99,39 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
'',
'ACP_MODULE',
false,
+ false,
+ ),
+ array(
+ false,
+ 'ACP_MODULE',
+ false,
+ true,
+ ),
+ array(
+ 'ACP_CAT',
+ 'ACP_MODULE',
+ false,
+ true,
+ ),
+
+ // Test the existing module lazily
+ array(
+ '',
+ 'ACP_MODULE',
+ true,
+ false,
),
array(
false,
'ACP_MODULE',
true,
+ true,
),
array(
'ACP_CAT',
'ACP_MODULE',
true,
+ true,
),
// Test for non-existant modules
@@ -82,10 +139,38 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
'',
'ACP_NON_EXISTANT_CAT',
false,
+ false,
+ ),
+ array(
+ false,
+ 'ACP_NON_EXISTANT_CAT',
+ false,
+ false,
+ ),
+ array(
+ 'ACP_CAT',
+ 'ACP_NON_EXISTANT_MODULE',
+ false,
+ false,
+ ),
+
+ // Test for non-existant modules lazily
+ array(
+ '',
+ 'ACP_NON_EXISTANT_CAT',
+ true,
+ false,
+ ),
+ array(
+ false,
+ 'ACP_NON_EXISTANT_CAT',
+ true,
+ false,
),
array(
'ACP_CAT',
'ACP_NON_EXISTANT_MODULE',
+ true,
false,
),
);
@@ -94,9 +179,9 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
/**
* @dataProvider exists_data_acp
*/
- public function test_exists_acp($parent, $module, $expected)
+ public function test_exists_acp($parent, $module, $lazy, $expected)
{
- $this->assertEquals($expected, $this->tool->exists('acp', $parent, $module));
+ $this->assertEquals($expected, $this->tool->exists('acp', $parent, $module, $lazy));
}
public function exists_data_ucp()
@@ -106,12 +191,40 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
array(
'',
'UCP_MAIN_CAT',
+ false,
+ true,
+ ),
+ array(
+ 0,
+ 'UCP_MAIN_CAT',
+ false,
+ true,
+ ),
+ array(
+ false,
+ 'UCP_MAIN_CAT',
+ false,
+ true,
+ ),
+
+ // Test the existing category lazily
+ array(
+ '',
+ 'UCP_MAIN_CAT',
+ true,
true,
),
array(
0,
'UCP_MAIN_CAT',
true,
+ true,
+ ),
+ array(
+ false,
+ 'UCP_MAIN_CAT',
+ true,
+ true,
),
// Test the existing module
@@ -119,21 +232,51 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
'',
'UCP_SUBCATEGORY',
false,
+ false,
+ ),
+ array(
+ false,
+ 'UCP_SUBCATEGORY',
+ false,
+ true,
+ ),
+ array(
+ 'UCP_MAIN_CAT',
+ 'UCP_SUBCATEGORY',
+ false,
+ true,
+ ),
+ array(
+ 'UCP_SUBCATEGORY',
+ 'UCP_MODULE',
+ false,
+ true,
+ ),
+
+ // Test the existing module lazily
+ array(
+ '',
+ 'UCP_SUBCATEGORY',
+ true,
+ false,
),
array(
false,
'UCP_SUBCATEGORY',
true,
+ true,
),
array(
'UCP_MAIN_CAT',
'UCP_SUBCATEGORY',
true,
+ true,
),
array(
'UCP_SUBCATEGORY',
'UCP_MODULE',
true,
+ true,
),
// Test for non-existant modules
@@ -141,10 +284,26 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
'',
'UCP_NON_EXISTANT_CAT',
false,
+ false,
+ ),
+ array(
+ 'UCP_MAIN_CAT',
+ 'UCP_NON_EXISTANT_MODULE',
+ false,
+ false,
+ ),
+
+ // Test for non-existant modules lazily
+ array(
+ '',
+ 'UCP_NON_EXISTANT_CAT',
+ true,
+ false,
),
array(
'UCP_MAIN_CAT',
'UCP_NON_EXISTANT_MODULE',
+ true,
false,
),
);
@@ -153,9 +312,9 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
/**
* @dataProvider exists_data_ucp
*/
- public function test_exists_ucp($parent, $module, $expected)
+ public function test_exists_ucp($parent, $module, $lazy, $expected)
{
- $this->assertEquals($expected, $this->tool->exists('ucp', $parent, $module));
+ $this->assertEquals($expected, $this->tool->exists('ucp', $parent, $module, $lazy));
}
public function test_add()
@@ -195,25 +354,6 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
// Test adding module when plural parent module_langname exists
// PHPBB3-14703
- // Adding fail
- try
- {
- $this->tool->add('acp', 'ACP_FORUM_BASED_PERMISSIONS', array(
- 'module_basename' => 'acp_new_permissions_module',
- 'module_langname' => 'ACP_NEW_PERMISSIONS_MODULE',
- 'module_mode' => 'test',
- 'module_auth' => '',
- ));
- $this->fail('Exception not thrown');
- }
- catch (Exception $e)
- {
- $this->assertEquals('phpbb\db\migration\exception', get_class($e));
- $this->assertEquals('MODULE_EXIST_MULTIPLE', $e->getMessage());
- }
-
- // Test adding module when plural parent module_langname exists
- // PHPBB3-14703
// Adding success
try
{
@@ -269,6 +409,35 @@ class phpbb_dbal_migrator_tool_module_test extends phpbb_database_test_case
$this->fail($e);
}
$this->assertEquals(true, $this->tool->exists('ucp', 'UCP_NEW_SUBCAT', 'UCP_NEW_MODULE'));
+
+ // Test adding new UCP module the automatic way, single mode
+ try
+ {
+ $this->tool->add('ucp', 'UCP_NEW_CAT', array(
+ 'module_basename' => '\foo\bar\ucp\ucp_test_module',
+ 'modes' => array('mode_1'),
+ ));
+ }
+ catch (Exception $e)
+ {
+ $this->fail($e);
+ }
+ $this->assertEquals(true, $this->tool->exists('ucp', 'UCP_NEW_CAT', 'UCP_NEW_MODULE_MODE_1'));
+ $this->assertEquals(false, $this->tool->exists('ucp', 'UCP_NEW_CAT', 'UCP_NEW_MODULE_MODE_2'));
+
+ // Test adding new ACP module the automatic way, all modes
+ try
+ {
+ $this->tool->add('acp', 'ACP_NEW_CAT', array(
+ 'module_basename' => '\foo\bar\acp\acp_test_module',
+ ));
+ }
+ catch (Exception $e)
+ {
+ $this->fail($e);
+ }
+ $this->assertEquals(true, $this->tool->exists('acp', 'ACP_NEW_CAT', 'ACP_NEW_MODULE_MODE_1'));
+ $this->assertEquals(true, $this->tool->exists('acp', 'ACP_NEW_CAT', 'ACP_NEW_MODULE_MODE_2'));
}
public function test_remove()
diff --git a/tests/dbal/migrator_tool_permission_test.php b/tests/dbal/migrator_tool_permission_test.php
index d84f6a68ff..ccad6a1387 100644
--- a/tests/dbal/migrator_tool_permission_test.php
+++ b/tests/dbal/migrator_tool_permission_test.php
@@ -163,7 +163,7 @@ class phpbb_dbal_migrator_tool_permission_test extends phpbb_database_test_case
$this->assertFalse($this->tool->exists('global_test', true));
}
- public function test_permission_set_data()
+ public function data_test_permission_set()
{
return array(
array(
@@ -188,7 +188,7 @@ class phpbb_dbal_migrator_tool_permission_test extends phpbb_database_test_case
}
/**
- * @dataProvider test_permission_set_data
+ * @dataProvider data_test_permission_set
*/
public function test_permission_set($group_name, $auth_option, $type, $has_permission)
{
diff --git a/tests/dbal/write_test.php b/tests/dbal/write_test.php
index 98709fb043..4fa5cc37a2 100644
--- a/tests/dbal/write_test.php
+++ b/tests/dbal/write_test.php
@@ -67,7 +67,7 @@ class phpbb_dbal_write_test extends phpbb_database_test_case
$result = $db->sql_query($sql);
$rows = $db->sql_fetchrowset($result);
- $this->assertEquals(1, sizeof($rows));
+ $this->assertEquals(1, count($rows));
$this->assertEquals('config2', $rows[0]['config_name']);
$db->sql_freeresult($result);
diff --git a/tests/error_collector_test.php b/tests/error_collector_test.php
index 273284c8fc..8ed89bbe52 100644
--- a/tests/error_collector_test.php
+++ b/tests/error_collector_test.php
@@ -52,8 +52,8 @@ class phpbb_error_collector_test extends phpbb_test_case
1/0; $line = __LINE__;
// Cause a notice
- $array = array('ITEM' => 'value');
- $value = $array[ITEM]; $line2 = __LINE__;
+ $array = array(0 => 'value');
+ $value = $array[1]; $line2 = __LINE__;
$collector->uninstall();
diff --git a/tests/event/dispatcher_test.php b/tests/event/dispatcher_test.php
index 7bba5bf337..da28d24daa 100644
--- a/tests/event/dispatcher_test.php
+++ b/tests/event/dispatcher_test.php
@@ -29,5 +29,21 @@ class phpbb_event_dispatcher_test extends phpbb_test_case
$result = $dispatcher->trigger_event('core.test_event', compact($vars));
$this->assertSame(array('foo' => 'foo2', 'bar' => 'bar2'), $result);
+
+ // Test migrating events
+ $dispatcher->addListener('core.foo_br', function(\phpbb\event\data $event) {
+ $event['pi'] = '3.14159';
+ });
+ $dispatcher->addListener('core.foo_bar', function(\phpbb\event\data $event) {
+ $event['pi'] = '3.1';
+ });
+
+
+ $pi = '3';
+
+ $vars = array('pi');
+ $result = $dispatcher->trigger_event(['core.foo_bar', 'core.foo_br'], compact($vars));
+
+ $this->assertSame(array('pi' => '3.14159'), $result);
}
}
diff --git a/tests/event/fixtures/event_migration.test b/tests/event/fixtures/event_migration.test
new file mode 100644
index 0000000000..b2df9f95df
--- /dev/null
+++ b/tests/event/fixtures/event_migration.test
@@ -0,0 +1,30 @@
+<?php
+
+ /**
+ * Modify pm and sender data before it is assigned to the template
+ *
+ * @event core.ucp_pm_view_message
+ * @var mixed id Active module category (can be int or string)
+ * @var string mode Active module
+ * @var int folder_id ID of the folder the message is in
+ * @var int msg_id ID of the private message
+ * @var array folder Array with data of user's message folders
+ * @var array message_row Array with message data
+ * @var array cp_row Array with senders custom profile field data
+ * @var array msg_data Template array with message data
+ * @var array user_info User data of the sender
+ * @since 3.1.0-a1
+ * @changed 3.1.6-RC1 Added user_info into event
+ */
+ $vars = array(
+ 'id',
+ 'mode',
+ 'folder_id',
+ 'msg_id',
+ 'folder',
+ 'message_row',
+ 'cp_row',
+ 'msg_data',
+ 'user_info',
+ );
+ extract($phpbb_dispatcher->trigger_event(['core.ucp_pm_view_message', 'core.ucp_pm_view_messsage'], compact($vars)));
diff --git a/tests/event/fixtures/extra_description.test b/tests/event/fixtures/extra_description.test
index ce8f97ce89..e93a1044ac 100644
--- a/tests/event/fixtures/extra_description.test
+++ b/tests/event/fixtures/extra_description.test
@@ -3,7 +3,7 @@
/**
* Description
*
-* NOTE: This will not be exported
+* NOTE: This will also be exported
*
* @event extra_description.dispatch
* @since 3.1.0-b2
diff --git a/tests/event/md_exporter_test.php b/tests/event/md_exporter_test.php
index 607f442fdf..2eeb48ea05 100644
--- a/tests/event/md_exporter_test.php
+++ b/tests/event/md_exporter_test.php
@@ -92,7 +92,7 @@ class phpbb_event_md_exporter_test extends phpbb_test_case
public function test_crawl_eventsmd($file, $min_version, $max_version, $events)
{
$exporter = new \phpbb\event\md_exporter(dirname(__FILE__) . '/fixtures/', null, $min_version, $max_version);
- $this->assertSame(sizeof($events), $exporter->crawl_eventsmd($file, 'adm'));
+ $this->assertSame(count($events), $exporter->crawl_eventsmd($file, 'adm'));
$this->assertEquals($events, $exporter->get_events());
}
@@ -146,7 +146,7 @@ class phpbb_event_md_exporter_test extends phpbb_test_case
$exporter->crawl_eventsmd('docs/events.md', $filter);
$events = $exporter->crawl_file_for_events($file);
- $this->assertGreaterThanOrEqual(0, sizeof($events));
+ $this->assertGreaterThanOrEqual(0, count($events));
$this->assertTrue($exporter->validate_events_from_file($file, $events));
}
}
diff --git a/tests/event/php_exporter_test.php b/tests/event/php_exporter_test.php
index 692a57f93c..c6670e1340 100644
--- a/tests/event/php_exporter_test.php
+++ b/tests/event/php_exporter_test.php
@@ -38,6 +38,18 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
),
),
array(
+ 'event_migration.test',
+ array(
+ 'core.ucp_pm_view_message' => array(
+ 'event' => 'core.ucp_pm_view_message',
+ 'file' => 'event_migration.test',
+ 'arguments' => array('cp_row', 'folder', 'folder_id', 'id', 'message_row', 'mode', 'msg_data', 'msg_id', 'user_info'),
+ 'since' => '3.1.0-a1',
+ 'description' => 'Modify pm and sender data before it is assigned to the template',
+ ),
+ ),
+ ),
+ array(
'extra_description.test',
array(
'extra_description.dispatch' => array(
@@ -45,7 +57,7 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
'file' => 'extra_description.test',
'arguments' => array(),
'since' => '3.1.0-b2',
- 'description' => 'Description',
+ 'description' => 'Description<br/><br/>NOTE: This will also be exported',
),
),
),
@@ -240,6 +252,8 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
array("\t\$phpbb_dispatcher->dispatch('dispatch.one2.thr_ee4');", 'dispatch.one2.thr_ee4'),
array("\$this->dispatcher->dispatch('dispatch.one2');", 'dispatch.one2'),
array("\$phpbb_dispatcher->dispatch('dis_patch.one');", 'dis_patch.one'),
+ array("\$phpbb_dispatcher->dispatch(['dis_patch.one', 'dis_patch.one2']);", 'dis_patch.one'),
+ array("\$phpbb_dispatcher->dispatch(['dis_patch.one', 'dis_patch.one2', 'dis_patch.two3']);", 'dis_patch.one'),
);
}
@@ -259,6 +273,8 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
array("\$phpbb_dispatcher->dispatch('');"),
array("\$phpbb_dispatcher->dispatch('dispatch.2one');"),
array("\$phpbb_dispatcher->dispatch('dispatch');"),
+ array("\$phpbb_dispatcher->dispatch(['dispatch.one']);"),
+ array("\$phpbb_dispatcher->dispatch(array('dispatch.one', 'dispatch.one2'));"),
);
}
@@ -279,6 +295,8 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
array("\textract(\$phpbb_dispatcher->trigger_event('dispatch.one2.thr_ee4', compact(\$vars)));", 'dispatch.one2.thr_ee4'),
array("extract(\$this->dispatcher->trigger_event('dispatch.one2', compact(\$vars)));", 'dispatch.one2'),
array("extract(\$phpbb_dispatcher->trigger_event('dis_patch.one', compact(\$vars)));", 'dis_patch.one'),
+ array("extract(\$phpbb_dispatcher->trigger_event(['dis_patch.one', 'dis_patch.one2'], compact(\$vars)));", 'dis_patch.one'),
+ array("extract(\$phpbb_dispatcher->trigger_event(['dis_patch.one', 'dis_patch.one2', 'dis_patch.two3'], compact(\$vars)));", 'dis_patch.one'),
);
}
@@ -301,6 +319,7 @@ class phpbb_event_php_exporter_test extends phpbb_test_case
array("extract(\$phpbb_dispatcher->trigger_event('dispatch.one', \$vars));"),
array("extract(\$phpbb_dispatcher->trigger_event('dispatch.one', compact(\$var)));"),
array("extract(\$phpbb_dispatcher->trigger_event('dispatch.one', compact(\$array)));"),
+ array("extract(\$phpbb_dispatcher->trigger_event(['dispatch.one'], compact(\$vars)));"),
array("\$phpbb_dispatcher->trigger_event('dis_patch.one', compact(\$vars));", 'dis_patch.one'),
);
}
diff --git a/tests/feed/attachments_base_test.php b/tests/feed/attachments_base_test.php
index dd432d13f5..573218be42 100644
--- a/tests/feed/attachments_base_test.php
+++ b/tests/feed/attachments_base_test.php
@@ -31,13 +31,25 @@ class phpbb_feed_attachments_base_test extends phpbb_database_test_case
$this->filesystem = new \phpbb\filesystem();
$config = new \phpbb\config\config(array());
+ $path_helper = new \phpbb\path_helper(
+ new \phpbb\symfony_request(
+ new phpbb_mock_request()
+ ),
+ $this->filesystem,
+ $this->getMock('\phpbb\request\request'),
+ $phpbb_root_path,
+ 'php'
+ );
$user = new \phpbb\user(
new \phpbb\language\language(
new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)
),
'\phpbb\datetime'
);
- $feed_helper = new \phpbb\feed\helper($config, $user, $phpbb_root_path, $phpEx);
+ $container = new phpbb_mock_container_builder();
+ $this->get_test_case_helpers()->set_s9e_services($container);
+ $container->set('feed.quote_helper', new \phpbb\feed\quote_helper($user, $phpbb_root_path, 'php'));
+ $feed_helper = new \phpbb\feed\helper($config, $container, $path_helper, $container->get('text_formatter.renderer'), $user);
$db = $this->new_dbal();
$cache = new \phpbb_mock_cache();
$auth = new \phpbb\auth\auth();
diff --git a/tests/functional/acp_attachments_test.php b/tests/functional/acp_attachments_test.php
deleted file mode 100644
index 8e810a508a..0000000000
--- a/tests/functional/acp_attachments_test.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/**
- *
- * This file is part of the phpBB Forum Software package.
- *
- * @copyright (c) phpBB Limited <https://www.phpbb.com>
- * @license GNU General Public License, version 2 (GPL-2.0)
- *
- * For full copyright and license information, please see
- * the docs/CREDITS.txt file.
- *
- */
-
-/**
- * @group functional
- */
-class phpbb_functional_acp_attachments_test extends phpbb_functional_test_case
-{
- public function data_imagick_path_linux()
- {
- return array(
- array('/usr/bin', 'Configuration updated successfully'),
- array('/usr/foobar', 'The entered path “/usr/foobar” does not exist.'),
- array('/usr/bin/which', 'The entered path “/usr/bin/which” is not a directory.'),
- );
- }
-
- /**
- * @dataProvider data_imagick_path_linux
- */
- public function test_imagick_path_linux($imagick_path, $expected)
- {
- if (strtolower(substr(PHP_OS, 0, 5)) !== 'linux')
- {
- $this->markTestSkipped('Unable to test linux specific paths on other OS.');
- }
-
- $this->login();
- $this->admin_login();
-
- $crawler = self::request('GET', 'adm/index.php?i=attachments&mode=attach&sid=' . $this->sid);
-
- $form = $crawler->selectButton('Submit')->form(array('config[img_imagick]' => $imagick_path));
-
- $crawler = self::submit($form);
- $this->assertContains($expected, $crawler->filter('#main')->text());
- }
-
- public function data_imagick_path_windows()
- {
- return array(
- array('C:\Windows', 'Configuration updated successfully'),
- array('C:\Windows\foobar1', 'The entered path “C:\Windows\foobar1” does not exist.'),
- array('C:\Windows\explorer.exe', 'The entered path “C:\Windows\explorer.exe” is not a directory.'),
- );
- }
-
- /**
- * @dataProvider data_imagick_path_windows
- */
- public function test_imagick_path_windows($imagick_path, $expected)
- {
- if (strtolower(substr(PHP_OS, 0, 3)) !== 'win')
- {
- $this->markTestSkipped('Unable to test windows specific paths on other OS.');
- }
-
- $this->login();
- $this->admin_login();
-
- $crawler = self::request('GET', 'adm/index.php?i=attachments&mode=attach&sid=' . $this->sid);
-
- $form = $crawler->selectButton('Submit')->form(array('config[img_imagick]' => $imagick_path));
-
- $crawler = self::submit($form);
- $this->assertContains($expected, $crawler->filter('#main')->text());
- }
-}
diff --git a/tests/functional/acp_profile_field_test.php b/tests/functional/acp_profile_field_test.php
index 88df782faa..7a0a6ca941 100644
--- a/tests/functional/acp_profile_field_test.php
+++ b/tests/functional/acp_profile_field_test.php
@@ -28,18 +28,20 @@ class phpbb_functional_acp_profile_field_test extends phpbb_functional_test_case
public function data_add_profile_field()
{
return array(
- array('bool', 'profilefields.type.bool',
+ array('profilefields.type.bool',
array(
+ 'field_ident' => 'bool',
+ 'lang_name' => 'bool',
'lang_options[0]' => 'foo',
'lang_options[1]' => 'bar',
),
- array(),
),
- array('dropdown', 'profilefields.type.dropdown',
+ array('profilefields.type.dropdown',
array(
+ 'field_ident' => 'dropdown',
+ 'lang_name' => 'dropdown',
'lang_options' => "foo\nbar\nbar\nfoo",
),
- array(),
),
);
}
@@ -47,13 +49,12 @@ class phpbb_functional_acp_profile_field_test extends phpbb_functional_test_case
/**
* @dataProvider data_add_profile_field
*/
- public function test_add_profile_field($name, $type, $page1_settings, $page2_settings)
+ public function test_add_profile_field($type, $page1_settings)
{
// Custom profile fields page
$crawler = self::request('GET', 'adm/index.php?i=acp_profile&mode=profile&sid=' . $this->sid);
// these language strings are html
$form = $crawler->selectButton('Create new field')->form(array(
- 'field_ident' => $name,
'field_type' => $type,
));
$crawler = self::submit($form);
@@ -63,7 +64,7 @@ class phpbb_functional_acp_profile_field_test extends phpbb_functional_test_case
$crawler = self::submit($form);
// Fill form for profile field specific options
- $form = $crawler->selectButton('Save')->form($page2_settings);
+ $form = $crawler->selectButton('Save')->form();
$crawler= self::submit($form);
$this->assertContainsLang('ADDED_PROFILE_FIELD', $crawler->text());
diff --git a/tests/functional/extension_acp_test.php b/tests/functional/extension_acp_test.php
index 8a71a5ce04..ce0f4911e3 100644
--- a/tests/functional/extension_acp_test.php
+++ b/tests/functional/extension_acp_test.php
@@ -26,7 +26,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
{
parent::setUpBeforeClass();
- self::$helper = new phpbb_test_case_helpers(self);
+ self::$helper = new phpbb_test_case_helpers(__CLASS__);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/../extension/ext/', self::$fixtures);
}
@@ -133,7 +133,7 @@ class phpbb_functional_extension_acp_test extends phpbb_functional_test_case
for ($i = 0; $i < $crawler->filter('dl')->count(); $i++)
{
- $text = $crawler->filter('dl')->eq($i)->text();
+ $text = trim($crawler->filter('dl')->eq($i)->text());
$match = false;
diff --git a/tests/functional/extension_controller_test.php b/tests/functional/extension_controller_test.php
index 18eb9ad4c6..58c3878b8b 100644
--- a/tests/functional/extension_controller_test.php
+++ b/tests/functional/extension_controller_test.php
@@ -34,7 +34,7 @@ class phpbb_functional_extension_controller_test extends phpbb_functional_test_c
{
parent::setUpBeforeClass();
- self::$helper = new phpbb_test_case_helpers(self);
+ self::$helper = new phpbb_test_case_helpers(__CLASS__);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
diff --git a/tests/functional/extension_global_lang_test.php b/tests/functional/extension_global_lang_test.php
index f615114c08..a1e2547745 100644
--- a/tests/functional/extension_global_lang_test.php
+++ b/tests/functional/extension_global_lang_test.php
@@ -30,7 +30,7 @@ class phpbb_functional_extension_global_lang_test extends phpbb_functional_test_
{
parent::setUpBeforeClass();
- self::$helper = new phpbb_test_case_helpers(self);
+ self::$helper = new phpbb_test_case_helpers(__CLASS__);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
diff --git a/tests/functional/extension_module_test.php b/tests/functional/extension_module_test.php
index 95107665cd..d3a66b9b35 100644
--- a/tests/functional/extension_module_test.php
+++ b/tests/functional/extension_module_test.php
@@ -29,7 +29,7 @@ class phpbb_functional_extension_module_test extends phpbb_functional_test_case
{
parent::setUpBeforeClass();
- self::$helper = new phpbb_test_case_helpers(self);
+ self::$helper = new phpbb_test_case_helpers(__CLASS__);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
diff --git a/tests/functional/extension_permission_lang_test.php b/tests/functional/extension_permission_lang_test.php
index 92d8d596c7..f570d45215 100644
--- a/tests/functional/extension_permission_lang_test.php
+++ b/tests/functional/extension_permission_lang_test.php
@@ -30,7 +30,7 @@ class phpbb_functional_extension_permission_lang_test extends phpbb_functional_t
{
parent::setUpBeforeClass();
- self::$helper = new phpbb_test_case_helpers(self);
+ self::$helper = new phpbb_test_case_helpers(__CLASS__);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
diff --git a/tests/functional/fileupload_form_test.php b/tests/functional/fileupload_form_test.php
index d381fa1ae2..b0780172ff 100644
--- a/tests/functional/fileupload_form_test.php
+++ b/tests/functional/fileupload_form_test.php
@@ -99,7 +99,6 @@ class phpbb_functional_fileupload_form_test extends phpbb_functional_test_case
$form = $crawler->selectButton('Submit')->form(array(
'config[check_attachment_content]' => 0,
- 'config[img_imagick]' => '',
));
self::submit($form);
diff --git a/tests/functional/fileupload_remote_test.php b/tests/functional/fileupload_remote_test.php
index 88f8999005..426ebcee53 100644
--- a/tests/functional/fileupload_remote_test.php
+++ b/tests/functional/fileupload_remote_test.php
@@ -102,7 +102,7 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
->set_allowed_extensions(array('gif'))
->set_max_filesize(2000);
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/test.gif');
- $this->assertEquals(0, sizeof($file->error));
+ $this->assertEquals(0, count($file->error));
$this->assertTrue(file_exists($file->get('filename')));
$this->assertTrue($file->is_uploaded());
}
@@ -115,7 +115,7 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
->set_allowed_extensions(array('gif'))
->set_max_filesize(100);
$file = $upload->handle_upload('files.types.remote', self::$root_url . 'develop/test.gif');
- $this->assertEquals(1, sizeof($file->error));
+ $this->assertEquals(1, count($file->error));
$this->assertEquals('WRONG_FILESIZE', $file->error[0]);
}
}
diff --git a/tests/functional/metadata_manager_test.php b/tests/functional/metadata_manager_test.php
index 0d2fdf082e..8456c40f00 100644
--- a/tests/functional/metadata_manager_test.php
+++ b/tests/functional/metadata_manager_test.php
@@ -35,7 +35,7 @@ class phpbb_functional_metadata_manager_test extends phpbb_functional_test_case
{
parent::setUpBeforeClass();
- self::$helper = new phpbb_test_case_helpers(self);
+ self::$helper = new phpbb_test_case_helpers(__CLASS__);
self::$helper->copy_ext_fixtures(dirname(__FILE__) . '/fixtures/ext/', self::$fixtures);
}
diff --git a/tests/functional/posting_test.php b/tests/functional/posting_test.php
index 8e6328d1d3..764376a945 100644
--- a/tests/functional/posting_test.php
+++ b/tests/functional/posting_test.php
@@ -235,7 +235,7 @@ class phpbb_functional_posting_test extends phpbb_functional_test_case
));
$crawler = self::submit($form);
$this->assertContains(
- '<span style="font-weight: bold">My signature</span>',
+ '<strong class="text-strong">My signature</strong>',
$crawler->filter('#preview .signature')->html()
);
}
diff --git a/tests/functional/user_password_reset_test.php b/tests/functional/user_password_reset_test.php
index 3da78407cf..2361eed066 100644
--- a/tests/functional/user_password_reset_test.php
+++ b/tests/functional/user_password_reset_test.php
@@ -21,25 +21,56 @@ class phpbb_functional_user_password_reset_test extends phpbb_functional_test_ca
public function test_password_reset()
{
$this->add_lang('ucp');
- $user_id = $this->create_user('reset-password-test-user');
+ $user_id = $this->create_user('reset-password-test-user', 'reset-password-test-user@test.com');
+ // test without email
+ $crawler = self::request('GET', "ucp.php?mode=sendpassword&sid={$this->sid}");
+ $form = $crawler->selectButton('submit')->form();
+ $crawler = self::submit($form);
+ $this->assertContainsLang('NO_EMAIL_USER', $crawler->text());
+
+ // test with non-existent email
$crawler = self::request('GET', "ucp.php?mode=sendpassword&sid={$this->sid}");
$form = $crawler->selectButton('submit')->form(array(
- 'username' => 'reset-password-test-user',
+ 'email' => 'non-existent@email.com',
));
$crawler = self::submit($form);
- $this->assertContainsLang('NO_EMAIL_USER', $crawler->text());
+ $this->assertContainsLang('PASSWORD_UPDATED_IF_EXISTED', $crawler->text());
+ // test with correct email
$crawler = self::request('GET', "ucp.php?mode=sendpassword&sid={$this->sid}");
$form = $crawler->selectButton('submit')->form(array(
- 'username' => 'reset-password-test-user',
- 'email' => 'nobody@example.com',
+ 'email' => 'reset-password-test-user@test.com',
+ ));
+ $crawler = self::submit($form);
+ $this->assertContainsLang('PASSWORD_UPDATED_IF_EXISTED', $crawler->text());
+
+ // Check if columns in database were updated for password reset
+ $this->get_user_data('reset-password-test-user');
+ $this->assertNotNull($this->user_data['user_actkey']);
+ $this->assertNotNull($this->user_data['user_newpasswd']);
+
+ // Create another user with the same email
+ $this->create_user('reset-password-test-user1', 'reset-password-test-user@test.com');
+
+ // Test that username is now also required
+ $crawler = self::request('GET', "ucp.php?mode=sendpassword&sid={$this->sid}");
+ $form = $crawler->selectButton('submit')->form(array(
+ 'email' => 'reset-password-test-user@test.com',
+ ));
+ $crawler = self::submit($form);
+ $this->assertContainsLang('EMAIL_NOT_UNIQUE', $crawler->text());
+
+ // Provide both username and email
+ $form = $crawler->selectButton('submit')->form(array(
+ 'email' => 'reset-password-test-user@test.com',
+ 'username' => 'reset-password-test-user1',
));
$crawler = self::submit($form);
- $this->assertContainsLang('PASSWORD_UPDATED', $crawler->text());
+ $this->assertContainsLang('PASSWORD_UPDATED_IF_EXISTED', $crawler->text());
// Check if columns in database were updated for password reset
- $this->get_user_data();
+ $this->get_user_data('reset-password-test-user1');
$this->assertNotNull($this->user_data['user_actkey']);
$this->assertNotNull($this->user_data['user_newpasswd']);
@@ -73,7 +104,7 @@ class phpbb_functional_user_password_reset_test extends phpbb_functional_test_ca
public function test_activate_new_password($expected, $user_id, $act_key)
{
$this->add_lang('ucp');
- $this->get_user_data();
+ $this->get_user_data('reset-password-test-user');
$user_id = (!$user_id) ? $this->user_data['user_id'] : $user_id;
$act_key = (!$act_key) ? $this->user_data['user_actkey'] : $act_key;
@@ -119,7 +150,7 @@ class phpbb_functional_user_password_reset_test extends phpbb_functional_test_ca
public function test_acivateAfterDeactivate()
{
// User is active, actkey should not exist
- $this->get_user_data();
+ $this->get_user_data('reset-password-test-user');
$this->assertEmpty($this->user_data['user_actkey']);
$this->login();
@@ -143,7 +174,7 @@ class phpbb_functional_user_password_reset_test extends phpbb_functional_test_ca
$crawler = self::request('GET', preg_replace('#(.+)(adm/index.php.+)#', '$2', $link->getUri()));
// Ensure again that actkey is empty after deactivation
- $this->get_user_data();
+ $this->get_user_data('reset-password-test-user');
$this->assertEmpty($this->user_data['user_actkey']);
// Force reactivation of account and check that act key is not empty anymore
@@ -152,16 +183,16 @@ class phpbb_functional_user_password_reset_test extends phpbb_functional_test_ca
$crawler = self::submit($form, array('action' => 'reactivate'));
$this->assertContainsLang('FORCE_REACTIVATION_SUCCESS', $crawler->filter('html')->text());
- $this->get_user_data();
+ $this->get_user_data('reset-password-test-user');
$this->assertNotEmpty($this->user_data['user_actkey']);
}
- protected function get_user_data()
+ protected function get_user_data($username)
{
$db = $this->get_db();
$sql = 'SELECT user_id, username, user_type, user_email, user_newpasswd, user_lang, user_notify_type, user_actkey, user_inactive_reason
FROM ' . USERS_TABLE . "
- WHERE username = 'reset-password-test-user'";
+ WHERE username = '" . $db->sql_escape($username) . "'";
$result = $db->sql_query($sql);
$this->user_data = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
diff --git a/tests/functions/fixtures/validate_username.xml b/tests/functions/fixtures/validate_username.xml
index 1b85a2f06d..add8f76553 100644
--- a/tests/functions/fixtures/validate_username.xml
+++ b/tests/functions/fixtures/validate_username.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_groups">
+ <column>group_id</column>
<column>group_name</column>
<column>group_desc</column>
<row>
+ <value>10</value>
<value>foobar_group</value>
<value>test123</value>
</row>
diff --git a/tests/functions/get_remote_file_test.php b/tests/functions/get_remote_file_test.php
index 1550aa37e6..75e5a6dc61 100644
--- a/tests/functions/get_remote_file_test.php
+++ b/tests/functions/get_remote_file_test.php
@@ -58,7 +58,7 @@ class phpbb_functions_get_remote_file extends phpbb_test_case
$this->assertGreaterThanOrEqual(
2,
- sizeof($lines),
+ count($lines),
'Failed asserting that the version file has at least two lines.'
);
diff --git a/tests/functions/make_clickable_test.php b/tests/functions/make_clickable_test.php
index a351a6d527..a6af12b624 100644
--- a/tests/functions/make_clickable_test.php
+++ b/tests/functions/make_clickable_test.php
@@ -53,6 +53,14 @@ class phpbb_functions_make_clickable_test extends phpbb_test_case
'<!-- l --><a class="postlink-local" href="http://testhost/viewtopic.php?t=1">viewtopic.php?t=1</a><!-- l -->'
),
array(
+ 'javascript://testhost/viewtopic.php?t=1',
+ 'javascript://testhost/viewtopic.php?t=1'
+ ),
+ array(
+ "java\nscri\npt://testhost/viewtopic.php?t=1",
+ "java\nscri\n<!-- m --><a class=\"postlink\" href=\"pt://testhost/viewtopic.php?t=1\">pt://testhost/viewtopic.php?t=1</a><!-- m -->"
+ ),
+ array(
'email@domain.com',
'<!-- e --><a href="mailto:email@domain.com">email@domain.com</a><!-- e -->'
),
@@ -90,6 +98,10 @@ class phpbb_functions_make_clickable_test extends phpbb_test_case
'<!-- m --><a class="postlink" href="ftp://ftp.täst.de/">ftp://ftp.täst.de/</a><!-- m -->'
),
array(
+ 'javascript://täst.de/',
+ 'javascript://täst.de/'
+ ),
+ array(
'sip://bantu@täst.de',
'<!-- m --><a class="postlink" href="sip://bantu@täst.de">sip://bantu@täst.de</a><!-- m -->'
),
diff --git a/tests/functions/user_delete_test.php b/tests/functions/user_delete_test.php
index db9b6e0c90..f419c90e9e 100644
--- a/tests/functions/user_delete_test.php
+++ b/tests/functions/user_delete_test.php
@@ -82,6 +82,12 @@ class phpbb_functions_user_delete_test extends phpbb_database_test_case
$phpbb_container->set('auth.provider.oauth.service.google', $oauth_provider_google);
$phpbb_container->set('auth.provider_collection', $provider_collection);
$phpbb_container->set('notification_manager', $notification_manager);
+
+ $phpbb_container->setParameter('tables.auth_provider_oauth_token_storage', 'phpbb_oauth_tokens');
+ $phpbb_container->setParameter('tables.auth_provider_oauth_states', 'phpbb_oauth_states');
+ $phpbb_container->setParameter('tables.auth_provider_oauth_account_assoc', 'phpbb_oauth_accounts');
+
+ $phpbb_container->setParameter('tables.user_notifications', 'phpbb_user_notifications');
}
public function test_user_delete()
diff --git a/tests/functions/validate_username_test.php b/tests/functions/validate_username_test.php
index d310f58036..cee5d38400 100644
--- a/tests/functions/validate_username_test.php
+++ b/tests/functions/validate_username_test.php
@@ -47,6 +47,7 @@ class phpbb_functions_validate_data_test extends phpbb_database_test_case
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array(),
'foobar_quot' => array('INVALID_CHARS'),
+ 'foobar_emoji' => array('INVALID_EMOJIS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
@@ -60,6 +61,7 @@ class phpbb_functions_validate_data_test extends phpbb_database_test_case
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
+ 'foobar_emoji' => array('INVALID_EMOJIS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('INVALID_CHARS'),
@@ -73,6 +75,7 @@ class phpbb_functions_validate_data_test extends phpbb_database_test_case
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
+ 'foobar_emoji' => array('INVALID_EMOJIS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
@@ -86,6 +89,7 @@ class phpbb_functions_validate_data_test extends phpbb_database_test_case
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
+ 'foobar_emoji' => array('INVALID_EMOJIS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('INVALID_CHARS'),
@@ -99,6 +103,7 @@ class phpbb_functions_validate_data_test extends phpbb_database_test_case
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array(),
'foobar_quot' => array('INVALID_CHARS'),
+ 'foobar_emoji' => array('INVALID_EMOJIS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
@@ -112,6 +117,7 @@ class phpbb_functions_validate_data_test extends phpbb_database_test_case
'foobar_letter_num' => array(),
'foobar_letter_num_sp' => array('INVALID_CHARS'),
'foobar_quot' => array('INVALID_CHARS'),
+ 'foobar_emoji' => array('INVALID_EMOJIS'),
'barfoo_disallow' => array('USERNAME_DISALLOWED'),
'admin_taken' => array('USERNAME_TAKEN'),
'group_taken' => array('USERNAME_TAKEN'),
@@ -173,6 +179,11 @@ class phpbb_functions_validate_data_test extends phpbb_database_test_case
'"foobar"',
array('username'),
),
+ 'foobar_emoji' => array(
+ $expected['foobar_emoji'],
+ 'username😮',
+ array('username'),
+ ),
'barfoo_disallow' => array(
$expected['barfoo_disallow'],
'barfoo',
diff --git a/tests/functions_acp/validate_config_vars_test.php b/tests/functions_acp/validate_config_vars_test.php
index 5c31888291..3bd2204de9 100644
--- a/tests/functions_acp/validate_config_vars_test.php
+++ b/tests/functions_acp/validate_config_vars_test.php
@@ -19,10 +19,11 @@ class phpbb_functions_acp_validate_config_vars_test extends phpbb_test_case
{
parent::setUp();
- global $user;
+ global $language, $user;
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
+ $language = $user->lang;
}
/**
@@ -44,6 +45,7 @@ class phpbb_functions_acp_validate_config_vars_test extends phpbb_test_case
'test_int_32' => array('lang' => 'TEST_INT', 'validate' => 'int:32'),
'test_int_32_64' => array('lang' => 'TEST_INT', 'validate' => 'int:32:64'),
'test_lang' => array('lang' => 'TEST_LANG', 'validate' => 'lang'),
+ 'test_url' => array('lang' => 'TEST_URL', 'validate' => 'url'),
/*
'test_sp' => array('lang' => 'TEST_SP', 'validate' => 'script_path'),
'test_rpath' => array('lang' => 'TEST_RPATH', 'validate' => 'rpath'),
@@ -64,6 +66,7 @@ class phpbb_functions_acp_validate_config_vars_test extends phpbb_test_case
'test_int_32' => 32,
'test_int_32_64' => 48,
'test_lang' => 'en',
+ 'test_url' => 'http://foobar.com',
),
),
);
@@ -148,6 +151,11 @@ class phpbb_functions_acp_validate_config_vars_test extends phpbb_test_case
array('test_lang' => 'this_is_no_language'),
array('WRONG_DATA_LANG'),
),
+ array(
+ array('test_url' => array('lang' => 'TEST_URL', 'validate' => 'url')),
+ array('test_url' => 'javascript://foobar.com'),
+ array('URL_INVALID TEST_URL'),
+ ),
);
}
@@ -161,100 +169,4 @@ class phpbb_functions_acp_validate_config_vars_test extends phpbb_test_case
$this->assertEquals($expected, $phpbb_error);
}
-
- public function data_validate_path_linux()
- {
- return array(
- array('/usr/bin', 'absolute_path', true),
- array('/usr/bin/', 'absolute_path:50:200', true),
- array('/usr/bin/which', 'absolute_path', 'DIRECTORY_NOT_DIR'),
- array('/foo/bar', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- array('C:\Windows', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- array('.', 'absolute_path', true),
- array('', 'absolute_path', true),
- array('mkdir /foo/bar', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- // Make sure above command didn't do anything
- array('/foo/bar', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- );
- }
-
- /**
- * @dataProvider data_validate_path_linux
- */
- public function test_validate_path_linux($path, $validation_type, $expected)
- {
- if (strtolower(substr(PHP_OS, 0, 5)) !== 'linux')
- {
- $this->markTestSkipped('Unable to test linux specific paths on other OS.');
- }
-
- $error = array();
- $config_ary = array(
- 'path' => $path,
- );
-
- validate_config_vars(array(
- 'path' => array('lang' => 'FOOBAR', 'validate' => $validation_type),
- ),
- $config_ary,
- $error
- );
-
- if ($expected === true)
- {
- $this->assertEmpty($error);
- }
- else
- {
- $this->assertEquals(array($expected), $error);
- }
- }
-
- public function data_validate_path_windows()
- {
- return array(
- array('C:\Windows', 'absolute_path', true),
- array('C:\Windows\\', 'absolute_path:50:200', true),
- array('C:\Windows\explorer.exe', 'absolute_path', 'DIRECTORY_NOT_DIR'),
- array('C:\foobar', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- array('/usr/bin', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- array('.', 'absolute_path', true),
- array('', 'absolute_path', true),
- array('mkdir C:\Windows\foobar', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- // Make sure above command didn't do anything
- array('C:\Windows\foobar', 'absolute_path', 'DIRECTORY_DOES_NOT_EXIST'),
- );
- }
-
- /**
- * @dataProvider data_validate_path_windows
- */
- public function test_validate_path_windows($path, $validation_type, $expected)
- {
- if (strtolower(substr(PHP_OS, 0, 3)) !== 'win')
- {
- $this->markTestSkipped('Unable to test windows specific paths on other OS.');
- }
-
- $error = array();
- $config_ary = array(
- 'path' => $path,
- );
-
- validate_config_vars(array(
- 'path' => array('lang' => 'FOOBAR', 'validate' => $validation_type),
- ),
- $config_ary,
- $error
- );
-
- if ($expected === true)
- {
- $this->assertEmpty($error);
- }
- else
- {
- $this->assertEquals(array($expected), $error);
- }
- }
}
diff --git a/tests/functions_content/phpbb_format_quote_test.php b/tests/functions_content/phpbb_format_quote_test.php
new file mode 100644
index 0000000000..cbbd46d0a9
--- /dev/null
+++ b/tests/functions_content/phpbb_format_quote_test.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+require_once dirname(__FILE__) . '/../../phpBB/includes/message_parser.php';
+
+class phpbb_functions_content_phpbb_format_quote_test extends phpbb_test_case
+{
+ /** @var \phpbb\language\language */
+ protected $lang;
+
+ public function setUp()
+ {
+ global $cache, $user, $phpbb_root_path, $phpEx;
+
+ $lang_file_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
+ $this->lang = new \phpbb\language\language($lang_file_loader);
+ $user = new \phpbb\user($this->lang, '\phpbb\datetime');
+ $cache = new phpbb_mock_cache();
+
+ parent::setUp();
+ }
+
+ public function data_phpbb_format_quote()
+ {
+ return [
+ [true, ['author' => 'admin', 'user_id' => 2], '[quote=&quot;username&quot;]quoted[/quote]', '', "[quote=admin user_id=2][quote=&quot;username&quot;]quoted[/quote][/quote]\n\n"],
+ [false, ['author' => 'admin', 'user_id' => 2], '[quote=&quot;username&quot;]quoted[/quote]', '', "admin wrote:\n&gt; [quote=&quot;username&quot;]quoted[/quote]\n"],
+ [true, ['author' => 'admin', 'user_id' => 2], '[quote=&quot;username&quot;]quoted[/quote]', "[url=http://viewtopic.php?p=1#p1]Subject: Foo[/url]\n\n", "[url=http://viewtopic.php?p=1#p1]Subject: Foo[/url]\n\n[quote=admin user_id=2][quote=&quot;username&quot;]quoted[/quote][/quote]\n\n"],
+ [false, ['author' => 'admin', 'user_id' => 2], '[quote=&quot;username&quot;]quoted[/quote]', "http://viewtopic.php?p=1#p1 - Subject: Foo\n\n", "http://viewtopic.php?p=1#p1 - Subject: Foo\n\nadmin wrote:\n&gt; [quote=&quot;username&quot;]quoted[/quote]\n"],
+ ];
+ }
+
+
+ /**
+ * @dataProvider data_phpbb_format_quote
+ */
+ public function test_phpbb_format_quote($bbcode_status, $quote_attributes, $message, $message_link, $expected)
+ {
+ $text_formatter_utils = new \phpbb\textformatter\s9e\utils();
+
+ $message_parser = new parse_message($message);
+
+ phpbb_format_quote($this->lang, $message_parser, $text_formatter_utils, $bbcode_status, $quote_attributes, $message_link);
+
+ $this->assertEquals($expected, $message_parser->message);
+ }
+}
diff --git a/tests/functions_user/delete_user_test.php b/tests/functions_user/delete_user_test.php
index 25042d9f1b..09ed51890c 100644
--- a/tests/functions_user/delete_user_test.php
+++ b/tests/functions_user/delete_user_test.php
@@ -46,6 +46,11 @@ class phpbb_functions_user_delete_user_test extends phpbb_database_test_case
'auth.provider_collection',
$provider_collection
);
+ $phpbb_container->setParameter('tables.auth_provider_oauth_token_storage', 'phpbb_oauth_tokens');
+ $phpbb_container->setParameter('tables.auth_provider_oauth_states', 'phpbb_oauth_states');
+ $phpbb_container->setParameter('tables.auth_provider_oauth_account_assoc', 'phpbb_oauth_accounts');
+
+ $phpbb_container->setParameter('tables.user_notifications', 'phpbb_user_notifications');
}
public function first_last_post_data()
diff --git a/tests/functions_user/fixtures/delete_user.xml b/tests/functions_user/fixtures/delete_user.xml
index 56014b35d1..8de2659722 100644
--- a/tests/functions_user/fixtures/delete_user.xml
+++ b/tests/functions_user/fixtures/delete_user.xml
@@ -515,35 +515,44 @@
</table>
<table name="phpbb_privmsgs_folder">
<column>user_id</column>
+ <column>folder_id</column>
<row>
<value>2</value>
+ <value>1</value>
</row>
<row>
<value>3</value>
+ <value>2</value>
</row>
</table>
<table name="phpbb_privmsgs_rules">
<column>user_id</column>
<column>rule_string</column>
+ <column>rule_id</column>
<row>
<value>2</value>
<value></value>
+ <value>1</value>
</row>
<row>
<value>3</value>
<value></value>
+ <value>2</value>
</row>
</table>
<table name="phpbb_drafts">
<column>user_id</column>
<column>draft_message</column>
+ <column>draft_id</column>
<row>
<value>2</value>
<value></value>
+ <value>1</value>
</row>
<row>
<value>3</value>
<value></value>
+ <value>2</value>
</row>
</table>
</dataset>
diff --git a/tests/group/helper_get_name_string_test.php b/tests/group/helper_get_name_string_test.php
new file mode 100644
index 0000000000..c626328dcc
--- /dev/null
+++ b/tests/group/helper_get_name_string_test.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+require_once dirname(__FILE__) . '/helper_test_case.php';
+
+class phpbb_group_helper_get_name_string_test extends phpbb_group_helper_test_case
+{
+
+ public function get_name_string_profile_data()
+ {
+ global $phpbb_root_path, $phpEx;
+
+ return array(
+ array(0, 'Non existing group', '', false, ''),
+ array(2, 'Administrators', 'AA0000', false, "{$phpbb_root_path}memberlist.$phpEx?mode=group&amp;g=2"),
+ array(42, 'Example Group', '', 'http://www.example.org/group.php?mode=show', 'http://www.example.org/group.php?mode=show&amp;g=42'),
+ );
+ }
+
+ /**
+ * @dataProvider get_name_string_profile_data
+ */
+ public function test_get_name_string_profile($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, $this->group_helper->get_name_string('profile', $group_id, $group_name, $group_colour, $custom_profile_url));
+ }
+
+ public function get_name_string_group_name_data()
+ {
+ return array(
+ // Should be fine
+ array(0, 'BOTS', 'AA0000', false, 'Bots'),
+ array(1, 'new_group', '', false, 'Some new group'),
+ array(2, 'group_with_ümlauts', '', 'http://www.example.org/group.php?mode=show', 'Should work'),
+
+ // Should fail and thus return the same
+ array(3, 'not_uppercase', 'FFFFFF', false, 'not_uppercase'),
+ array(4, 'Awesome group', '', false, 'Awesome group'),
+ );
+ }
+
+ /**
+ * @dataProvider get_name_string_group_name_data
+ */
+ public function test_get_name_string_group_name($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, $this->group_helper->get_name_string('group_name', $group_id, $group_name, $group_colour, $custom_profile_url));
+ }
+
+ public function get_name_string_colour_data()
+ {
+ return array(
+ array(0, '', '', false, ''),
+ array(0, '', 'F0F0F0', false, '#F0F0F0'),
+ array(1, 'Guests', '000000', false, '#000000'),
+ array(2, 'Administrators', '', false, ''),
+ );
+ }
+
+ /**
+ * @dataProvider get_name_string_colour_data
+ */
+ public function test_get_name_string_colour($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, $this->group_helper->get_name_string('colour', $group_id, $group_name, $group_colour, $custom_profile_url));
+ }
+
+ public function get_name_string_full_data()
+ {
+ global $phpbb_root_path, $phpEx;
+
+ return array(
+ array(0, 'BOTS', '000000', false, '<span class="username-coloured" style="color: #000000;">Bots</span>'),
+ array(1, 'BOTS', '111111', false, '<span class="username-coloured" style="color: #111111;">Bots</span>'),
+ array(7, 'new_group', 'FFA500', false, '<a class="username-coloured" href="' . $phpbb_root_path . 'memberlist.' . $phpEx . '?mode=group&amp;g=7" style="color: #FFA500;">Some new group</a>'),
+ array(14, 'Awesome group', '', 'http://www.example.org/group.php?mode=show', '<a class="username" href="http://www.example.org/group.php?mode=show&amp;g=14">Awesome group</a>'),
+ );
+ }
+
+ /**
+ * @dataProvider get_name_string_full_data
+ */
+ public function test_get_name_string_full($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, $this->group_helper->get_name_string('full', $group_id, $group_name, $group_colour, $custom_profile_url));
+ }
+
+ public function get_name_string_no_profile_data()
+ {
+ return array(
+ array(0, 'BOTS', '000000', false, '<span class="username-coloured" style="color: #000000;">Bots</span>'),
+ array(1, 'new_group', '', false, '<span class="username">Some new group</span>'),
+ array(2, 'not_uppercase', 'FF0000', false, '<span class="username-coloured" style="color: #FF0000;">not_uppercase</span>'),
+ array(5, 'Awesome group', '', 'http://www.example.org/group.php?mode=show', '<span class="username">Awesome group</span>'),
+ );
+ }
+
+ /**
+ * @dataProvider get_name_string_no_profile_data
+ */
+ public function test_get_name_string_no_profile($group_id, $group_name, $group_colour, $custom_profile_url, $expected)
+ {
+ $this->assertEquals($expected, $this->group_helper->get_name_string('no_profile', $group_id, $group_name, $group_colour, $custom_profile_url));
+ }
+}
diff --git a/tests/group/helper_get_name_test.php b/tests/group/helper_get_name_test.php
new file mode 100644
index 0000000000..b39b2cbedd
--- /dev/null
+++ b/tests/group/helper_get_name_test.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+require_once dirname(__FILE__) . '/helper_test_case.php';
+
+class phpbb_group_helper_get_name_test extends phpbb_group_helper_test_case
+{
+ public function test_get_name()
+ {
+ // They should be totally fine
+ $this->assertEquals('Bots', $this->group_helper->get_name('Bots'));
+ $this->assertEquals('Some new group', $this->group_helper->get_name('new_group'));
+ $this->assertEquals('Should work', $this->group_helper->get_name('group_with_ümlauts'));
+
+ // This should fail (obviously)
+ $this->assertNotEquals('The key does not contain uppercase letters', $this->group_helper->get_name('not_uppercase'));
+
+ // The key doesn't exist so just return group name...
+ $this->assertEquals('Awesome group', $this->group_helper->get_name('Awesome group'));
+ }
+}
diff --git a/tests/group/helper_get_rank_test.php b/tests/group/helper_get_rank_test.php
new file mode 100644
index 0000000000..5efd8ad95e
--- /dev/null
+++ b/tests/group/helper_get_rank_test.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+require_once dirname(__FILE__) . '/helper_test_case.php';
+
+class phpbb_group_helper_get_rank_test extends phpbb_group_helper_test_case
+{
+ public function get_rank_data()
+ {
+ global $phpbb_root_path;
+
+ return array(
+ array(
+ array('group_id' => 0, 'group_rank' => 1),
+ array(
+ 'title' => 'Site admin',
+ 'img' => '<img src="' . $phpbb_root_path . 'images/ranks/siteadmin.png' . '" alt="Site admin" title="Site admin" />',
+ 'img_src' => $phpbb_root_path . 'images/ranks/siteadmin.png',
+ )
+ ),
+ array(array('group_id' => 1, 'group_rank' => 0), array('title' => null, 'img' => null, 'img_src' => null)),
+ array(array('group_id' => 2, 'group_rank' => 2), array('title' => 'Test member', 'img' => '', 'img_src' => '')),
+ );
+ }
+
+ /**
+ * @dataProvider get_rank_data
+ */
+ public function test_get_rank($group_data, $expected)
+ {
+ $this->assertEquals($expected, $this->group_helper->get_rank($group_data));
+ }
+}
diff --git a/tests/group/helper_test.php b/tests/group/helper_test.php
deleted file mode 100644
index 2377a6f47c..0000000000
--- a/tests/group/helper_test.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-/**
- *
- * This file is part of the phpBB Forum Software package.
- *
- * @copyright (c) phpBB Limited <https://www.phpbb.com>
- * @license GNU General Public License, version 2 (GPL-2.0)
- *
- * For full copyright and license information, please see
- * the docs/CREDITS.txt file.
- *
- */
-
-class phpbb_group_helper_test extends phpbb_test_case
-{
- /** @var \phpbb\group\helper */
- protected $group_helper;
-
- public function setUp()
- {
- global $phpbb_root_path, $phpEx;
-
- // Set up language service
- $lang = new \phpbb\language\language(
- new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)
- );
-
- // Set up language data for testing
- $reflection_class = new ReflectionClass('\phpbb\language\language');
-
- // Set default language files loaded flag to true
- $loaded_flag = $reflection_class->getProperty('common_language_files_loaded');
- $loaded_flag->setAccessible(true);
- $loaded_flag->setValue($lang, true);
-
- // Set up test language data
- $lang_array = $reflection_class->getProperty('lang');
- $lang_array->setAccessible(true);
- $lang_array->setValue($lang, $this->get_test_language_data_set());
-
- // Set up group helper
- $this->group_helper = new \phpbb\group\helper($lang);
- }
-
- public function test_get_name()
- {
- // They should be totally fine
- $this->assertEquals('Bots', $this->group_helper->get_name('Bots'));
- $this->assertEquals('Some new group', $this->group_helper->get_name('new_group'));
- $this->assertEquals('Should work', $this->group_helper->get_name('group_with_ümlauts'));
-
- // This should fail (obviously)
- $this->assertNotEquals('They key does not contain uppercase letters', $this->group_helper->get_name('not_uppercase'));
-
- // The key doesn't exist so just return group name...
- $this->assertEquals('Awesome group', $this->group_helper->get_name('Awesome group'));
- }
-
- protected function get_test_language_data_set()
- {
- return array(
- 'G_BOTS' => 'Bots',
- 'G_NEW_GROUP' => 'Some new group',
- 'G_not_uppercase' => 'The key does not contain uppercase letters',
- 'G_GROUP_WITH_ÜMLAUTS' => 'Should work',
- );
- }
-}
diff --git a/tests/group/helper_test_case.php b/tests/group/helper_test_case.php
new file mode 100644
index 0000000000..e298770331
--- /dev/null
+++ b/tests/group/helper_test_case.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+class phpbb_group_helper_test_case extends phpbb_test_case
+{
+ /** @var \phpbb\group\helper */
+ protected $group_helper;
+
+ protected function config_defaults()
+ {
+ $defaults = array(
+ 'ranks_path' => 'images/ranks'
+ );
+ return $defaults;
+ }
+
+ protected function get_test_language_data_set()
+ {
+ return array(
+ 'G_BOTS' => 'Bots',
+ 'G_NEW_GROUP' => 'Some new group',
+ 'G_not_uppercase' => 'The key does not contain uppercase letters',
+ 'G_GROUP_WITH_ÜMLAUTS' => 'Should work',
+ );
+ }
+
+ protected function get_test_rank_data_set()
+ {
+ return array(
+ 'special' => array(
+ 1 => array(
+ 'rank_id' => 1,
+ 'rank_title' => 'Site admin',
+ 'rank_special' => 1,
+ 'rank_image' => 'siteadmin.png',
+ ),
+ 2 => array(
+ 'rank_id' => 2,
+ 'rank_title' => 'Test member',
+ 'rank_special' => 1,
+ 'rank_image' => '',
+ )
+ )
+ );
+ }
+
+ protected function setup_engine(array $new_config = array())
+ {
+ global $phpbb_dispatcher, $phpbb_root_path, $phpEx;
+
+ // Set up authentication data for testing
+ $auth = $this->getMock('\phpbb\auth\auth');
+ $auth->expects($this->any())
+ ->method('acl_get')
+ ->with($this->stringContains('_'), $this->anything())
+ ->will($this->returnValueMap(array(
+ array('u_viewprofile', true),
+ )));
+
+ // Set up cache service
+ $cache_service = $this->getMockBuilder('\phpbb\cache\service')->disableOriginalConstructor()->getMock();
+ $cache_service->expects($this->any())
+ ->method('obtain_ranks')
+ ->will($this->returnValue($this->get_test_rank_data_set()));
+
+ // Set up configuration
+ $defaults = $this->config_defaults();
+ $config = new \phpbb\config\config(array_merge($defaults, $new_config));
+
+ // Set up language service
+ $lang = new \phpbb\language\language(
+ new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)
+ );
+
+ // Set up language data for testing
+ $reflection_class = new ReflectionClass('\phpbb\language\language');
+
+ // Set default language files loaded flag to true
+ $loaded_flag = $reflection_class->getProperty('common_language_files_loaded');
+ $loaded_flag->setAccessible(true);
+ $loaded_flag->setValue($lang, true);
+
+ // Set up test language data
+ $lang_array = $reflection_class->getProperty('lang');
+ $lang_array->setAccessible(true);
+ $lang_array->setValue($lang, $this->get_test_language_data_set());
+
+ // Set up event dispatcher
+ $phpbb_dispatcher = new phpbb_mock_event_dispatcher();
+
+ // Set up path helper
+ $path_helper = $this->getMockBuilder('\phpbb\path_helper')
+ ->disableOriginalConstructor()
+ ->setMethods(array())
+ ->getMock();
+ $path_helper->method('get_phpbb_root_path')
+ ->willReturn($phpbb_root_path);
+ $path_helper->method('get_php_ext')
+ ->willReturn($phpEx);
+ $path_helper->method('update_web_root_path')
+ ->will($this->returnArgument(0));
+
+ $user = new \phpbb\user($lang, '\phpbb\datetime');
+ $user->data['user_id'] = ANONYMOUS;
+
+ $this->group_helper = new \phpbb\group\helper($auth, $cache_service, $config, $lang, $phpbb_dispatcher, $path_helper, $user);
+ }
+
+ public function setUp()
+ {
+ $this->setup_engine();
+ }
+}
diff --git a/tests/lint_test.php b/tests/lint_test.php
index 70046bdfd2..8ab31f976c 100644
--- a/tests/lint_test.php
+++ b/tests/lint_test.php
@@ -67,6 +67,12 @@ class phpbb_lint_test extends phpbb_test_case
{
$files = array();
$dh = opendir($root);
+
+ if ($dh === false)
+ {
+ return $files;
+ }
+
while (($filename = readdir($dh)) !== false)
{
if ($filename == '.' || $filename == '..')
@@ -89,6 +95,7 @@ class phpbb_lint_test extends phpbb_test_case
// PHP Fatal error: Cannot declare class Container because the name is already in use in /var/www/projects/phpbb3/tests/../phpBB/vendor/symfony/dependency-injection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php on line 20
// https://gist.github.com/e003913ffd493da63cbc
dirname(__FILE__) . '/../phpBB/vendor',
+ dirname(__FILE__) . '/../node_modules',
)))
{
$files = array_merge($files, $this->check($path));
diff --git a/tests/migrator/get_callable_from_step_test.php b/tests/migrator/get_callable_from_step_test.php
new file mode 100644
index 0000000000..af636f5d21
--- /dev/null
+++ b/tests/migrator/get_callable_from_step_test.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ *
+ * This file is part of the phpBB Forum Software package.
+ *
+ * @copyright (c) phpBB Limited <https://www.phpbb.com>
+ * @license GNU General Public License, version 2 (GPL-2.0)
+ *
+ * For full copyright and license information, please see
+ * the docs/CREDITS.txt file.
+ *
+ */
+
+class get_callable_from_step_test extends phpbb_database_test_case
+{
+ public function setUp()
+ {
+ global $phpbb_root_path, $php_ext, $table_prefix, $phpbb_log;
+
+ parent::setUp();
+
+ $phpbb_log = $this->getMockBuilder('\phpbb\log\log')->disableOriginalConstructor()->getMock();
+ $db = $this->new_dbal();
+ $factory = new \phpbb\db\tools\factory();
+ $cache_service = $this->getMockBuilder('\phpbb\cache\service')->disableOriginalConstructor()->getMock();
+ $user = $this->getMockBuilder('\phpbb\user')->disableOriginalConstructor()->getMock();
+ $module_manager = new \phpbb\module\module_manager(
+ $this->getMockBuilder('\phpbb\cache\driver\dummy')->disableOriginalConstructor()->getMock(),
+ $db,
+ new phpbb_mock_extension_manager($phpbb_root_path),
+ 'phpbb_modules',
+ $phpbb_root_path,
+ $php_ext
+ );
+ $module_tools = new \phpbb\db\migration\tool\module($db, $cache_service, $user, $module_manager, $phpbb_root_path, $php_ext, 'phpbb_modules');
+ $this->migrator = new \phpbb\db\migrator(
+ new phpbb_mock_container_builder(),
+ new \phpbb\config\config(array()),
+ $db,
+ $factory->get($db),
+ 'phpbb_migrations',
+ $phpbb_root_path,
+ $php_ext,
+ $table_prefix,
+ array($module_tools),
+ new \phpbb\db\migration\helper()
+ );
+
+ if (!$module_tools->exists('acp', 0, 'new_module_langname'))
+ {
+ $module_tools->add('acp', 0, array(
+ 'module_basename' => 'new_module_basename',
+ 'module_langname' => 'new_module_langname',
+ 'module_mode' => 'settings',
+ 'module_auth' => '',
+ 'module_display' => true,
+ 'before' => false,
+ 'after' => false,
+ ));
+ $this->module_added = true;
+ }
+ }
+
+ public function getDataSet()
+ {
+ return $this->createXMLDataSet(dirname(__FILE__).'/../dbal/fixtures/migrator.xml');
+ }
+
+ public function get_callable_from_step_provider()
+ {
+ return array(
+ array(
+ array('if', array(
+ false,
+ array('permission.add', array('some_data')),
+ )),
+ true, // expects false
+ ),
+ array(
+ array('if', array(
+ array('module.exists', array(
+ 'mcp',
+ 'RANDOM_PARENT',
+ 'RANDOM_MODULE'
+ )),
+ array('permission.add', array('some_data')),
+ )),
+ true, // expects false
+ ),
+ array(
+ array('if', array(
+ array('module.exists', array(
+ 'acp',
+ 0,
+ 'new_module_langname'
+ )),
+ array('module.add', array(
+ 'acp',
+ 0,
+ 'module_basename' => 'new_module_basename2',
+ 'module_langname' => 'new_module_langname2',
+ 'module_mode' => 'settings',
+ 'module_auth' => '',
+ 'module_display' => true,
+ 'before' => false,
+ 'after' => false,
+ )),
+ )),
+ false, // expects false
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider get_callable_from_step_provider
+ */
+ public function test_get_callable_from_step($step, $expects_false)
+ {
+ if ($expects_false)
+ {
+ $this->assertFalse($this->call_get_callable_from_step($step));
+ }
+ else
+ {
+ $this->assertNotFalse($this->call_get_callable_from_step($step));
+ }
+ }
+
+ protected function call_get_callable_from_step($step)
+ {
+ $class = new ReflectionClass($this->migrator);
+ $method = $class->getMethod('get_callable_from_step');
+ $method->setAccessible(true);
+ return $method->invokeArgs($this->migrator, array($step));
+ }
+}
diff --git a/tests/mock/sql_insert_buffer.php b/tests/mock/sql_insert_buffer.php
index c751764d45..e57983684d 100644
--- a/tests/mock/sql_insert_buffer.php
+++ b/tests/mock/sql_insert_buffer.php
@@ -15,7 +15,7 @@ class phpbb_mock_sql_insert_buffer extends \phpbb\db\sql_insert_buffer
{
public function flush()
{
- return (sizeof($this->buffer)) ? true : false;
+ return (count($this->buffer)) ? true : false;
}
public function get_buffer()
diff --git a/tests/network/checkdnsrr_test.php b/tests/network/checkdnsrr_test.php
index 6503a4c40b..8cbd4f7e97 100644
--- a/tests/network/checkdnsrr_test.php
+++ b/tests/network/checkdnsrr_test.php
@@ -38,7 +38,7 @@ class phpbb_network_checkdnsrr_test extends phpbb_test_case
array('does-not-exist.phpbb.com', 'AAAA', false),
// Existing CNAME record
- array('news.cnet.com', 'CNAME', true),
+ array('area51.phpbb.com', 'CNAME', true),
// Non-existing CNAME record
array('does-not-exist.phpbb.com', 'CNAME', false),
diff --git a/tests/notification/base.php b/tests/notification/base.php
index b64e25cf8c..80b9a0d777 100644
--- a/tests/notification/base.php
+++ b/tests/notification/base.php
@@ -163,7 +163,7 @@ abstract class phpbb_tests_notification_base extends phpbb_database_test_case
'order_dir' => 'ASC',
), $options));
- $this->assertEquals(sizeof($expected), $notifications['unread_count']);
+ $this->assertEquals(count($expected), $notifications['unread_count']);
$i = 0;
foreach ($notifications['notifications'] as $notification)
diff --git a/tests/notification/fixtures/submit_post_notification.type.bookmark.xml b/tests/notification/fixtures/submit_post_notification.type.bookmark.xml
index 7f069abc59..db1cef2ef6 100644
--- a/tests/notification/fixtures/submit_post_notification.type.bookmark.xml
+++ b/tests/notification/fixtures/submit_post_notification.type.bookmark.xml
@@ -29,6 +29,7 @@
</row>
</table>
<table name="phpbb_notifications">
+ <column>notification_id</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
@@ -37,6 +38,7 @@
<column>notification_data</column>
<row>
<value>1</value>
+ <value>1</value>
<value>5</value>
<value>1</value>
<value>1</value>
diff --git a/tests/notification/fixtures/submit_post_notification.type.post.xml b/tests/notification/fixtures/submit_post_notification.type.post.xml
index a4bf9d3ee4..920b271525 100644
--- a/tests/notification/fixtures/submit_post_notification.type.post.xml
+++ b/tests/notification/fixtures/submit_post_notification.type.post.xml
@@ -21,6 +21,7 @@
</row>
</table>
<table name="phpbb_notifications">
+ <column>notification_id</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
@@ -29,6 +30,7 @@
<column>notification_data</column>
<row>
<value>1</value>
+ <value>1</value>
<value>5</value>
<value>1</value>
<value>1</value>
@@ -36,6 +38,7 @@
<value></value>
</row>
<row>
+ <value>2</value>
<value>1</value>
<value>8</value>
<value>1</value>
diff --git a/tests/notification/fixtures/submit_post_notification.type.post_in_queue.xml b/tests/notification/fixtures/submit_post_notification.type.post_in_queue.xml
index 0a955c48d2..12e73b0ff2 100644
--- a/tests/notification/fixtures/submit_post_notification.type.post_in_queue.xml
+++ b/tests/notification/fixtures/submit_post_notification.type.post_in_queue.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_notifications">
+ <column>notification_id</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
@@ -9,6 +10,7 @@
<column>notification_data</column>
<row>
<value>1</value>
+ <value>1</value>
<value>6</value>
<value>1</value>
<value>1</value>
diff --git a/tests/notification/fixtures/submit_post_notification.type.quote.xml b/tests/notification/fixtures/submit_post_notification.type.quote.xml
index c66830fbf5..9f4ba91475 100644
--- a/tests/notification/fixtures/submit_post_notification.type.quote.xml
+++ b/tests/notification/fixtures/submit_post_notification.type.quote.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_notifications">
+ <column>notification_id</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
@@ -9,6 +10,7 @@
<column>notification_data</column>
<row>
<value>1</value>
+ <value>1</value>
<value>5</value>
<value>1</value>
<value>1</value>
diff --git a/tests/notification/fixtures/submit_post_notification.type.topic.xml b/tests/notification/fixtures/submit_post_notification.type.topic.xml
index e0f6583f48..1f96ed2ee7 100644
--- a/tests/notification/fixtures/submit_post_notification.type.topic.xml
+++ b/tests/notification/fixtures/submit_post_notification.type.topic.xml
@@ -21,6 +21,7 @@
</row>
</table>
<table name="phpbb_notifications">
+ <column>notification_id</column>
<column>notification_type_id</column>
<column>user_id</column>
<column>item_id</column>
@@ -29,6 +30,7 @@
<column>notification_data</column>
<row>
<value>1</value>
+ <value>1</value>
<value>8</value>
<value>1</value>
<value>1</value>
diff --git a/tests/notification/group_request_test.php b/tests/notification/group_request_test.php
index 92e758a336..e849c66fa5 100644
--- a/tests/notification/group_request_test.php
+++ b/tests/notification/group_request_test.php
@@ -49,9 +49,23 @@ class phpbb_notification_group_request_test extends phpbb_tests_notification_bas
$this->cache->get_driver()
));
$this->container->set('group_helper', new \phpbb\group\helper(
+ $this->getMock('\phpbb\auth\auth'),
+ $this->cache,
+ $this->config,
new \phpbb\language\language(
new phpbb\language\language_file_loader($phpbb_root_path, $phpEx)
- )
+ ),
+ new phpbb_mock_event_dispatcher(),
+ new \phpbb\path_helper(
+ new \phpbb\symfony_request(
+ new phpbb_mock_request()
+ ),
+ new \phpbb\filesystem\filesystem(),
+ $this->getMock('\phpbb\request\request'),
+ $phpbb_root_path,
+ $phpEx
+ ),
+ $this->user
));
$phpbb_dispatcher = new phpbb_mock_event_dispatcher;
$phpbb_log = new \phpbb\log\dummy();
diff --git a/tests/notification/notification_test.php b/tests/notification/notification_test.php
index ec42aa193c..6bbabfc602 100644
--- a/tests/notification/notification_test.php
+++ b/tests/notification/notification_test.php
@@ -108,7 +108,7 @@ class phpbb_notification_test extends phpbb_tests_notification_base
$types = array('notification.type.quote', 'notification.type.bookmark', 'notification.type.post', 'test');
foreach ($types as $id => $type)
{
- $this->db->sql_query('INSERT INTO phpbb_notification_types ' .
+ $this->getConnection()->createQueryTable('insertNotification', 'INSERT INTO phpbb_notification_types ' .
$this->db->sql_build_array('INSERT', array(
'notification_type_id' => ($id + 1),
'notification_type_name' => $type,
diff --git a/tests/profilefields/type_string_test.php b/tests/profilefields/type_string_test.php
index 7c7fa3f3e6..54bb406838 100644
--- a/tests/profilefields/type_string_test.php
+++ b/tests/profilefields/type_string_test.php
@@ -24,7 +24,7 @@ class phpbb_profilefield_type_string_test extends phpbb_test_case
*/
public function setUp()
{
- global $request, $user, $cache, $phpbb_root_path, $phpEx;
+ global $config, $request, $user, $cache, $phpbb_root_path, $phpEx;
$user = $this->getMock('\phpbb\user', array(), array(
new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)),
@@ -34,6 +34,7 @@ class phpbb_profilefield_type_string_test extends phpbb_test_case
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
+ $config = new \phpbb\config\config([]);
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
@@ -269,6 +270,18 @@ class phpbb_profilefield_type_string_test extends phpbb_test_case
null,
'Field should simply output null for empty vlaue',
),
+ array(
+ 'http://foobar.com',
+ array('field_show_novalue' => false),
+ '<!-- l --><a class="postlink-local" href="http://foobar.com">foobar.com</a><!-- l -->',
+ 'Field should output the given value and make it clickable',
+ ),
+ array(
+ 'javascript://foobar.com',
+ array('field_show_novalue' => true),
+ 'javascript://foobar.com',
+ 'Field should output the given value but not make it clickable',
+ ),
);
}
diff --git a/tests/profilefields/type_url_test.php b/tests/profilefields/type_url_test.php
index 1d90e2c34c..3bb5d52899 100644
--- a/tests/profilefields/type_url_test.php
+++ b/tests/profilefields/type_url_test.php
@@ -11,6 +11,10 @@
*
*/
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
+require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
+
class phpbb_profilefield_type_url_test extends phpbb_test_case
{
protected $cp;
@@ -24,8 +28,10 @@ class phpbb_profilefield_type_url_test extends phpbb_test_case
*/
public function setUp()
{
- global $phpbb_root_path, $phpEx;
+ global $config, $request, $user, $cache, $phpbb_root_path, $phpEx;
+ $config = new \phpbb\config\config([]);
+ $cache = new phpbb_mock_cache;
$user = $this->getMock('\phpbb\user', array(), array(
new \phpbb\language\language(new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx)),
'\phpbb\datetime'
@@ -92,6 +98,19 @@ class phpbb_profilefield_type_url_test extends phpbb_test_case
'FIELD_INVALID_URL-field',
'Field should reject invalid URL having multi value parameters',
),
+ // Not allowed schemes
+ array(
+ 'ftp://example.com/',
+ array(),
+ 'FIELD_INVALID_URL-field',
+ 'Field should reject invalid URL having multi value parameters',
+ ),
+ array(
+ 'javascript://alert.com',
+ array(),
+ 'FIELD_INVALID_URL-field',
+ 'Field should reject invalid URL having multi value parameters',
+ ),
// IDN url type profilefields
array(
@@ -165,6 +184,55 @@ class phpbb_profilefield_type_url_test extends phpbb_test_case
);
}
+ public function profile_value_data()
+ {
+ return array(
+ array(
+ 'http://foobar.com',
+ array('field_show_novalue' => true),
+ '<!-- l --><a class="postlink-local" href="http://foobar.com">foobar.com</a><!-- l -->',
+ 'Field should output the given value',
+ ),
+ array(
+ 'http://foobar.com',
+ array('field_show_novalue' => false),
+ '<!-- l --><a class="postlink-local" href="http://foobar.com">foobar.com</a><!-- l -->',
+ 'Field should output the given value',
+ ),
+ array(
+ 'test',
+ array('field_show_novalue' => true),
+ null,
+ 'Field should output nothing for empty value',
+ ),
+ array(
+ 'test',
+ array('field_show_novalue' => false),
+ null,
+ 'Field should simply output null for empty value',
+ ),
+ array(
+ 'javascript://foobar.com',
+ array('field_show_novalue' => true),
+ null,
+ 'Field should output nothing for empty value',
+ ),
+ );
+ }
+
+
+ /**
+ * @dataProvider profile_value_data
+ */
+ public function test_get_profile_value($value, $field_options, $expected, $description)
+ {
+ $field_options = array_merge($this->field_options, $field_options);
+
+ $result = $this->cp->get_profile_value($value, $field_options);
+
+ $this->assertSame($expected, $result, $description);
+ }
+
/**
* @dataProvider profile_value_raw_data
*/
diff --git a/tests/random/gen_rand_string_test.php b/tests/random/gen_rand_string_test.php
index a9d1ea20de..428db6ac98 100644
--- a/tests/random/gen_rand_string_test.php
+++ b/tests/random/gen_rand_string_test.php
@@ -40,7 +40,10 @@ class phpbb_random_gen_rand_string_test extends phpbb_test_case
$random_string_length = strlen($random_string);
$this->assertTrue($random_string_length >= self::MIN_STRING_LENGTH);
- $this->assertTrue($random_string_length <= $num_chars);
+ $this->assertTrue(
+ $random_string_length == $num_chars,
+ sprintf('Failed asserting that random string length matches expected length. Expected %1$u, Actual %2$u', $num_chars, $random_string_length)
+ );
$this->assertRegExp('#^[A-Z0-9]+$#', $random_string);
}
}
@@ -56,7 +59,10 @@ class phpbb_random_gen_rand_string_test extends phpbb_test_case
$random_string_length = strlen($random_string);
$this->assertTrue($random_string_length >= self::MIN_STRING_LENGTH);
- $this->assertTrue($random_string_length <= $num_chars);
+ $this->assertTrue(
+ $random_string_length == $num_chars,
+ sprintf('Failed asserting that random string length matches expected length. Expected %1$u, Actual %2$u', $num_chars, $random_string_length)
+ );
$this->assertRegExp('#^[A-NP-Z1-9]+$#', $random_string);
}
}
diff --git a/tests/request/type_cast_helper_test.php b/tests/request/type_cast_helper_test.php
index 143c05aa9c..6407dca894 100644
--- a/tests/request/type_cast_helper_test.php
+++ b/tests/request/type_cast_helper_test.php
@@ -20,16 +20,6 @@ class phpbb_type_cast_helper_test extends phpbb_test_case
$this->type_cast_helper = new \phpbb\request\type_cast_helper();
}
- public function test_addslashes_recursively()
- {
- $data = array('some"string' => array('that"' => 'really"', 'needs"' => '"escaping'));
- $expected = array('some\\"string' => array('that\\"' => 'really\\"', 'needs\\"' => '\\"escaping'));
-
- $this->type_cast_helper->addslashes_recursively($data);
-
- $this->assertEquals($expected, $data);
- }
-
public function test_simple_recursive_set_var()
{
$data = 'eviL<3';
diff --git a/tests/search/fixtures/posts.xml b/tests/search/fixtures/posts.xml
index 16232b8f39..4916cd188b 100644
--- a/tests/search/fixtures/posts.xml
+++ b/tests/search/fixtures/posts.xml
@@ -1,25 +1,30 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_posts">
+ <column>post_id</column>
<column>post_username</column>
<column>post_subject</column>
<column>post_text</column>
<row>
+ <value>1</value>
<value>foo</value>
<value>foo</value>
<value>foo</value>
</row>
<row>
+ <value>2</value>
<value>bar</value>
<value>bar</value>
<value>bar</value>
</row>
<row>
+ <value>3</value>
<value>commonword</value>
<value>commonword</value>
<value>commonword</value>
</row>
<row>
+ <value>4</value>
<value>baaz</value>
<value>baaz</value>
<value>baaz</value>
diff --git a/tests/search/native_test.php b/tests/search/native_test.php
index 29d0d0a8d3..0e6f719cef 100644
--- a/tests/search/native_test.php
+++ b/tests/search/native_test.php
@@ -70,7 +70,7 @@ class phpbb_search_native_test extends phpbb_search_test_case
'ba*az',
'all',
true,
- array('\'ba%az\''),
+ array(4),
array(),
array(),
),
@@ -78,7 +78,7 @@ class phpbb_search_native_test extends phpbb_search_test_case
'ba*z',
'all',
true,
- array('\'ba%z\''),
+ array(), // <= 3 chars after removing *
array(),
array(),
),
@@ -86,7 +86,7 @@ class phpbb_search_native_test extends phpbb_search_test_case
'baa* baaz*',
'all',
true,
- array('\'baa%\'', '\'baaz%\''),
+ array('\'baa%\'', 4),
array(),
array(),
),
@@ -94,7 +94,7 @@ class phpbb_search_native_test extends phpbb_search_test_case
'ba*z baa*',
'all',
true,
- array('\'ba%z\'', '\'baa%\''),
+ array('\'baa%\''), // baz is <= 3 chars, only baa* is left
array(),
array(),
),
diff --git a/tests/security/redirect_test.php b/tests/security/redirect_test.php
index 40cb7d2f04..0177eb4259 100644
--- a/tests/security/redirect_test.php
+++ b/tests/security/redirect_test.php
@@ -109,7 +109,7 @@ class phpbb_security_redirect_test extends phpbb_security_test_base
if ($expected_error !== false)
{
- $this->setExpectedTriggerError(E_USER_ERROR, $user->lang[$expected_error]);
+ $this->setExpectedTriggerError(E_USER_WARNING, $user->lang[$expected_error]);
}
$result = redirect($test, true, $disable_cd_check);
diff --git a/tests/session/check_ban_test.php b/tests/session/check_ban_test.php
index 04da5f08b9..16a65b0ade 100644
--- a/tests/session/check_ban_test.php
+++ b/tests/session/check_ban_test.php
@@ -72,7 +72,8 @@ class phpbb_session_check_ban_test extends phpbb_session_test_case
{
try
{
- $is_banned = $this->session->check_ban($user_id, $user_ips, $user_email, $return);
+ $ban = $this->session->check_ban($user_id, $user_ips, $user_email, $return);
+ $is_banned = !empty($ban);
}
catch (PHPUnit_Framework_Error_Notice $e)
{
diff --git a/tests/template/context_test.php b/tests/template/context_test.php
new file mode 100644
index 0000000000..52ce6c8fde
--- /dev/null
+++ b/tests/template/context_test.php
@@ -0,0 +1,96 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class context_test extends phpbb_test_case
+{
+ protected $context;
+ protected function setUp()
+ {
+ $this->context = new \phpbb\template\context();
+
+ for ($i = 0; $i < 10; $i++)
+ {
+ $this->context->assign_block_vars('block' . $i, array(
+ 'FOO' . $i => 'foo' . $i,
+ 'BAR' . $i => 'bar' . $i,
+ ));
+
+ for ($j = 0; $j < 10; $j++)
+ {
+ $this->context->assign_block_vars('block' . $i . '.subblock', array(
+ 'SUBFOO' => 'subfoo' . $j,
+ 'SUBBAR' => 'subbar' . $j,
+ ));
+
+ for ($k = 0; $k < 10; $k++)
+ {
+ $this->context->assign_block_vars('block' . $i . '.subblock.subsubblock', array(
+ 'SUBSUBFOO' => 'subsubfoo' . $k,
+ 'SUBSUBBAR' => 'subsubbar' . $k,
+ ));
+ }
+ }
+ }
+ }
+
+ public function retrieve_block_vars_data()
+ {
+ return array(
+ array('foo', array(), array()), // non-existent top-level block
+ array('block1.foo', array(), array()), // non-existent sub-level block
+ array('block1', array(), array( // top-level block, all vars
+ 'FOO1' => 'foo1',
+ 'BAR1' => 'bar1',
+ )),
+ array('block1', array('FOO1'), array( // top-level block, one var
+ 'FOO1' => 'foo1',
+ )),
+ array('block2.subblock', array(), array( // sub-level block, all vars
+ 'SUBFOO' => 'subfoo9',
+ 'SUBBAR' => 'subbar9',
+ )),
+ array('block2.subblock', array('SUBBAR'), array( // sub-level block, one var
+ 'SUBBAR' => 'subbar9',
+ )),
+ array('block2.subblock.subsubblock', array(), array( // sub-sub-level block, all vars
+ 'SUBSUBFOO' => 'subsubfoo9',
+ 'SUBSUBBAR' => 'subsubbar9',
+ )),
+ array('block2.subblock.subsubblock', array('SUBSUBBAR'), array( // sub-sub-level block, one var
+ 'SUBSUBBAR' => 'subsubbar9',
+ )),
+ array('block3.subblock[2]', array(), array( // sub-level, exact index, all vars
+ 'SUBFOO' => 'subfoo2',
+ 'SUBBAR' => 'subbar2',
+ )),
+ array('block3.subblock[2]', array('SUBBAR'), array( // sub-level, exact index, one var
+ 'SUBBAR' => 'subbar2',
+ )),
+ array('block3.subblock[3].subsubblock[5]', array(), array( // sub-sub-level, exact index, all vars
+ 'SUBSUBFOO' => 'subsubfoo5',
+ 'SUBSUBBAR' => 'subsubbar5',
+ )),
+ array('block3.subblock[4].subsubblock[6]', array('SUBSUBFOO'), array( // sub-sub-level, exact index, one var
+ 'SUBSUBFOO' => 'subsubfoo6',
+ )),
+ );
+ }
+
+ /**
+ * @dataProvider retrieve_block_vars_data
+ */
+ public function test_retrieve_block_vars($blockname, $vararray, $result)
+ {
+ $this->assertEquals($result, $this->context->retrieve_block_vars($blockname, $vararray));
+ }
+}
diff --git a/tests/template/template_includecss_test.php b/tests/template/template_includecss_test.php
index bc871aa612..4eb30eda1e 100644
--- a/tests/template/template_includecss_test.php
+++ b/tests/template/template_includecss_test.php
@@ -95,19 +95,19 @@ class phpbb_template_template_includecss_test extends phpbb_template_template_te
*/
array(
array('TEST' => 1),
- '<link href="tests/template/templates/child_only.css?assets_version=1" rel="stylesheet" type="text/css" media="screen" />',
+ '<link href="tests/template/templates/child_only.css?assets_version=1" rel="stylesheet" media="screen" />',
),
array(
array('TEST' => 2),
- '<link href="tests/template/parent_templates/parent_only.css?assets_version=1" rel="stylesheet" type="text/css" media="screen" />',
+ '<link href="tests/template/parent_templates/parent_only.css?assets_version=1" rel="stylesheet" media="screen" />',
),
array(
array('TEST' => 3),
- '<link href="tests/template/ext/include/css/styles/all/theme/test.css?assets_version=1" rel="stylesheet" type="text/css" media="screen" />',
+ '<link href="tests/template/ext/include/css/styles/all/theme/test.css?assets_version=1" rel="stylesheet" media="screen" />',
),
array(
array('TEST' => 4),
- '<link href="tests/template/ext/include/css/styles/all/theme/child_only.css?assets_version=1" rel="stylesheet" type="text/css" media="screen" />',
+ '<link href="tests/template/ext/include/css/styles/all/theme/child_only.css?assets_version=1" rel="stylesheet" media="screen" />',
),
);
}
diff --git a/tests/template/template_includejs_test.php b/tests/template/template_includejs_test.php
index 232f551b4a..19c016ae5e 100644
--- a/tests/template/template_includejs_test.php
+++ b/tests/template/template_includejs_test.php
@@ -28,67 +28,67 @@ class phpbb_template_template_includejs_test extends phpbb_template_template_tes
*/
array(
array('TEST' => 1),
- '<script type="text/javascript" src="tests/template/templates/parent_and_child.js?assets_version=1"></script>',
+ '<script src="tests/template/templates/parent_and_child.js?assets_version=1"></script>',
),
array(
array('TEST' => 2),
- '<script type="text/javascript" src="tests/template/templates/parent_and_child.js?assets_version=0"></script>',
+ '<script src="tests/template/templates/parent_and_child.js?assets_version=0"></script>',
),
array(
array('TEST' => 3),
- '<script type="text/javascript" src="tests/template/templates/parent_and_child.js?test=1&assets_version=0"></script>',
+ '<script src="tests/template/templates/parent_and_child.js?test=1&assets_version=0"></script>',
),
array(
array('TEST' => 4),
- '<script type="text/javascript" src="tests/template/templates/parent_and_child.js?test=1&amp;assets_version=0"></script>',
+ '<script src="tests/template/templates/parent_and_child.js?test=1&amp;assets_version=0"></script>',
),
array(
array('TEST' => 6),
- '<script type="text/javascript" src="tests/template/parent_templates/parent_only.js?assets_version=1"></script>',
+ '<script src="tests/template/parent_templates/parent_only.js?assets_version=1"></script>',
),
array(
array('TEST' => 7),
- '<script type="text/javascript" src="tests/template/templates/child_only.js?assets_version=1"></script>',
+ '<script src="tests/template/templates/child_only.js?assets_version=1"></script>',
),
array(
array('TEST' => 8),
- '<script type="text/javascript" src="tests/template/templates/subdir/parent_only.js?assets_version=1"></script>',
+ '<script src="tests/template/templates/subdir/parent_only.js?assets_version=1"></script>',
),
array(
array('TEST' => 9),
- '<script type="text/javascript" src="tests/template/templates/subdir/subsubdir/parent_only.js?assets_version=1"></script>',
+ '<script src="tests/template/templates/subdir/subsubdir/parent_only.js?assets_version=1"></script>',
),
array(
array('TEST' => 10),
- '<script type="text/javascript" src="tests/template/templates/subdir/parent_only.js?assets_version=1"></script>',
+ '<script src="tests/template/templates/subdir/parent_only.js?assets_version=1"></script>',
),
array(
array('TEST' => 11),
- '<script type="text/javascript" src="tests/template/templates/child_only.js?test1=1&amp;test2=2&amp;assets_version=1#test3"></script>',
+ '<script src="tests/template/templates/child_only.js?test1=1&amp;test2=2&amp;assets_version=1#test3"></script>',
),
array(
array('TEST' => 12),
- '<script type="text/javascript" src="tests/template/parent_templates/parent_only.js?test1=1&amp;test2=2&amp;assets_version=1#test3"></script>',
+ '<script src="tests/template/parent_templates/parent_only.js?test1=1&amp;test2=2&amp;assets_version=1#test3"></script>',
),
array(
array('TEST' => 14),
- '<script type="text/javascript" src="tests/template/parent_templates/parent_only.js?test1=&quot;&amp;assets_version=1#test3"></script>',
+ '<script src="tests/template/parent_templates/parent_only.js?test1=&quot;&amp;assets_version=1#test3"></script>',
),
array(
array('TEST' => 15),
- '<script type="text/javascript" src="http://phpbb.com/b.js?c=d#f"></script>',
+ '<script src="http://phpbb.com/b.js?c=d#f"></script>',
),
array(
array('TEST' => 16),
- '<script type="text/javascript" src="http://phpbb.com/b.js?c=d&assets_version=2#f"></script>',
+ '<script src="http://phpbb.com/b.js?c=d&assets_version=2#f"></script>',
),
array(
array('TEST' => 17),
- '<script type="text/javascript" src="//phpbb.com/b.js"></script>',
+ '<script src="//phpbb.com/b.js"></script>',
),
array(
array('TEST' => 18),
- '<script type="text/javascript" src="tests/template/templates/parent_and_child.js?test=1&test2=0&amp;assets_version=1"></script>',
+ '<script src="tests/template/templates/parent_and_child.js?test=1&test2=0&amp;assets_version=1"></script>',
),
);
}
diff --git a/tests/template/template_test.php b/tests/template/template_test.php
index 9f2124418d..727f35e9d2 100644
--- a/tests/template/template_test.php
+++ b/tests/template/template_test.php
@@ -364,7 +364,7 @@ class phpbb_template_template_test extends phpbb_template_template_test_case
array(),
array(),
array(),
- "Value'\n1 O'Clock\nValue\\x27\n1\\x20O\\x27Clock",
+ "Value'\n1 O'Clock\nValue\\u0027\n1\\u0020O\\u0027Clock",
array('VARIABLE' => "Value'", '1_VARIABLE' => "1 O'Clock"),
),
array(
@@ -998,6 +998,46 @@ EOT
$this->assertEquals($expect, str_replace(array("\n", "\r", "\t"), '', $this->display('test')), 'Deleting by index out of bounds, ignored');
}
+ public function test_indexed_assign_block_vars()
+ {
+ $this->template->set_filenames(array('test' => 'loop_nested.html'));
+
+ $this->template->assign_var('TEST_MORE', true);
+
+ // @todo Change this
+ $this->template->assign_block_vars('outer', array());
+ $this->template->assign_block_vars('outer.middle', array());
+ $this->template->assign_block_vars('outer', array());
+ $this->template->assign_block_vars('outer.middle', array());
+ $this->template->assign_block_vars('outer.middle', array());
+ $this->template->assign_block_vars('outer', array());
+ $this->template->assign_block_vars('outer.middle', array());
+ $this->template->assign_block_vars('outer.middle', array());
+ $this->template->assign_block_vars('outer.middle', array());
+
+ $expect = 'outer - 0[outer|3]middle - 0[middle|1]outer - 1[outer|3]middle - 0[middle|2]middle - 1[middle|2]outer - 2[outer|3]middle - 0[middle|3]middle - 1[middle|3]middle - 2[middle|3]';
+ $this->assertEquals($expect, str_replace(array("\n", "\r", "\t"), '', $this->display('test')), 'Ensuring template is built correctly before modification');
+
+ $this->template->assign_block_vars('outer[0].middle', array('VARIABLE' => 'test'));
+
+ $expect = 'outer - 0[outer|3]middle - 0[middle|2]middle - 1 - test[middle|2]outer - 1[outer|3]middle - 0[middle|2]middle - 1[middle|2]outer - 2[outer|3]middle - 0[middle|3]middle - 1[middle|3]middle - 2[middle|3]';
+ $this->assertEquals($expect, str_replace(array("\n", "\r", "\t"), '', $this->display('test')), 'Inserting at the first outer block');
+
+ $this->template->assign_block_vars('outer[1].middle[0].inner', array());
+
+ $expect = 'outer - 0[outer|3]middle - 0[middle|2]middle - 1 - test[middle|2]outer - 1[outer|3]middle - 0[middle|2]inner - 0[inner|1]middle - 1[middle|2]outer - 2[outer|3]middle - 0[middle|3]middle - 1[middle|3]middle - 2[middle|3]';
+ $this->assertEquals($expect, str_replace(array("\n", "\r", "\t"), '', $this->display('test')), 'Creating an inner block at the first middle block in the second outer block');
+
+ $this->template->assign_block_vars('outer[1].middle[0].inner', array());
+
+ $expect = 'outer - 0[outer|3]middle - 0[middle|2]middle - 1 - test[middle|2]outer - 1[outer|3]middle - 0[middle|2]inner - 0[inner|2]inner - 1[inner|2]middle - 1[middle|2]outer - 2[outer|3]middle - 0[middle|3]middle - 1[middle|3]middle - 2[middle|3]';
+ $this->assertEquals($expect, str_replace(array("\n", "\r", "\t"), '', $this->display('test')), 'Inserting another inner block in the same place');
+
+ $this->template->assign_block_vars('outer.middle[1].inner', array('VARIABLE' => 'test'));
+
+ $expect = 'outer - 0[outer|3]middle - 0[middle|2]middle - 1 - test[middle|2]outer - 1[outer|3]middle - 0[middle|2]inner - 0[inner|2]inner - 1[inner|2]middle - 1[middle|2]outer - 2[outer|3]middle - 0[middle|3]middle - 1[middle|3]inner - 0 - test[inner|1]middle - 2[middle|3]';
+ $this->assertEquals($expect, str_replace(array("\n", "\r", "\t"), '', $this->display('test')), 'Inserting another inner block in the same place');
+ }
public function assign_block_vars_array_data()
{
diff --git a/tests/template/templates/loop_nested.html b/tests/template/templates/loop_nested.html
index cf099ecc15..5763262781 100644
--- a/tests/template/templates/loop_nested.html
+++ b/tests/template/templates/loop_nested.html
@@ -2,5 +2,8 @@
outer - {outer.S_ROW_COUNT}<!-- IF outer.VARIABLE --> - {outer.VARIABLE}<!-- ENDIF --><!-- IF TEST_MORE -->[{outer.S_BLOCK_NAME}|{outer.S_NUM_ROWS}]<!-- ENDIF -->
<!-- BEGIN middle -->
middle - {outer.middle.S_ROW_COUNT}<!-- IF outer.middle.VARIABLE --> - {outer.middle.VARIABLE}<!-- ENDIF --><!-- IF TEST_MORE -->[{outer.middle.S_BLOCK_NAME}|{outer.middle.S_NUM_ROWS}]<!-- ENDIF -->
+<!-- BEGIN inner -->
+inner - {outer.middle.inner.S_ROW_COUNT}<!-- IF outer.middle.inner.VARIABLE --> - {outer.middle.inner.VARIABLE}<!-- ENDIF --><!-- IF TEST_MORE -->[{outer.middle.inner.S_BLOCK_NAME}|{outer.middle.inner.S_NUM_ROWS}]<!-- ENDIF -->
+<!-- END inner -->
<!-- END middle -->
<!-- END outer -->
diff --git a/tests/test_framework/phpbb_database_test_case.php b/tests/test_framework/phpbb_database_test_case.php
index b7386e9a3e..606c40a623 100644
--- a/tests/test_framework/phpbb_database_test_case.php
+++ b/tests/test_framework/phpbb_database_test_case.php
@@ -142,9 +142,86 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
$manager->database_synchronisation($table_column_map);
}
+ /**
+ * Create xml data set for insertion into database
+ *
+ * @param string $path Path to fixture XML
+ * @return PHPUnit_Extensions_Database_DataSet_DefaultDataSet|PHPUnit_Extensions_Database_DataSet_XmlDataSet
+ */
public function createXMLDataSet($path)
{
$this->fixture_xml_data = parent::createXMLDataSet($path);
+
+ // Extend XML data set on MSSQL
+ if (strpos($this->get_database_config()['dbms'], 'mssql') !== false)
+ {
+ $newXmlData = new PHPUnit_Extensions_Database_DataSet_DefaultDataSet();
+ $db = $this->new_dbal();
+ foreach ($this->fixture_xml_data as $key => $value)
+ {
+ /** @var \PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData $tableMetaData */
+ $tableMetaData = $value->getTableMetaData();
+ $columns = $tableMetaData->getColumns();
+ $primaryKeys = $tableMetaData->getPrimaryKeys();
+
+ $sql = "SELECT COLUMN_NAME AS identity_column
+ FROM INFORMATION_SCHEMA.COLUMNS
+ WHERE COLUMNPROPERTY(object_id(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
+ AND TABLE_NAME = '$key'
+ ORDER BY TABLE_NAME";
+ $result = $db->sql_query($sql);
+ $identity_columns = $db->sql_fetchrowset($result);
+ $has_default_identity = false;
+ $add_primary_keys = false;
+
+ // Iterate over identity columns to check for missing primary
+ // keys in data set and special identity column 'mssqlindex'
+ // that might have been added when no default identity column
+ // exists in the current table.
+ foreach ($identity_columns as $column)
+ {
+ if (in_array($column['identity_column'], $columns) && !in_array($column['identity_column'], $primaryKeys))
+ {
+ $primaryKeys[] = $column['identity_column'];
+ $add_primary_keys = true;
+ }
+
+ if ($column['identity_column'] === 'mssqlindex')
+ {
+ $has_default_identity = true;
+ break;
+ }
+ }
+
+ if ($has_default_identity || $add_primary_keys)
+ {
+ // Add default identity column to columns list
+ if ($has_default_identity)
+ {
+ $columns[] = 'mssqlindex';
+ }
+
+ $newMetaData = new PHPUnit_Extensions_Database_DataSet_DefaultTableMetaData($key, $columns, $primaryKeys);
+ $newTable = new PHPUnit_Extensions_Database_DataSet_DefaultTable($newMetaData);
+ for ($i = 0; $i < $value->getRowCount(); $i++)
+ {
+ $dataRow = $value->getRow($i);
+ if ($has_default_identity)
+ {
+ $dataRow['mssqlindex'] = $i + 1;
+ }
+ $newTable->addRow($dataRow);
+ }
+ $newXmlData->addTable($newTable);
+ }
+ else
+ {
+ $newXmlData->addTable($value);
+ }
+ }
+
+ $this->fixture_xml_data = $newXmlData;
+ }
return $this->fixture_xml_data;
}
@@ -229,7 +306,7 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
{
// http://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important
// but one array_diff is not enough!
- if (sizeof(array_diff($one, $two)) || sizeof(array_diff($two, $one)))
+ if (count(array_diff($one, $two)) || count(array_diff($two, $one)))
{
// get a nice error message
$this->assertEquals($one, $two);
diff --git a/tests/test_framework/phpbb_database_test_connection_manager.php b/tests/test_framework/phpbb_database_test_connection_manager.php
index 147029d699..f3adbefc1b 100644
--- a/tests/test_framework/phpbb_database_test_connection_manager.php
+++ b/tests/test_framework/phpbb_database_test_connection_manager.php
@@ -222,6 +222,14 @@ class phpbb_database_test_connection_manager
$this->purge_extras();
break;
+ case 'phpbb\db\driver\mssql':
+ case 'phpbb\db\driver\mssqlnative':
+ $this->connect();
+ // Drop all tables
+ $this->pdo->exec("EXEC sp_MSforeachtable 'DROP TABLE ?'");
+ $this->purge_extras();
+ break;
+
default:
$this->connect(false);
@@ -621,7 +629,7 @@ class phpbb_database_test_connection_manager
}
// Combine all of the SETVALs into one query
- if (sizeof($setval_queries))
+ if (count($setval_queries))
{
$queries[] = 'SELECT ' . implode(', ', $setval_queries);
}
diff --git a/tests/test_framework/phpbb_functional_test_case.php b/tests/test_framework/phpbb_functional_test_case.php
index eb56049515..4d294fd523 100644
--- a/tests/test_framework/phpbb_functional_test_case.php
+++ b/tests/test_framework/phpbb_functional_test_case.php
@@ -397,6 +397,14 @@ class phpbb_functional_test_case extends phpbb_test_case
global $phpbb_container;
$phpbb_container->reset();
+ // Purge cache to remove cached files
+ $phpbb_container = new phpbb_mock_container_builder();
+ $phpbb_container->setParameter('core.environment', PHPBB_ENVIRONMENT);
+ $phpbb_container->setParameter('core.cache_dir', $phpbb_root_path . 'cache/' . PHPBB_ENVIRONMENT . '/');
+
+ $cache = new \phpbb\cache\driver\file;
+ $cache->purge();
+
$blacklist = ['phpbb_class_loader_mock', 'phpbb_class_loader_ext', 'phpbb_class_loader'];
foreach (array_keys($GLOBALS) as $key)
@@ -425,7 +433,7 @@ class phpbb_functional_test_case extends phpbb_test_case
$meta_refresh = $crawler->filter('meta[http-equiv="refresh"]');
// Wait for extension to be fully enabled
- while (sizeof($meta_refresh))
+ while (count($meta_refresh))
{
preg_match('#url=.+/(adm+.+)#', $meta_refresh->attr('content'), $match);
$url = $match[1];
@@ -509,7 +517,6 @@ class phpbb_functional_test_case extends phpbb_test_case
else
{
$db->sql_multi_insert(STYLES_TABLE, array(array(
- 'style_id' => $style_id,
'style_name' => $style_path,
'style_copyright' => '',
'style_active' => 1,
@@ -551,9 +558,10 @@ class phpbb_functional_test_case extends phpbb_test_case
* Creates a new user with limited permissions
*
* @param string $username Also doubles up as the user's password
+ * @param string $email User email (defaults to nobody@example.com)
* @return int ID of created user
*/
- protected function create_user($username)
+ protected function create_user($username, $email = 'nobody@example.com')
{
// Required by unique_id
global $config;
@@ -572,6 +580,9 @@ class phpbb_functional_test_case extends phpbb_test_case
$config['rand_seed'] = '';
$config['rand_seed_last_update'] = time() + 600;
+ // Prevent new user to have an invalid style
+ $config['default_style'] = 1;
+
// Required by user_add
global $db, $cache, $phpbb_dispatcher, $phpbb_container;
$db = $this->get_db();
@@ -602,7 +613,7 @@ class phpbb_functional_test_case extends phpbb_test_case
$user_row = array(
'username' => $username,
'group_id' => 2,
- 'user_email' => 'nobody@example.com',
+ 'user_email' => $email,
'user_type' => 0,
'user_lang' => 'en',
'user_timezone' => 'UTC',
@@ -909,10 +920,15 @@ class phpbb_functional_test_case extends phpbb_test_case
* status code. This assertion tries to catch that.
*
* @param int $status_code Expected status code
- * @return null
+ * @return void
*/
static public function assert_response_status_code($status_code = 200)
{
+ if ($status_code != self::$client->getResponse()->getStatus() &&
+ preg_match('/^5[0-9]{2}/', self::$client->getResponse()->getStatus()))
+ {
+ self::fail("Encountered unexpected server error:\n" . self::$client->getResponse()->getContent());
+ }
self::assertEquals($status_code, self::$client->getResponse()->getStatus(), 'HTTP status code does not match');
}
@@ -987,7 +1003,7 @@ class phpbb_functional_test_case extends phpbb_test_case
$this->assertEquals(
1,
- sizeof($result),
+ count($result),
$message ?: 'Failed asserting that exactly one checkbox with name' .
" $name exists in crawler scope."
);
@@ -1169,10 +1185,6 @@ class phpbb_functional_test_case extends phpbb_test_case
}
}
- // Bypass time restriction that said that if the lastclick time (i.e. time when the form was opened)
- // is not at least 2 seconds before submission, cancel the form
- $form_data['lastclick'] = 0;
-
// I use a request because the form submission method does not allow you to send data that is not
// contained in one of the actual form fields that the browser sees (i.e. it ignores "hidden" inputs)
// Instead, I send it as a request with the submit button "post" set to true.
diff --git a/tests/test_framework/phpbb_test_case_helpers.php b/tests/test_framework/phpbb_test_case_helpers.php
index 7fb9a740b8..c792976b1e 100644
--- a/tests/test_framework/phpbb_test_case_helpers.php
+++ b/tests/test_framework/phpbb_test_case_helpers.php
@@ -385,7 +385,7 @@ class phpbb_test_case_helpers
$mb = $this->test_case->getMockBuilder('phpbb\\textformatter\\data_access');
$mb->setMethods(array('get_bbcodes', 'get_censored_words', 'get_smilies', 'get_styles'));
$mb->setConstructorArgs(array(
- $this->test_case->getMock('phpbb\\db\\driver\\driver'),
+ $this->test_case->getMockBuilder('phpbb\\db\\driver\\driver')->getMock(),
'phpbb_bbcodes',
'phpbb_smilies',
'phpbb_styles',
@@ -489,8 +489,11 @@ class phpbb_test_case_helpers
$request = new phpbb_mock_request;
}
+ // Get a log interface
+ $log = ($container->has('log')) ? $container->get('log') : $this->test_case->getMockBuilder('phpbb\\log\\log_interface')->getMock();
+
// Create and register the text_formatter.s9e.factory service
- $factory = new \phpbb\textformatter\s9e\factory($dal, $cache, $dispatcher, $config, new \phpbb\textformatter\s9e\link_helper, $cache_dir, $cache_key_parser, $cache_key_renderer);
+ $factory = new \phpbb\textformatter\s9e\factory($dal, $cache, $dispatcher, $config, new \phpbb\textformatter\s9e\link_helper, $log, $cache_dir, $cache_key_parser, $cache_key_renderer);
$container->set('text_formatter.s9e.factory', $factory);
// Create a user if none was provided, and add the common lang strings
diff --git a/tests/test_framework/phpbb_ui_test_case.php b/tests/test_framework/phpbb_ui_test_case.php
index b875d3212b..4d88d7d9cb 100644
--- a/tests/test_framework/phpbb_ui_test_case.php
+++ b/tests/test_framework/phpbb_ui_test_case.php
@@ -11,6 +11,7 @@
*
*/
+use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\Exception\WebDriverCurlException;
use Facebook\WebDriver\Remote\RemoteWebDriver;
@@ -79,8 +80,15 @@ class phpbb_ui_test_case extends phpbb_test_case
}
try {
- $capabilities = DesiredCapabilities::firefox();
- self::$webDriver = RemoteWebDriver::create(self::$host . ':' . self::$port, $capabilities);
+ $capabilities = DesiredCapabilities::chrome();
+ $chromeOptions = (new ChromeOptions)->addArguments(['headless', 'disable-gpu']);
+ $capabilities->setCapability(ChromeOptions::CAPABILITY, $chromeOptions);
+ self::$webDriver = RemoteWebDriver::create(
+ self::$host . ':' . self::$port,
+ $capabilities,
+ 30 * 1000, // 30 seconds connection timeout
+ 30 * 1000 // 30 seconds request timeout
+ );
} catch (WebDriverCurlException $e) {
self::markTestSkipped('PhantomJS webserver is not running.');
}
@@ -192,6 +200,13 @@ class phpbb_ui_test_case extends phpbb_test_case
}
}
+ $install_config_file = $phpbb_root_path . 'store/install_config.php';
+
+ if (file_exists($install_config_file))
+ {
+ unlink($install_config_file);
+ }
+
$container_builder = new \phpbb\di\container_builder($phpbb_root_path, $phpEx);
$container = $container_builder
->with_environment('installer')
@@ -205,11 +220,14 @@ class phpbb_ui_test_case extends phpbb_test_case
],
'cache.driver.class' => 'phpbb\cache\driver\file'
])
+ ->with_config(new \phpbb\config_php_file($phpbb_root_path, $phpEx))
->without_compiled_container()
->get_container();
$container->register('installer.install_finish.notify_user')->setSynthetic(true);
$container->set('installer.install_finish.notify_user', new phpbb_mock_null_installer_task());
+ $container->register('installer.install_finish.install_extensions')->setSynthetic(true);
+ $container->set('installer.install_finish.install_extensions', new phpbb_mock_null_installer_task());
$container->compile();
$language = $container->get('language');
@@ -317,7 +335,7 @@ class phpbb_ui_test_case extends phpbb_test_case
$meta_refresh = $this->find_element('cssSelector', 'meta[http-equiv="refresh"]');
// Wait for extension to be fully enabled
- while (sizeof($meta_refresh))
+ while (count($meta_refresh))
{
preg_match('#url=.+/(adm+.+)#', $meta_refresh->getAttribute('content'), $match);
$this->getDriver()->execute(array('method' => 'post', 'url' => $match[1]));
@@ -338,6 +356,12 @@ class phpbb_ui_test_case extends phpbb_test_case
{
if (!$this->cache)
{
+ global $phpbb_container, $phpbb_root_path;
+
+ $phpbb_container = new phpbb_mock_container_builder();
+ $phpbb_container->setParameter('core.environment', PHPBB_ENVIRONMENT);
+ $phpbb_container->setParameter('core.cache_dir', $phpbb_root_path . 'cache/' . PHPBB_ENVIRONMENT . '/');
+
$this->cache = new \phpbb\cache\driver\file;
}
@@ -590,4 +614,37 @@ class phpbb_ui_test_case extends phpbb_test_case
$this->getDriver()->takeScreenshot($screenshot);
}
+
+ /**
+ * Wait for AJAX. Should be called after an AJAX action is made.
+ *
+ * @param string $framework javascript frameworks jquery|prototype|dojo
+ * @throws \Facebook\WebDriver\Exception\NoSuchElementException
+ * @throws \Facebook\WebDriver\Exception\TimeOutException
+ */
+ public function waitForAjax($framework = 'jquery')
+ {
+ switch ($framework)
+ {
+ case 'jquery':
+ $code = 'return jQuery.active;';
+ break;
+ case 'prototype':
+ $code = 'return Ajax.activeRequestCount;';
+ break;
+ case 'dojo':
+ $code = 'return dojo.io.XMLHTTPTransport.inFlight.length;';
+ break;
+ default:
+ throw new \RuntimeException('Unsupported framework');
+ break;
+ }
+ // wait for at most 30s, retry every 2000ms (2s)
+ $driver = $this->getDriver();
+ $driver->wait(30, 2000)->until(
+ function () use ($driver, $code) {
+ return !$driver->executeScript($code);
+ }
+ );
+ }
}
diff --git a/tests/text_formatter/s9e/bbcode_merger_test.php b/tests/text_formatter/s9e/bbcode_merger_test.php
new file mode 100644
index 0000000000..815539056b
--- /dev/null
+++ b/tests/text_formatter/s9e/bbcode_merger_test.php
@@ -0,0 +1,280 @@
+<?php
+/**
+*
+* This file is part of the phpBB Forum Software package.
+*
+* @copyright (c) phpBB Limited <https://www.phpbb.com>
+* @license GNU General Public License, version 2 (GPL-2.0)
+*
+* For full copyright and license information, please see
+* the docs/CREDITS.txt file.
+*
+*/
+
+class phpbb_textformatter_s9e_bbcode_merger_test extends phpbb_test_case
+{
+ /**
+ * @dataProvider get_merge_bbcodes_tests
+ */
+ public function test_merge_bbcodes($usage_without, $template_without, $usage_with, $template_with, $expected_usage, $expected_template)
+ {
+ $container = $this->get_test_case_helpers()->set_s9e_services();
+ $factory = $container->get('text_formatter.s9e.factory');
+ $bbcode_merger = new \phpbb\textformatter\s9e\bbcode_merger($factory);
+
+ $without = ['usage' => $usage_without, 'template' => $template_without];
+ $with = ['usage' => $usage_with, 'template' => $template_with];
+ $merged = $bbcode_merger->merge_bbcodes($without, $with);
+
+ // Normalize the expected template's whitespace to match the default indentation
+ $expected_template = str_replace("\n\t\t\t\t", "\n", $expected_template);
+ $expected_template = str_replace("\t", ' ', $expected_template);
+
+ $this->assertSame($expected_usage, $merged['usage']);
+ $this->assertSame($expected_template, $merged['template']);
+ }
+
+ public function get_merge_bbcodes_tests()
+ {
+ return [
+ [
+ '[x]{TEXT}[/x]',
+ '<b>{TEXT}</b>',
+
+ '[x={TEXT1}]{TEXT}[/x]',
+ '<b title="{TEXT1}">{TEXT}</b>',
+
+ '[x={TEXT1?}]{TEXT}[/x]',
+ '<b>
+ <xsl:if test="@x">
+ <xsl:attribute name="title">
+ <xsl:value-of select="@x"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </b>'
+ ],
+ [
+ // The tokens' numbering differs between versions
+ '[x]{TEXT}[/x]',
+ '<b>{TEXT}</b>',
+
+ '[x={TEXT1}]{TEXT2}[/x]',
+ '<b title="{TEXT1}">{TEXT2}</b>',
+
+ '[x={TEXT1?}]{TEXT2}[/x]',
+ '<b>
+ <xsl:if test="@x">
+ <xsl:attribute name="title">
+ <xsl:value-of select="@x"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </b>'
+ ],
+ [
+ '[x]{URL}[/x]',
+ '<a href="{URL}">{URL}</a>',
+
+ '[x={URL}]{TEXT}[/x]',
+ '<a href="{URL}">{TEXT}</a>',
+
+ '[x={URL;useContent}]{TEXT}[/x]',
+ '<a href="{@x}">
+ <xsl:apply-templates/>
+ </a>'
+ ],
+ [
+ '[x]{URL}[/x]',
+ '<a href="{URL}">{L_GO_TO}: {URL}</a>',
+
+ '[x={URL}]{TEXT}[/x]',
+ '<a href="{URL}">{L_GO_TO}: {TEXT}</a>',
+
+ '[x={URL;useContent}]{TEXT}[/x]',
+ '<a href="{@x}">{L_GO_TO}: <xsl:apply-templates/></a>'
+ ],
+ [
+ // Test that unsafe BBCodes can still be merged
+ '[script]{TEXT}[/script]',
+ '<script>{TEXT}</script>',
+
+ '[script={TEXT1}]{TEXT2}[/script]',
+ '<script type="{TEXT1}">{TEXT2}</script>',
+
+ '[script={TEXT1?}]{TEXT2}[/script]',
+ '<script>
+ <xsl:if test="@script">
+ <xsl:attribute name="type">
+ <xsl:value-of select="@script"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </script>'
+ ],
+ [
+ // https://www.phpbb.com/community/viewtopic.php?p=14848281#p14848281
+ '[note]{TEXT}[/note]',
+ '<span class="prime_bbcode_note_spur" onmouseover="show_note(this);" onmouseout="hide_note(this);" onclick="lock_note(this);"></span><span class="prime_bbcode_note">{TEXT}</span>',
+
+ '[note={TEXT1}]{TEXT2}[/note]',
+ '<span class="prime_bbcode_note_text" onmouseover="show_note(this);" onmouseout="hide_note(this);" onclick="lock_note(this);">{TEXT1}</span><span class="prime_bbcode_note_spur" onmouseover="show_note(this);" onmouseout="hide_note(this);" onclick="lock_note(this);"></span><span class="prime_bbcode_note">{TEXT2}</span>',
+
+ '[note={TEXT1?}]{TEXT2}[/note]',
+ '<xsl:if test="@note">
+ <span class="prime_bbcode_note_text" onmouseover="show_note(this);" onmouseout="hide_note(this);" onclick="lock_note(this);">
+ <xsl:value-of select="@note"/>
+ </span>
+ </xsl:if>
+ <span class="prime_bbcode_note_spur" onmouseover="show_note(this);" onmouseout="hide_note(this);" onclick="lock_note(this);"/>
+ <span class="prime_bbcode_note">
+ <xsl:apply-templates/>
+ </span>'
+ ],
+ [
+ // https://www.phpbb.com/community/viewtopic.php?p=14768441#p14768441
+ '[MI]{TEXT}[/MI]',
+ '<span style="color:red">MI:</span> <span style="color:#f6efe2">{TEXT}</span>',
+
+ '[MI={TEXT2}]{TEXT1}[/MI]',
+ '<span style="color:red">MI for: "{TEXT2}":</span> <span style="color:#f6efe2">{TEXT1}</span>',
+
+ '[MI={TEXT2?}]{TEXT1}[/MI]',
+ '<span style="color:red">MI<xsl:if test="@mi"> for: "<xsl:value-of select="@mi"/>"</xsl:if>:</span>
+ <xsl:text> </xsl:text>
+ <span style="color:#f6efe2">
+ <xsl:apply-templates/>
+ </span>'
+ ],
+ [
+ // https://www.phpbb.com/community/viewtopic.php?p=14700506#p14700506
+ '[spoiler]{TEXT}[/spoiler]',
+ '<span class="spoiler"> {TEXT}</span>',
+
+ '[spoiler={TEXT1}]{TEXT2}[/spoiler]',
+ '<div class="spoiler"><small> {TEXT1}</small>{TEXT2}</div>',
+
+ '[spoiler={TEXT1?}]{TEXT2}[/spoiler]',
+ '<xsl:choose>
+ <xsl:when test="@spoiler">
+ <div class="spoiler">
+ <small>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@spoiler"/>
+ </small>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="spoiler">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>'
+ ],
+ [
+ // https://www.phpbb.com/community/viewtopic.php?p=14859676#p14859676
+ '[AE]{TEXT}[/AE]',
+ '<table width="100%" border="1">
+ <tr><td width="100%" align="center">
+ <table width="100%" border="0">
+ <tr>
+ <td width="100%" bgcolor="#E1E4F2">
+ <table width="100%" border="0" bgcolor="#F5F5FF">
+ <tr>
+ <td width="1%" bgcolor="#000000" nowrap align="left">
+ <font color="#FFFFFF" face="Arial"><font size="1"><b>&nbsp;ACTIVE EFFECTS & CONDITIONS&nbsp;</b></font></font></td>
+ <td width="99%">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="100%" bgcolor="#FFE5BA" colspan="2">
+ <table width="100%" cellpadding="2">
+ <tr>
+ <td width="100%" align="left" valign="top">
+ {TEXT}
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td></tr>
+ </table>
+ <p>&nbsp;</p>',
+
+ '[AE={TEXT1}]{TEXT2}[/AE]',
+ '<table width="100%" border="1">
+ <tr><td width="100%" align="center">
+ <table width="100%" border="0">
+ <tr>
+ <td width="100%" bgcolor="#E1E4F2">
+ <table width="100%" border="0" bgcolor="#F5F5FF">
+ <tr>
+ <td width="1%" bgcolor="#000000" nowrap align="left">
+ <font color="#FFFFFF" face="Arial"><font size="1"><b>&nbsp; {TEXT1}&nbsp;</b></font></font></td>
+ <td width="99%">&nbsp;</td>
+ </tr>
+ <tr>
+ <td width="100%" bgcolor="#FFE5BA" colspan="2">
+ <table width="100%" cellpadding="2">
+ <tr>
+ <td width="100%" align="left" valign="top">
+ {TEXT2}
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td></tr>
+ </table>
+ <p>&nbsp;</p>',
+
+ '[AE={TEXT1?}]{TEXT2}[/AE]',
+ '<table width="100%" border="1">
+ <tr>
+ <td width="100%" align="center">
+ <table width="100%" border="0">
+ <tr>
+ <td width="100%" bgcolor="#E1E4F2">
+ <table width="100%" border="0" bgcolor="#F5F5FF">
+ <tr>
+ <td width="1%" bgcolor="#000000" nowrap="nowrap" align="left">
+ <font color="#FFFFFF" face="Arial">
+ <font size="1">
+ <b> <xsl:choose><xsl:when test="@ae"><xsl:text> </xsl:text><xsl:value-of select="@ae"/></xsl:when><xsl:otherwise>ACTIVE EFFECTS &amp; CONDITIONS</xsl:otherwise></xsl:choose> </b>
+ </font>
+ </font>
+ </td>
+ <td width="99%"> </td>
+ </tr>
+ <tr>
+ <td width="100%" bgcolor="#FFE5BA" colspan="2">
+ <table width="100%" cellpadding="2">
+ <tr>
+ <td width="100%" align="left" valign="top">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ <p> </p>'
+ ],
+ ];
+ }
+}
diff --git a/tests/text_formatter/s9e/default_formatting_test.php b/tests/text_formatter/s9e/default_formatting_test.php
index a0c57214e4..a35c9138a5 100644
--- a/tests/text_formatter/s9e/default_formatting_test.php
+++ b/tests/text_formatter/s9e/default_formatting_test.php
@@ -50,27 +50,27 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case
return array(
array(
'[b]bold[/b]',
- '<span style="font-weight: bold">bold</span>'
+ '<span style="font-weight:bold">bold</span>'
),
array(
'[u]underlined[/u]',
- '<span style="text-decoration: underline">underlined</span>'
+ '<span style="text-decoration:underline">underlined</span>'
),
array(
'[i]italic[/i]',
- '<span style="font-style: italic">italic</span>'
+ '<span style="font-style:italic">italic</span>'
),
array(
'[color=#FF0000]colored[/color]',
- '<span style="color: #FF0000">colored</span>'
+ '<span style="color:#FF0000">colored</span>'
),
array(
'[color=red]colored[/color]',
- '<span style="color: red">colored</span>'
+ '<span style="color:red">colored</span>'
),
array(
'[size=75]smaller[/size]',
- '<span style="font-size: 75%; line-height: normal">smaller</span>'
+ '<span style="font-size:75%;line-height:normal">smaller</span>'
),
array(
'[quote]quoted[/quote]',
@@ -102,31 +102,31 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case
),
array(
'[list=1][*]item[/list]',
- '<ol style="list-style-type: decimal"><li>item</li></ol>'
+ '<ol style="list-style-type:decimal"><li>item</li></ol>'
),
array(
'[list=a][*]item[/list]',
- '<ol style="list-style-type: lower-alpha"><li>item</li></ol>'
+ '<ol style="list-style-type:lower-alpha"><li>item</li></ol>'
),
array(
'[list=i][*]item[/list]',
- '<ol style="list-style-type: lower-roman"><li>item</li></ol>'
+ '<ol style="list-style-type:lower-roman"><li>item</li></ol>'
),
array(
'[list=I][*]item[/list]',
- '<ol style="list-style-type: upper-roman"><li>item</li></ol>'
+ '<ol style="list-style-type:upper-roman"><li>item</li></ol>'
),
array(
'[list=disc][*]item[/list]',
- '<ul style="list-style-type: disc"><li>item</li></ul>'
+ '<ul style="list-style-type:disc"><li>item</li></ul>'
),
array(
'[list=circle][*]item[/list]',
- '<ul style="list-style-type: circle"><li>item</li></ul>'
+ '<ul style="list-style-type:circle"><li>item</li></ul>'
),
array(
'[list=square][*]item[/list]',
- '<ul style="list-style-type: square"><li>item</li></ul>'
+ '<ul style="list-style-type:square"><li>item</li></ul>'
),
array(
'[img]https://area51.phpbb.com/images/area51.png[/img]',
@@ -180,17 +180,17 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case
array(
// Allow textual bbcodes in textual bbcodes
'[b]bold [i]bold + italic[/i][/b]',
- '<span style="font-weight: bold">bold <span style="font-style: italic">bold + italic</span></span>'
+ '<span style="font-weight:bold">bold <span style="font-style:italic">bold + italic</span></span>'
),
array(
// Allow textual bbcodes in url with description
'[url=https://area51.phpbb.com/]Area51 [i]italic[/i][/url]',
- '<a href="https://area51.phpbb.com/" class="postlink">Area51 <span style="font-style: italic">italic</span></a>'
+ '<a href="https://area51.phpbb.com/" class="postlink">Area51 <span style="font-style:italic">italic</span></a>'
),
array(
// Allow url with description in textual bbcodes
'[i]italic [url=https://area51.phpbb.com/]Area51[/url][/i]',
- '<span style="font-style: italic">italic <a href="https://area51.phpbb.com/" class="postlink">Area51</a></span>'
+ '<span style="font-style:italic">italic <a href="https://area51.phpbb.com/" class="postlink">Area51</a></span>'
),
array(
// Do not parse textual bbcodes in code
@@ -205,7 +205,7 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case
array(
// Textual bbcode nesting into textual bbcode
'[b]bold [i]bold + italic[/b] italic[/i]',
- '<span style="font-weight: bold">bold <span style="font-style: italic">bold + italic</span></span><span style="font-style: italic"> italic</span>'
+ '<span style="font-weight:bold">bold <span style="font-style:italic">bold + italic</span></span><span style="font-style:italic"> italic</span>'
),
array(
"[code]\tline1\n line2[/code]",
@@ -254,6 +254,10 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case
'<a href="http://example.org/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" class="postlink">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</a>'
),
array(
+ '[url=http://example.org/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]http://example.org/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx[/url]',
+ '<a href="http://example.org/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" class="postlink">http://example.org/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</a>'
+ ),
+ array(
'[quote="[url=http://example.org]xxx[/url]"]...[/quote]',
'<blockquote><div><cite><a href="http://example.org" class="postlink">xxx</a> wrote:</cite>...</div></blockquote>'
),
@@ -298,7 +302,7 @@ class phpbb_textformatter_s9e_default_formatting_test extends phpbb_test_case
),
array(
"Emoji: \xF0\x9F\x98\x80",
- 'Emoji: <img alt="' . "\xF0\x9F\x98\x80" . '" class="emoji smilies" draggable="false" src="//cdn.jsdelivr.net/emojione/assets/svg/1f600.svg">'
+ 'Emoji: <img alt="' . "\xF0\x9F\x98\x80" . '" class="emoji smilies" draggable="false" src="//twemoji.maxcdn.com/2/svg/1f600.svg">'
),
array(
"Emoji: \xF0\x9F\x98\x80",
diff --git a/tests/text_formatter/s9e/factory_test.php b/tests/text_formatter/s9e/factory_test.php
index fd9b4e4c09..0d780a19a9 100644
--- a/tests/text_formatter/s9e/factory_test.php
+++ b/tests/text_formatter/s9e/factory_test.php
@@ -56,6 +56,7 @@ class phpbb_textformatter_s9e_factory_test extends phpbb_database_test_case
$this->dispatcher,
new \phpbb\config\config(array('allowed_schemes_links' => 'http,https,ftp')),
new \phpbb\textformatter\s9e\link_helper,
+ $this->getMockBuilder('phpbb\\log\\log_interface')->getMock(),
$this->get_cache_dir(),
'_foo_parser',
'_foo_renderer'
@@ -248,6 +249,39 @@ class phpbb_textformatter_s9e_factory_test extends phpbb_database_test_case
}
/**
+ * @testdox Accepts unsafe default BBCodes
+ */
+ public function test_unsafe_default_bbcodes()
+ {
+ $fixture = __DIR__ . '/fixtures/unsafe_default_bbcodes.xml';
+ $style_dir = __DIR__ . '/fixtures/styles/';
+ $container = $this->get_test_case_helpers()->set_s9e_services(null, $fixture, $style_dir);
+ $parser = $container->get('text_formatter.parser');
+ $renderer = $container->get('text_formatter.renderer');
+
+ $original = '[b]alert(1)[/b]';
+ $expected = '<script>alert(1)</script>';
+ $this->assertSame($expected, $renderer->render($parser->parse($original)));
+ }
+
+ /**
+ * @testdox Logs malformed BBCodes
+ */
+ public function test_malformed_bbcodes()
+ {
+ $log = $this->getMockBuilder('phpbb\\log\\log_interface')->getMock();
+ $log->expects($this->once())
+ ->method('add')
+ ->with('critical', null, null, 'LOG_BBCODE_CONFIGURATION_ERROR', false, ['[x !x]{TEXT}[/x]', 'Cannot interpret the BBCode definition']);
+
+ $container = new phpbb_mock_container_builder;
+ $container->set('log', $log);
+
+ $fixture = __DIR__ . '/fixtures/malformed_bbcode.xml';
+ $this->get_test_case_helpers()->set_s9e_services($container, $fixture);
+ }
+
+ /**
* @testdox get_configurator() triggers events before and after configuration
*/
public function test_configure_events()
diff --git a/tests/text_formatter/s9e/fixtures/malformed_bbcode.xml b/tests/text_formatter/s9e/fixtures/malformed_bbcode.xml
new file mode 100644
index 0000000000..7e7aa1a39c
--- /dev/null
+++ b/tests/text_formatter/s9e/fixtures/malformed_bbcode.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_bbcodes">
+ <column>bbcode_id</column>
+ <column>bbcode_tag</column>
+ <column>bbcode_helpline</column>
+ <column>display_on_posting</column>
+ <column>bbcode_match</column>
+ <column>bbcode_tpl</column>
+ <column>first_pass_match</column>
+ <column>first_pass_replace</column>
+ <column>second_pass_match</column>
+ <column>second_pass_replace</column>
+
+ <row>
+ <value>13</value>
+ <value>x</value>
+ <value></value>
+ <value>1</value>
+ <value>[x !x]{TEXT}[/x]</value>
+ <value>...</value>
+ <value/>
+ <value/>
+ <value/>
+ <value/>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/text_formatter/s9e/fixtures/styles/unsafe/template/bbcode.html b/tests/text_formatter/s9e/fixtures/styles/unsafe/template/bbcode.html
new file mode 100644
index 0000000000..f3932f9b78
--- /dev/null
+++ b/tests/text_formatter/s9e/fixtures/styles/unsafe/template/bbcode.html
@@ -0,0 +1,40 @@
+<!-- BEGIN ulist_open --><ul style="list-style-type: {LIST_TYPE}"><!-- END ulist_open -->
+<!-- BEGIN ulist_open_default --><ul><!-- END ulist_open_default -->
+<!-- BEGIN ulist_close --></ul><!-- END ulist_close -->
+
+<!-- BEGIN olist_open --><ol style="list-style-type: {LIST_TYPE}"><!-- END olist_open -->
+<!-- BEGIN olist_close --></ol><!-- END olist_close -->
+
+<!-- BEGIN listitem --><li><!-- END listitem -->
+<!-- BEGIN listitem_close --></li><!-- END listitem_close -->
+
+<!-- BEGIN quote_username_open --><blockquote><div><cite>{USERNAME} {L_WROTE}{L_COLON}</cite><!-- END quote_username_open -->
+<!-- BEGIN quote_open --><blockquote class="uncited"><div><!-- END quote_open -->
+<!-- BEGIN quote_close --></div></blockquote><!-- END quote_close -->
+
+<!-- BEGIN code_open --><div class="codebox"><p>{L_CODE}{L_COLON} <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></p><code><!-- END code_open -->
+<!-- BEGIN code_close --></code></div><!-- END code_close -->
+
+<!-- BEGIN inline_attachment_open --><div class="inline-attachment"><!-- END inline_attachment_open -->
+<!-- BEGIN inline_attachment_close --></div><!-- END inline_attachment_close -->
+
+<!-- BEGIN b_open --><script><!-- END b_open -->
+<!-- BEGIN b_close --></script><!-- END b_close -->
+
+<!-- BEGIN u_open --><span style="text-decoration: underline"><!-- END u_open -->
+<!-- BEGIN u_close --></span><!-- END u_close -->
+
+<!-- BEGIN i_open --><em><!-- END i_open -->
+<!-- BEGIN i_close --></em><!-- END i_close -->
+
+<!-- BEGIN color --><span style="color: {COLOR}">{TEXT}</span><!-- END color -->
+
+<!-- BEGIN size --><span style="font-size: {SIZE}%; line-height: 116%;">{TEXT}</span><!-- END size -->
+
+<!-- BEGIN img --><img src="{URL}" class="postimage" alt="{L_IMAGE}" /><!-- END img -->
+
+<!-- BEGIN url --><a href="{URL}" class="postlink">{DESCRIPTION}</a><!-- END url -->
+
+<!-- BEGIN email --><a href="mailto:{EMAIL}">{DESCRIPTION}</a><!-- END email -->
+
+<!-- BEGIN flash --><object classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=5,0,0,0" width="{WIDTH}" height="{HEIGHT}"><param name="movie" value="{URL}" /><param name="play" value="false" /><param name="loop" value="false" /><param name="quality" value="high" /><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><embed src="{URL}" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="{WIDTH}" height="{HEIGHT}" play="false" loop="false" quality="high" allowscriptaccess="never" allownetworking="internal"></embed></object><!-- END flash -->
diff --git a/tests/text_formatter/s9e/fixtures/unsafe_default_bbcodes.xml b/tests/text_formatter/s9e/fixtures/unsafe_default_bbcodes.xml
new file mode 100644
index 0000000000..06524a13cc
--- /dev/null
+++ b/tests/text_formatter/s9e/fixtures/unsafe_default_bbcodes.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_styles">
+ <column>style_id</column>
+ <column>style_name</column>
+ <column>style_copyright</column>
+ <column>style_active</column>
+ <column>style_path</column>
+ <column>bbcode_bitfield</column>
+ <column>style_parent_id</column>
+ <column>style_parent_tree</column>
+
+ <row>
+ <value>1</value>
+ <value>unsafe</value>
+ <value></value>
+ <value>1</value>
+ <value>unsafe</value>
+ <value>QA==</value>
+ <value>0</value>
+ <value></value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/text_processing/tickets_data/PHPBB3-10122.html b/tests/text_processing/tickets_data/PHPBB3-10122.html
index f0fb6115b2..0803c895a8 100644
--- a/tests/text_processing/tickets_data/PHPBB3-10122.html
+++ b/tests/text_processing/tickets_data/PHPBB3-10122.html
@@ -1 +1 @@
-<ul style="list-style-type: none"><li>This is my indented text</li></ul> \ No newline at end of file
+<ul style="list-style-type:none"><li>This is my indented text</li></ul> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-10268.html b/tests/text_processing/tickets_data/PHPBB3-10268.html
index c89e63f9a3..13b71b4823 100644
--- a/tests/text_processing/tickets_data/PHPBB3-10268.html
+++ b/tests/text_processing/tickets_data/PHPBB3-10268.html
@@ -1,4 +1,4 @@
<blockquote><div><cite><a href="http://phpbb.com" class="postlink">http://phpbb.com</a> wrote:</cite>...</div></blockquote>
<blockquote><div><cite><a href="http://phpbb.com" class="postlink"> http://phpbb.com</a> wrote:</cite>...</div></blockquote>
-<span style="font-weight: bold"><a href="http://phpbb.com" class="postlink">http://phpbb.com</a></span><br>
-<span style="font-weight: bold"> <a href="http://phpbb.com" class="postlink">http://phpbb.com</a></span><br>
+<span style="font-weight:bold"><a href="http://phpbb.com" class="postlink">http://phpbb.com</a></span><br>
+<span style="font-weight:bold"> <a href="http://phpbb.com" class="postlink">http://phpbb.com</a></span><br>
diff --git a/tests/text_processing/tickets_data/PHPBB3-13641.html b/tests/text_processing/tickets_data/PHPBB3-13641.html
index 1bd1c06dbb..2646bc0ea5 100644
--- a/tests/text_processing/tickets_data/PHPBB3-13641.html
+++ b/tests/text_processing/tickets_data/PHPBB3-13641.html
@@ -1 +1 @@
-<code>[color=#FF0000]</code> - <span style="color: #FF0000">red</span> \ No newline at end of file
+<code>[color=#FF0000]</code> - <span style="color:#FF0000">red</span> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-13921.html b/tests/text_processing/tickets_data/PHPBB3-13921.html
index 6a9dc7f504..690668ef28 100644
--- a/tests/text_processing/tickets_data/PHPBB3-13921.html
+++ b/tests/text_processing/tickets_data/PHPBB3-13921.html
@@ -1 +1 @@
-<span style="font-size: 200%; line-height: normal"></span><div style="text-align:center"><span style="font-size: 200%; line-height: normal">xxx</span></div> \ No newline at end of file
+<span style="font-size:200%;line-height:normal"></span><div style="text-align:center"><span style="font-size:200%;line-height:normal">xxx</span></div> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-14706.html b/tests/text_processing/tickets_data/PHPBB3-14706.html
index b8f74c9e93..23b3304485 100644
--- a/tests/text_processing/tickets_data/PHPBB3-14706.html
+++ b/tests/text_processing/tickets_data/PHPBB3-14706.html
@@ -1 +1 @@
-<ul><li><ol style="list-style-type: lower-alpha"><li>a</li><li>b</li><li>c</li><li>d</li><li>e</li></ol></li><li>outer</li></ul> \ No newline at end of file
+<ul><li><ol style="list-style-type:lower-alpha"><li>a</li><li>b</li><li>c</li><li>d</li><li>e</li></ol></li><li>outer</li></ul> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-14790.html b/tests/text_processing/tickets_data/PHPBB3-14790.html
index 7624b2d36c..5384098e1b 100644
--- a/tests/text_processing/tickets_data/PHPBB3-14790.html
+++ b/tests/text_processing/tickets_data/PHPBB3-14790.html
@@ -1,4 +1,4 @@
-<span style="color: #0000FF"></span><ul><li><span style="color: #0000FF">text</span></li>
-<li><span style="color: #0000FF">text</span></li>
-<li><span style="color: #0000FF">text</span></li>
-<li><span style="color: #0000FF">text</span></li></ul> \ No newline at end of file
+<span style="color:#0000FF"></span><ul><li><span style="color:#0000FF">text</span></li>
+<li><span style="color:#0000FF">text</span></li>
+<li><span style="color:#0000FF">text</span></li>
+<li><span style="color:#0000FF">text</span></li></ul> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-14846.html b/tests/text_processing/tickets_data/PHPBB3-14846.html
index 461ca25bc6..bd4455781b 100644
--- a/tests/text_processing/tickets_data/PHPBB3-14846.html
+++ b/tests/text_processing/tickets_data/PHPBB3-14846.html
@@ -1 +1 @@
-<div style="padding: .2em .5em; font-size: .8em; width: 200px; background: #FFD;">moderator text<div style="font-weight: bold; text-align: right">- Mickroz</div></div> \ No newline at end of file
+<div style="padding:.2em .5em;font-size:.8em;width:200px;background:#ffd">moderator text<div style="font-weight:bold;text-align:right">- Mickroz</div></div> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-15348.html b/tests/text_processing/tickets_data/PHPBB3-15348.html
index e65925ec28..1794232d08 100644
--- a/tests/text_processing/tickets_data/PHPBB3-15348.html
+++ b/tests/text_processing/tickets_data/PHPBB3-15348.html
@@ -1 +1 @@
-<img class="smilies" src="phpBB/images/smilies/icon_e_surprised.gif" width="15" height="17" alt=":o" title="First half of :ok:"> <img class="smilies" src="phpBB/images/smilies/icon_lol.gif" width="15" height="17" alt="k:" title="Second half of :ok:"> <img alt=":ok:" class="emoji smilies" draggable="false" src="//cdn.jsdelivr.net/emojione/assets/svg/1f197.svg"> \ No newline at end of file
+<img class="smilies" src="phpBB/images/smilies/icon_e_surprised.gif" width="15" height="17" alt=":o" title="First half of :ok:"> <img class="smilies" src="phpBB/images/smilies/icon_lol.gif" width="15" height="17" alt="k:" title="Second half of :ok:"> <img alt=":ok:" class="emoji smilies" draggable="false" src="//twemoji.maxcdn.com/2/svg/1f197.svg"> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-16053.html b/tests/text_processing/tickets_data/PHPBB3-16053.html
new file mode 100644
index 0000000000..af70ddf7eb
--- /dev/null
+++ b/tests/text_processing/tickets_data/PHPBB3-16053.html
@@ -0,0 +1 @@
+<a href="http://ea117.com" alt="Test">Test</a> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-16053.txt b/tests/text_processing/tickets_data/PHPBB3-16053.txt
new file mode 100644
index 0000000000..c786665eb9
--- /dev/null
+++ b/tests/text_processing/tickets_data/PHPBB3-16053.txt
@@ -0,0 +1 @@
+[test=http://ea117.com]Test[/test] \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-16053.xml b/tests/text_processing/tickets_data/PHPBB3-16053.xml
new file mode 100644
index 0000000000..25f7c9e34e
--- /dev/null
+++ b/tests/text_processing/tickets_data/PHPBB3-16053.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dataset>
+ <table name="phpbb_bbcodes">
+ <column>bbcode_id</column>
+ <column>bbcode_tag</column>
+ <column>bbcode_helpline</column>
+ <column>display_on_posting</column>
+ <column>bbcode_match</column>
+ <column>bbcode_tpl</column>
+ <column>first_pass_match</column>
+ <column>first_pass_replace</column>
+ <column>second_pass_match</column>
+ <column>second_pass_replace</column>
+
+ <row>
+ <value>13</value>
+ <value>test</value>
+ <value></value>
+ <value>1</value>
+ <value>[test={URL}]{TEXT}[/test]</value>
+ <value><![CDATA[<a href="{URL}" alt="{TEXT}">{TEXT}</a>]]></value>
+ <value>((?!))</value>
+ <value></value>
+ <value>((?!))</value>
+ <value></value>
+ </row>
+ </table>
+</dataset>
diff --git a/tests/text_processing/tickets_data/PHPBB3-16074.html b/tests/text_processing/tickets_data/PHPBB3-16074.html
new file mode 100644
index 0000000000..b588e2ac47
--- /dev/null
+++ b/tests/text_processing/tickets_data/PHPBB3-16074.html
@@ -0,0 +1 @@
+<img alt=":man_judge:" class="emoji smilies" draggable="false" src="//twemoji.maxcdn.com/2/svg/1f468-200d-2696-fe0f.svg"> <img alt="👨‍⚖️" class="emoji smilies" draggable="false" src="//twemoji.maxcdn.com/2/svg/1f468-200d-2696-fe0f.svg"> \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-16074.txt b/tests/text_processing/tickets_data/PHPBB3-16074.txt
new file mode 100644
index 0000000000..f067a7294d
--- /dev/null
+++ b/tests/text_processing/tickets_data/PHPBB3-16074.txt
@@ -0,0 +1 @@
+:man_judge: 👨‍⚖️ \ No newline at end of file
diff --git a/tests/text_processing/tickets_data/PHPBB3-8419.html b/tests/text_processing/tickets_data/PHPBB3-8419.html
index 38df626a94..df91e9df50 100644
--- a/tests/text_processing/tickets_data/PHPBB3-8419.html
+++ b/tests/text_processing/tickets_data/PHPBB3-8419.html
@@ -1 +1 @@
-<span style="font-style: italic"><span style="font-weight: bold"><span style="color: #FF0000">tę </span></span></span>przykład \ No newline at end of file
+<span style="font-style:italic"><span style="font-weight:bold"><span style="color:red">tę </span></span></span>przykład \ No newline at end of file
diff --git a/tests/text_reparser/base_test.php b/tests/text_reparser/base_test.php
index af2d56ea51..2c6844b063 100644
--- a/tests/text_reparser/base_test.php
+++ b/tests/text_reparser/base_test.php
@@ -66,4 +66,19 @@ class phpbb_textreparser_base_test extends phpbb_database_test_case
$this->get_rows(array(1))
);
}
+
+ public function test_reparse_case_insensitive()
+ {
+ $this->get_reparser()->reparse_range(2, 2);
+
+ $this->assertEquals(
+ [
+ [
+ 'id' => '2',
+ 'text' => '<r><IMG src="img.png"><s>[IMG]</s>img.png<e>[/IMG]</e></IMG></r>'
+ ]
+ ],
+ $this->get_rows([2])
+ );
+ }
}
diff --git a/tests/text_reparser/fixtures/base.xml b/tests/text_reparser/fixtures/base.xml
index a4921a8823..532a19a8a9 100644
--- a/tests/text_reparser/fixtures/base.xml
+++ b/tests/text_reparser/fixtures/base.xml
@@ -15,5 +15,13 @@
<value></value>
<value>abcd1234</value>
</row>
+ <row>
+ <value>2</value>
+ <value>1</value>
+ <value>1</value>
+ <value>1</value>
+ <value><![CDATA[<r><IMG src="img.png"><s>[IMG]</s>img.png<e>[/IMG]</e></IMG></r>]]></value>
+ <value></value>
+ </row>
</table>
</dataset>
diff --git a/tests/text_reparser/plugins/fixtures/polls.xml b/tests/text_reparser/plugins/fixtures/polls.xml
index 2960d640a9..5247fb906d 100644
--- a/tests/text_reparser/plugins/fixtures/polls.xml
+++ b/tests/text_reparser/plugins/fixtures/polls.xml
@@ -44,55 +44,66 @@
<column>topic_id</column>
<column>topic_first_post_id</column>
<column>poll_title</column>
+ <column>poll_start</column>
<row>
<value>1</value>
<value>1</value>
<value>This row should be [b]ignored[/b]</value>
+ <value>1</value>
</row>
<row>
<value>2</value>
<value>1</value>
<value>[b]Not bold[/b] :) http://example.org</value>
+ <value>1</value>
</row>
<row>
<value>3</value>
<value>2</value>
<value>[b:abcd1234]Bold[/b:abcd1234] :) http://example.org</value>
+ <value>1</value>
</row>
<row>
<value>4</value>
<value>3</value>
<value><![CDATA[[b]Not bold[/b] <!-- s:) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":)" title="Smile" /><!-- s:) --> http://example.org]]></value>
+ <value>1</value>
</row>
<row>
<value>5</value>
<value>4</value>
<value><![CDATA[[b]Not bold[/b] :) <!-- m --><a class="postlink" href="http://example.org">http://example.org</a><!-- m -->]]></value>
+ <value>1</value>
</row>
<row>
<value>6</value>
<value>2</value>
<value><![CDATA[[flash=123,345:abcd1234]http&#58;//example&#46;org/flash&#46;swf[/flash:abcd1234]]]></value>
+ <value>1</value>
</row>
<row>
<value>7</value>
<value>1</value>
<value><![CDATA[[flash=123,345]http://example.org/flash.swf[/flash]]]></value>
+ <value>1</value>
</row>
<row>
<value>8</value>
<value>2</value>
<value><![CDATA[[img:abcd1234]http&#58;//example&#46;org/img&#46;png[/img:abcd1234]]]></value>
+ <value>1</value>
</row>
<row>
<value>9</value>
<value>1</value>
<value><![CDATA[[img]http://example.org/img.png[/img]]]></value>
+ <value>1</value>
</row>
<row>
<value>1000</value>
<value>1</value>
<value>This row should be [b]ignored[/b]</value>
+ <value>1</value>
</row>
</table>
</dataset>
diff --git a/tests/tree/nestedset_forum_base.php b/tests/tree/nestedset_forum_base.php
index 3daa75b2e4..498c6a69a2 100644
--- a/tests/tree/nestedset_forum_base.php
+++ b/tests/tree/nestedset_forum_base.php
@@ -69,7 +69,7 @@ class phpbb_tests_tree_nestedset_forum_base extends phpbb_database_test_case
static $forums;
if (empty($forums))
- {
+ {
$this->create_forum('Parent with two flat children');
$this->create_forum('Flat child #1', 1);
$this->create_forum('Flat child #2', 1);
@@ -86,7 +86,7 @@ class phpbb_tests_tree_nestedset_forum_base extends phpbb_database_test_case
// Updating forum_parents column here so it's not empty
// This is required, so we can see whether the methods
- // correctly clear the values.
+ // correctly clear the values.
$sql = "UPDATE phpbb_forums
SET forum_parents = 'a:0:{}'";
$this->db->sql_query($sql);
@@ -100,6 +100,13 @@ class phpbb_tests_tree_nestedset_forum_base extends phpbb_database_test_case
}
else
{
+ // Turn on identity insert on mssql to be able to insert into
+ // identity columns (e.g. forum_id)
+ if (strpos($this->db->sql_layer, 'mssql') !== false)
+ {
+ $sql = 'SET IDENTITY_INSERT phpbb_forums ON';
+ $this->db->sql_query($sql);
+ }
$buffer = new \phpbb\db\sql_insert_buffer($this->db, 'phpbb_forums');
$buffer->insert_all($forums);
$buffer->flush();
@@ -107,7 +114,14 @@ class phpbb_tests_tree_nestedset_forum_base extends phpbb_database_test_case
$this->database_synchronisation(array(
'phpbb_forums' => array('forum_id'),
));
- }
+
+ // Disable identity insert on mssql again
+ if (strpos($this->db->sql_layer, 'mssql') !== false)
+ {
+ $sql = 'SET IDENTITY_INSERT phpbb_forums OFF';
+ $this->db->sql_query($sql);
+ }
+ }
}
protected function create_forum($name, $parent_id = 0)
diff --git a/tests/upload/filespec_test.php b/tests/upload/filespec_test.php
index 18b6deed1f..b41b95d925 100644
--- a/tests/upload/filespec_test.php
+++ b/tests/upload/filespec_test.php
@@ -79,7 +79,7 @@ class phpbb_filespec_test extends phpbb_test_case
$this->phpbb_root_path = $phpbb_root_path;
}
- private function set_reflection_property(&$class, $property_name, $value)
+ private function set_reflection_property($class, $property_name, $value)
{
$property = new ReflectionProperty($class, $property_name);
$property->setAccessible(true);
diff --git a/tests/upload/fileupload_test.php b/tests/upload/fileupload_test.php
index fb72823f08..5b3357237d 100644
--- a/tests/upload/fileupload_test.php
+++ b/tests/upload/fileupload_test.php
@@ -173,7 +173,7 @@ class phpbb_fileupload_test extends phpbb_test_case
->set_max_filesize(1000);
$file = $this->gen_valid_filespec();
$upload->common_checks($file);
- $this->assertEquals(0, sizeof($file->error));
+ $this->assertEquals(0, count($file->error));
}
public function test_local_upload()
@@ -184,7 +184,7 @@ class phpbb_fileupload_test extends phpbb_test_case
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
$file = $upload->handle_upload('files.types.local', $this->path . 'jpg.jpg');
- $this->assertEquals(0, sizeof($file->error));
+ $this->assertEquals(0, count($file->error));
$this->assertFalse($file->additional_checks());
$this->assertTrue($file->move_file('../tests/upload/fixture/copies', true));
$file->remove();
@@ -198,10 +198,10 @@ class phpbb_fileupload_test extends phpbb_test_case
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
$file = $upload->handle_upload('files.types.local', $this->path . 'jpg.jpg');
- $this->assertEquals(0, sizeof($file->error));
+ $this->assertEquals(0, count($file->error));
$this->assertFalse($file->move_file('../tests/upload/fixture'));
$this->assertFalse($file->get('file_moved'));
- $this->assertEquals(1, sizeof($file->error));
+ $this->assertEquals(1, count($file->error));
}
public function test_move_existent_file_overwrite()
@@ -213,9 +213,9 @@ class phpbb_fileupload_test extends phpbb_test_case
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
copy($this->path . 'jpg', $this->path . 'copies/jpg.jpg');
$file = $upload->handle_upload('files.types.local', $this->path . 'jpg.jpg');
- $this->assertEquals(0, sizeof($file->error));
+ $this->assertEquals(0, count($file->error));
$file->move_file('../tests/upload/fixture/copies', true);
- $this->assertEquals(0, sizeof($file->error));
+ $this->assertEquals(0, count($file->error));
unlink($this->path . 'copies/jpg.jpg');
}
diff --git a/tests/wrapper/version_compare_test.php b/tests/wrapper/version_compare_test.php
index 8260d99504..ee23fe779c 100644
--- a/tests/wrapper/version_compare_test.php
+++ b/tests/wrapper/version_compare_test.php
@@ -66,7 +66,7 @@ class phpbb_wrapper_version_compare_test extends phpbb_test_case
'3.2-A1',
);
- for ($i = 0, $size = sizeof($releases); $i < $size - 1; ++$i)
+ for ($i = 0, $size = count($releases); $i < $size - 1; ++$i)
{
$version1 = $releases[$i];
$version2 = $releases[$i + 1];
diff --git a/travis/setup-mariadb.sh b/travis/setup-mariadb.sh
index 9bc487915d..95445dcc55 100755
--- a/travis/setup-mariadb.sh
+++ b/travis/setup-mariadb.sh
@@ -12,7 +12,7 @@ set -e
set -x
# MariaDB Series
-VERSION='5.5'
+VERSION='10.0'
# Operating system codename, e.g. "precise"
OS_CODENAME=$(lsb_release --codename --short)
diff --git a/travis/setup-php-extensions.sh b/travis/setup-php-extensions.sh
index d9544858b7..de27965e39 100755
--- a/travis/setup-php-extensions.sh
+++ b/travis/setup-php-extensions.sh
@@ -46,13 +46,26 @@ php_ini_file=$(find_php_ini)
if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.5.0-dev', '<');"` == "1" ]
then
echo 'Enabling APC PHP extension'
- register_php_extension 'apc' "$php_ini_file"
+ printf "\n" | pecl install apc
echo 'apc.enable_cli=1' >> "$php_ini_file"
else
echo 'Disabling Opcache'
echo 'opcache.enable=0' >> "$php_ini_file"
fi
+# APCu
+if [ `php -r "echo (int) (version_compare(PHP_VERSION, '7.0.0-dev', '>=') && version_compare(PHP_VERSION, '7.3.0-dev', '<'));"` == "1" ]
+then
+ if ! [ "$(pecl info pecl/apcu)" ]
+ then
+ echo 'Enabling APCu PHP extension'
+ printf "\n" | pecl install apcu
+ echo 'apc.enabled=1' >> "$php_ini_file"
+ echo 'apc.enable_cli=1' >> "$php_ini_file"
+ fi
+fi
+
+
# redis
# Disabled redis for now as it causes travis to fail
# git clone git://github.com/nicolasff/phpredis.git redis
diff --git a/travis/setup-phpbb.sh b/travis/setup-phpbb.sh
index f9fd9522ca..be9eb703d5 100755
--- a/travis/setup-phpbb.sh
+++ b/travis/setup-phpbb.sh
@@ -26,7 +26,7 @@ then
travis/setup-mariadb.sh
fi
-if [ "$NOTESTS" != '1' -a "$TRAVIS_PHP_VERSION" != "hhvm" ]
+if [ "$NOTESTS" != '1' ]
then
travis/setup-php-extensions.sh
fi
diff --git a/travis/setup-webserver.sh b/travis/setup-webserver.sh
index 3369d740fe..fd87d97449 100755
--- a/travis/setup-webserver.sh
+++ b/travis/setup-webserver.sh
@@ -19,42 +19,30 @@ sudo service nginx stop
DIR=$(dirname "$0")
USER=$(whoami)
PHPBB_ROOT_PATH=$(realpath "$DIR/../phpBB")
-NGINX_CONF="/etc/nginx/sites-enabled/default"
+NGINX_SITE_CONF="/etc/nginx/sites-enabled/default"
+NGINX_CONF="/etc/nginx/nginx.conf"
APP_SOCK=$(realpath "$DIR")/php-app.sock
-if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ]
-then
- HHVM_LOG=$(realpath "$DIR")/hhvm.log
+# php-fpm
+PHP_FPM_BIN="$HOME/.phpenv/versions/$TRAVIS_PHP_VERSION/sbin/php-fpm"
+PHP_FPM_CONF="$DIR/php-fpm.conf"
- sudo service hhvm stop
- sudo hhvm \
- --mode daemon \
- --user "$USER" \
- -vServer.Type=fastcgi \
- -vServer.FileSocket="$APP_SOCK" \
- -vLog.File="$HHVM_LOG"
-else
- # php-fpm
- PHP_FPM_BIN="$HOME/.phpenv/versions/$TRAVIS_PHP_VERSION/sbin/php-fpm"
- PHP_FPM_CONF="$DIR/php-fpm.conf"
+echo "
+ [global]
- echo "
- [global]
+ [travis]
+ user = $USER
+ group = $USER
+ listen = $APP_SOCK
+ listen.mode = 0666
+ pm = static
+ pm.max_children = 2
- [travis]
- user = $USER
- group = $USER
- listen = $APP_SOCK
- listen.mode = 0666
- pm = static
- pm.max_children = 2
+ php_admin_value[memory_limit] = 128M
+" > $PHP_FPM_CONF
- php_admin_value[memory_limit] = 128M
- " > $PHP_FPM_CONF
-
- sudo $PHP_FPM_BIN \
- --fpm-config "$DIR/php-fpm.conf"
-fi
+sudo $PHP_FPM_BIN \
+ --fpm-config "$DIR/php-fpm.conf"
# nginx
cat $DIR/../phpBB/docs/nginx.sample.conf \
@@ -63,6 +51,7 @@ cat $DIR/../phpBB/docs/nginx.sample.conf \
| sed -e '/If running php as fastcgi/,$d' \
| sed -e "s/fastcgi_pass php;/fastcgi_pass unix:$(echo $APP_SOCK | sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g');/g" \
| sed -e 's/#listen 80/listen 80/' \
-| sudo tee $NGINX_CONF
+| sudo tee $NGINX_SITE_CONF
+sudo sed -i "s/user www-data;/user $USER;/g" $NGINX_CONF
sudo service nginx start
?u'~b7J3VUT<ۺl.}_zLq/W?`ˇ!1b! */b5jpCdքHQwZM[]$@+;C:cD 1N#%/>h=EwՃ s{[ >AZ+C|'sOgòGT`GR_찆0C9 I0SQq DzA\g>:@y'6 ՚| u:8qJg07yԼRCg+zožLr)xr4!NlN}wN#'!<-2L벊M1ν?`ԨLP# KLݵyy$:F}cC|Z%ʽZ,],C)ϋd65wG{XS{@=iL OkMCK`S ff,.44^W{c3_AY˛I |iw~B]f|e̸ XeMZ:Ź2YFWo:|vm?ٳID^Zj6[ u3 &'VLd'%@Vw9bGﻱ>15F_H;O`5&_xCNי#Xsm!;QkQ >VڵdvzJ ׶(UD9A,f-r"U(Է'd$aD-_&߸E 6Q/ws~w=poIayRߥcƖ#WvI2 &emD<&i =ثi<_$>`I1QYsZݚMJngOpd*J[z wT2cd!*WJ\0M ޗC㶇Q(`;_.(nׇ;tLjFqb;2o:G@^`@˽מ6*ܺ7-ŭ7'33hBi.3V/VǠ´ΠpXoO 2kVqE5ӗ Mabrwr-2-o">F#K8,d8=MXL[d")gŰ,&' Y^W>nLBx^)Ў؄-I >hnyPSݚmBoHX{P~ ixŢ_O& o dm?I]E'8i*=&YO~7\E^CbԴүSchåƃͤC9DG^me9sN&8mY'80nUX:x=cE~H}!,fނ7#2!*8iM#X1G* cyV۲Eڜ3鄲9Y.uܐxȲѽI(w߫7@\~XE$*Gt԰zk);MB" J=Κ6p bL~Wt˹{ɝ*r#.׻(gOܟәKwGcxE|ܣB< ھM?0YH͝ȩwiݑLZ&;2< Z'%0v'*ƺMKE5]D˻!M(A$zE@%=$se7J$CqA@]U;\B^m尔w|gJDCǷB>f"sbZuw#46$p@7MH ~0+e V2Ͽ%r؜w<>0ĊjB38 gfm@~+> ER]cQOd([ 33r%D[8J9 BLE,Ws4 IHla|i7yB|8Mn}תpAȚeE0—:'WC P4sut b+ I֥)"{\KX]s pʊ(? 5^aGG0:b2poһƪPh$*ֲB{i^xV+} Ք;p{ 4;_q=KoOZ^w,F~)Nv7̹l6_W* R! Mv>\h<˯AY|Xym6cNX+_Ju|tP*LW S d> -} lA,瀠N(I[c.Nt:@qf?bi:-jqDlj.M,axs}mYx?62,HP [ҺT 3aY_͌%Xwp &U\jA%+%AOȡŵg -mYZv"ve .v>/Dҷhost~UVzykj%+oEmzQn4"Ef㮫8'XqM{ϬuGI"{\i_brJK"d9ET+70Ch ˦'z[Z(jj\YzJ S΢ltO;i6w̬.EC} Sq9p!6=Oxe9kSyJ֐v2j *䕃u.[fWEd>>b1smXV =PXgr 3^c6պ R#C\/@ hUhO15J4H1髟 E4J.r))ڳaVۻߛv ,ukvBEi&o7` KmP$%6 OF㸼NNqRg(zbʒC <'h+PYmexhZ zׁ쒱^ZIbכ#zPkIe<,Kw1D'qdG"Ew'"2Ķ ]w. vkc?hMFXjyӜbd{q]:@c,1'BY%d;P_\>=v-, v7/_&RTg>pCz{SнY9S1U4mz6'UJ}?:5]PՔ-z;ƶr/0x;f ?zgA`$uD Wa0E<_t9䂔$ f\@Sz +2!.6I@t2Y ƤTL6L\(a4JtǭiC. Sm+0&u*4ӐŒwv|_Su T~}*ir}y) /nZp1g8on\0c4TݻK#T(vdOhs P偂֜s]xB5 Ni޴vjZyjcTK>ŬBBս9 `L.Xm-O~1Ȝ?\IKA4 S ?2Рh? I2r77hBK9q4E -.W}dYc-R*O;Nͯx(f>15*niÄ-I7aO Ì,). `u52-8Srm2 )]M@"Nʹu%i]~ .H<琀D\BClٱBEfd[uNߛdbAnEtƇ ]u A2½Wq} YwÐ8S#OK, L&yKxW0ū ?\BHA\Ii\CG[Z(8?E7hXkfe3 ;skfiȈ@\cǞT:Ob>yܡe?$pDԤf{UVD$T L<*JR$fJT[GW%8u%-Dѷi6`΋9Xno\LGzTnLC*y|n~C?i׃{zH@DDܞ,ޝs K GL?A\~@޲K~;3H~_M=|:BT*V8`d:vwI@L,[<6M$qf+/q IMEi8fiia]!X%sʭ1xT NF \?YV0.Jh ֕›f@AE?pSks "$'aCq u[D@tRQSEMgۂ|5UtiHn0aoOtz\ F}V-M5F[]N*,BK?3j|s)-G(5[6 LDȮ@X@O^{6iA3fMQTɺJlw;Ny?}s,Rd`Bn99Qw$?k#5̊v8.+*WRѹJ dl&{YS]\`ډex/o5x|R͎uͳrWY=4WVo!Cт:+ }H8I!v)E??I?yQg#zꀕײ;]__5kmay(F=(+=_hz<~{dKc6P#QBKK 3p(*=P !=nT2Bfa;€sX8&(Do@~'n0  ɫa:Oy.pf`_qy͝7^Chj=s2F/ /υ-GԩQDK%2))C/J!munO@7mA|ulhD CD+J+bT:[X*IzLE<&-BMLXsbPLet/\4+ʀ6]_.ZZ-9!3:,!VhjAr OMPgisO(|@I썾}`:w!mtئA# jhW8C?4*y!)QX95?tAn./H05~;]S/ooK%yϮVv*lʧ} kr.*EҬ,W@_4`õ=qFrE~wp 4#X15#h:V>嫐QIƉ*d6<$ tN.+Z=H[5ٹjORf-"Xgc#ξI|;/lԧyi)氂8-|ꦶ ?6'?73\W{b<5jwaTTl|>={+= :#w! Nw]n3"=q*~tՌEyw8t:u("?KwYP9 Cl4h+b8\nz勌0D]}Vqlhc56D8^/$C㘃?r'9m&EJY/KI4̄BƖ,Q{fyjdv=%ZuTFBPk8pa-(|9"Ȟ|'4AJ)='evs%zƨD6W("[[~^I .@=c.wMiזو bmSY]ȵH n>* 2q""ldUk^'"mx!kdq9C%27g# >̜hƂb3\JEgOv"CޔJ}MzXF ' 8d}9$:J)ٸ(/O8KQ8'Y+-8(ʞ5 AKޱ7q˽C䢸·vW~b>w0i7^)(hS˱5A6:M_ hi177R v<u6PR$zZaTd?& vDNAo>Ӱ 7R֫rrv~*"XP<tC-hq󧆲df?4XlfW SW>FZǃyM8fwl6+Ϗ*gJ}Śx?]Z6ډ},SUvCH9\!cYbcz[u0Cy4߿iP@TWZMl8W'|!G\6_o7^6Efr]E5"ӆ35Љ[.>z0}x#LB̊:H_ l#?DF(_cCOv=p p &/=q34P}DF(>mџ pdd g]⯒t^ټ3KLfu|7ߵ FSr#fa33#ȯ5LY%b2`P)urRkBjoJ| ߨ&QQ.w#"=`#`-OEEI@.`,4/=Q/K+pC?\fm5N{"d~Nl|T©h:ü l<*o֎I`֕UofEf4"~ L=S\uK!S(8r.С&% YTmw] ɐbuS> e\Z9pV+ Bg/0j$Û!~&|Է'Ky)m90BXBe<^q.%pJ`tU,,6sg~ Tړk"wCPs TpK#qyAcadaECU{ 7ZŌ:z,L_̀Bio#k09' LLc5a*QBףԱd ]WHU (JgkODb"UYB394':)ḼCŲYDz"n xy>|j1UPnwҥ&Q齹&TjoOAӸԥ8  "8dk^Ӻ\EAT 0e$X~LG'I9@Sf1yޜ9,6?$/ѝsHcجbA"C5|q焣_4F4 toI .#`NJ{. ңATk>j{tl*&׽xORc6RjJDdonv'/SkZrU7Y05wgdjTvh:[7XCH3D;=!vNU0SL>kCw .d5_XhR+4ee* 6[p 7e`P[ JT}koȊiY`J~cV]Z2 a2ޖ"y,,V$=f^gm&%۠H[oʾE~/VX1MINY4Z%{(7R ]Թ44"[D† v_}ƎC~6zzlj)L-$gt4S.S0pLݵt :k*XmǏ -wt> ɂ|YYKdu>7V~ٛPz ^0h%.?VH;z(J dc_֓=;J9`8 YYD!:"1¸~ĥJz +FQCK Se %Ӈܱ# bξ.x]!AggK\덇2L5&+ۙ<)#t4&bA a9=])pOIѳ(NO?kog;ФLՉAKǛ _dʩ;TN} }iW9׭r 筸o7*#R6G%)YT\L}-+2͔ZS]/dd;e8X]lu{6s6Hm[X0$aGFi?Kv>[1pI:Oos?bԳ\5ɸ- 5fm ,jXKӕ!ˉ60]pCK/nﻃ]hfCm,cix5,F84K9X6~;@2Q7Q|8/P$z.w+]_5;ء6\R4YǙDy5"}Alz E鱏eL$k玕C"{l-$ ka󒦔2=R϶чr͎ɡ$XĒXP"O~G #R2XZs]UMT'1l8.zw0IW$XY/d% _r®{^dH)QN-{J0nX?H E@CфDw_(px/gt n.#ې`Tx7jd1æ_fsD!B91WDXo,g" 8l:|Z[q}*=y֨BOYd,9YAb׃3!#MFaa2[/F*卆Rw%'eJ)b$& F=+w^egn(F(o 4" _(Q󲬲53R^ɶWƪqZX[C(.Q+ʜӺ=_ 5!!uyeيԲT?A=FojYkvx6/;VY 7)(K.mwacz*YEc [5jMQ3TE"3ZIstPq|}K+v[$kqb(Ltpv[ʫ1VDvť7!{Ua}3OܰfY;cUAi="+&oE~2ÂR4 .ՊVKA9r8ƎSe)' װəE9Հ3y/qp~AY:{6¡ODl :aiƼ z<S g'9ېktGm x$Ts)-7&Xt^t|BK7j Bj,\dʦ3x̑/+5AUG[dHdms~jYc 2oTUBA#ߜ̶We* VN Ck la,Ll!TKykK|O7HƸsH4!wO(*)"%b#(x8l.H/狋[S4kC9dhXSߔ4p#=]hCcN6:9x؅qs˭?xA M,qXY?mEoZMQYك'B~m^'=7y򶍏b% O[~nPͦZ@fJJO593#B<Aww1C+bVD;Waʿۙ7,Z#ւG#(5r0GO0`xq$"p,S:ƨ1ODI37'>Jr[ڻz2^Fx'ݨZ)4jJ~zd~V9\R#kL#muy=q!ZVZ'E7F[W3:H|e]ȚRPH ZZ ,$-q_9oRa7V3jA3P ) eݍs|\:zHHNTj8K_,,yIyPeRȪ WE:s{KwZD+ܦzǠ*NOS@{_^i:TZl*Q/Ki3D 0,4;- 3U 2w2JEEzݍuqsoU$P1m)<'1"yg(Z x/&LY(l#ՈeپNo.Շ< yWKۭ$ X(Gdokp("@pjo=η =>.*w+'?x;zWJ;Ձpױ_K¡p<[ vW[?ߨ8҄A@Nd`Ā qò p5޲vUJlVϠvi\V3Za+&0AڢG-7: \`/Ԟ;%>}0rG;!.I) I-~tO6]҇ v4U8ɰӱ4+P>b=Q% Sד(N陸.@?m&JSV/U5lH-)b=h:&"xEFH G $4v8  GUpt%O  "@iX ٸ[V] 7]Q3%א:! Ę=$pj S!|x_~{PN`&Dܑ1Lx ލ^Iܬ$BiD>ZD,|oYIBҳ^)si9W4⑶8NZo#S\^dNoJy!/{!LVKҨI$|\F $bP ,{("fƒh.sf⒜epy g@?5Nd}ҽKҹ=/.ľwf.7%uk! Uaxzb0̰93)gi/HYfZF~$#Xn%>_X c~M*V LY;4XZ^Wߔ纍DVN丏f/@i5QMdE>¼A735|8Z׽ϠÊ3e-InR1H 7 ڿCPɢ&jFuՑ>\\t*8ES@p| Pm9":{稘|@\4Ur4elbTTs.cKMe><<<Ǧhtb\)蒜P4P+r_:inkK$IO|Herdc[ۤWXSy]RO^*gtb+"HZM~M \ʚ9C)@J׳(mbĞXeFl}M#r;[5|v;dMխ#UF1%`y2x68ȈS,MMg4G| qkKϬ3m.t 4?ñ? γx9|46BI V75^ ,;%ޘ ic2KJ1YXDעN=2(p 'RN-ξ)N_`ښ^<80n뉁Τ YT6}ul F)ۓ WzwxV).В\ ;!w^r]zmUMhR=~\^k(5;3fi~Gux# 0#8fDg_)fE"&Sro:tlׇ:zl\8Z{|m1{RG#sCCMw]d {K\7+5 $Di4Ǒ '1n/%x.R"#j"s7lJIr&H|!,vIF|sc u7zd. uu ّ(fd:x}r;+?ocx_1Q/$U p M/B9 16}n vݚش")1FP 'e_Dѡ<"EMLU/?Cw%>-*oiֆ?(d#nlz9Y0TPB]pܭ~5c J["Ki!2g/z>Ռ8XO-N`Eozk^0mr {ڪl/d**ʡ2atm½٩+baCv8>9=0xp92d;<0zͩ;|)7X=uJc t;ueԅF]()=6{1-#^,Ơe{8BR;F.X^jA 3lg' gWؑI1R*t:8rW#:*: C 54Lexh&Z՝>a d骒]TU-!<$=@YߪJBUPc ;ÎǹV 2J;tr]fE2{58,G@zýuQ54 61sȷN &Rw5ݿ ;^l FybD}y5^{a;}* #hާRHk"?65o)=rmS@^1h* #HOg9jq8ŔHXTX{\ H5i(mv5*;V11WUt4z JX? Xt{OpL`$u#{تoG䕛6t,+pS*Kuh:4Vɖ81'ޠvhגMf8s+,MN桔e!fxZ ӦȃeOTJ8`dg4aF|U]_)t#|yi.'Wd2^`e6/:pS\"jT{P3׭Z?٨H2gl[\oꜤ1pZj*vJRd@44 hQAԬ:?T4 `S!ڷJmٷ 3vyɇUɿKv}UY>ᵊSzA1]2+3CUBt*]oSj9Vw=+uƵg~D# $Ʊgi+o(aXU32lESua}]2ZhG9t(AryRYrU[D={`h)on|2H'sU :(!"yZYXŠkRi X\[Z O@GPtJCi27әZ;w@YVWGg9XT"fex8G۟+1qGuaw(z5{,jt#Hu2#7FJP;瓵mACbK\!a0#4hp60"q%70W=Kp 4BNc&vaF ]V<Т]^̷UQY(hV={}h\GVSe/=;y!:x]bj+|| ݁U>h,۲>d'7A`_u.k+}wfbs F[P-tDRPۯF1tŞqЯC &Mc0Bs./5ImȔW]gx?",Ps'NJ}b"4y8{js5x_q*$F7wP 8[fԑ%zJd|u ULW%ޠMkDNp, jnoZL_C@I/cXX ]8f`ڛw%CYp` 12H9^=tA-GQp0vDM.L(DeD2Mq_B)̡BwTGFiۢ6`uDԃtupd50/rENK;9F˴XDN ,9="|q7f^!TL *w: g.cU7f )9{_x"^vh!۱-f u['Ś5]A"֜Y-\Ϣx+-K zslE]ck }nrF e?~!KF.W`.|h㭕+g1&%Cx2aF fAc zh)rV{ZEz%OH6iH><[؝eش0$qR:e5uJA4Hؽ l풑 XJ:}.D]wFbEMJ~Ӂ2 k̍+R#Q:,5H}ƯA"VX87<˫lA ц{9;HGhPdɯMˬ0=d'FVEׯ<y3Xy`}~ L9?F?Asj4xkʢ0܈< #^.# x)mPa\SklJ0IZ@[_S5Gk>g `Wgp2ZZ. l=F̧ 1iS9y m#`y˖\LQ7K:£;%q";oUG꯫/'g ԸnJ_c;' .c/K$dn*mc4|S ay zY DK^Nj,_<8NN\q3|6Lu\cR)4`vx.crz;,|@MlQ͡|mgQ<Gl.& sVdoY: eFZ+ɘ/O`r]t{2e1._N韚P/=:Q,og)tub{/|P  Ǿ8d~ b@\댓{>Z=@3DuϡvQei b#;l,>I06Z v@t֖A ]F`@/2`.HO P ǎw03yEGv[Ee)B> hthI&#˰8Ƙ4JHxPB`AGXV.5%я'I"_WȾ`;[ޠGWo 1|-͠ì:f` zU`pijv*SgfNV%l7Ij됝Op@g9yp B+54@W;}w<2IqHH!z+z\R8k#V3p#Ml[^ yi`URth Sg&9A܇HoEm?䉗]݅7N;Iw_ݠetm>S&6ږ;)&LUiЩ7pv*hD-l_ƺhS-85O.tNLe_OpUm uW˻_\raa8e.~:oTF wIIO%Rrx5T(b^w S)|,_>.;}blFyԆNw.] J48!: Jn[f5m7wl1ZN0_= ]F8yBAdEȜVAr) $g<$iJat8ن$|,97".Kf$vM*EUWKGK 0'^b_D'K^8)~[/bѳnL,AB|Zl8,4M"hl Y>^~} /ch`)yz:ҧL$g҅ v$GT+S{UCqN.4-PvILqsڲ_itLCtƷQ1xym>m߆ @M sYb0Į'!Ɍ?}/)ާ \%o/׾VfƟLW`vs>ubzP3։&'TldHsl}bR`ץd+HHtְӐ=@ߊpF⻦~f2i]zQqAɐ2a dWN iI뤊4S5/Sr5mpE/ obs᥊!khTj>}<2Z~N_mw(Ү̕^q?)3tIj wq d%[i'Ջ АxG<;m`C}:O]mYҸEkPIDm<9t)H y<}FDM+#Dz)-)Jwa> )f APStY)sO5(lE 1p3Z S<cX!=š)j[3_?󶶃nR6AdM|Ei89W& MMveF+\S-&XP/șҫ=Q4kb<2e}cg"K]7ĻH  HМffpEQ(e'ކ{)H:x [!$W~A;VyyEo vׅY%o'x82JirwV$E?0>34iA ZT{)0 At(8 v4Iߛ'bhyZAdBgkd^:(Y!}8e75*Xw*SXUYݫfa8հUO)ZS Vsd-0yJ%$t8Zf{Ͽr` ڦޝ lDȊ@&4ϗSޢ BŜ3 |T6oث:v7j:멲(Ea][ 44P RWN52{疪'=,$uSh(ci@ع\)\{ ,\t3ojy2Y/^$='#ruqH߁/(鋈v\POQ7 X_/Z62k2)`%*7J I"`:OfR|8〪_*>n' K8n#U%1#E׹eML[n9Vjjh=9ܢ+:8Fy߁ ͝{XqKFY!:NQ #5f[=pk#K'VџsT.m'[yR98 <R%- nYF \^aR{٥Ko$l[f3m:=[p4# 2fpt!ԵNwI}c8>T!+f{Lnw9!_Y=~y\;}>shFM5>T>f-:]N`OLѻ&y@rs==`#,}-Of_"C=jTv=ܻ;HLQB0m2HUn3ru\~XS>U1*F]K*kL^*-7jx;LmxX}w{q["&\>P(t{/(h#V"]pmCv^y:K\lTdixձ$ @TZ Iiq"< 50H+vچ_w]i1l;P°ph*QZ޼:;nN]E9.)/[CtHk޺ V=!{ jy6jKR #nO|#;e^ǬWеL:Cq/kd牝cXͱ&,+R mhÛ8D>O4rBmV'TE޺Θrh29acjni^( ^:t\sVgixVZ˽/M56<Ɂ*<F9<7OHp< 9LR,E7Zxe.10C #24M VRaK TN{}T XQ*i(cP!\8 PTeJw;4wqfIы'F*ѵH?J4` k[OᜣS=yhV-[s&/y(ukk;(uh9G 7FAЏ~"cx4<ǖT1Y ?ZuZk̄.d"J76'VP|Z+tڅԂ'w>כOVA& ."SꤣapV |[y@5Fum5S\V. nV^?dfUZPuC9i\9:qu7v-L-Ҽz& PjU8̾ fd mHe|#@7;ċQmk+CWzb=K͖YIH+A ̼r6t4&4>ERډnb&cEuɵ>kUK=, JT-/E&mm|Dkkcb>p,ٙ"[J1gǑVY^t{hV@:degxX%YdOXU^ P$A.26"L,EuɕQ8uClÚ(\5px[Cn%Cќ!1ng eJXń}\T1rX9+C64AMҿh{7\T˹5X f󉃟DSQO\! aP?58 N}5[@Y 4&=FSQG&_S>߀up[W,1AtVk䤷gyJf1x?`Yf|ʝ%4=QHwmWP9+Rehmqw2,~j I`W3Xm)=-oW5DXsT7ۍ ߕ^^K|z,D|rҜ.l,Yf\)5ЕC&O'v_Ӎ S){E@2mkl8 CaCt#h-XG6v:OGSވ%څUY 3HLn@ϵWh"<"<^V(p |~WXtȳrTA1~2=qDm33tS):=Kܗ(oªH8=XrHAM2WI?;?_x|)+RJL@ɣg0mRq"JBUͪNƇ֋P¾%E텨>Oc5i){P_O`HYGGu^tCIB[arU1`(?ћh'u5Dčp΁O2|dr%:uz2H,-bpc6q^m{4)v6[yEVV2o\g#c5yZ乤 f:DƍziƧ@m\ X̗bsAg1HhPU>h F i;&VCd+k,0=d|p@[An"wge}Z{[~Q'W`+j7/0-RƴD[Wz5`A)BxwExwK6P! Aр5' uU>1[jYQx:AUj|cL!4ߵE޷]e(n.9-@~M- ˜omvF.*G %z(i(a-a$v ET<4o2g p:5ͅ}FHl7~ZAQP>JFkmӗfxM}浻jo'ShQY7aP3>)²ɩ@ClϫĚc7hȺll>X>5kw[?p^81Ɲ`(݋}UO(BH_GzZi·h}h)\IoѶ͉h8s \)Z+"JrTWe_a>EpZ\ncF^ޘD&R{J5g46<.l!)GNTXDj͏mkXPhʴwߓW~= 1Kfg5,,*uό4`[l%±=4a]=.q=i77cN,՛@W-v4 f'Lw"QuCO_ؽ9 )/ O[r.ϭ'3}Rf 3XU#t\7 4Nm^jRdBgl0!,J5,Hugq6]!>ޜ˥9Ų_GRxYڅGe 8X*[2hd&Ւck 1pBUQA'ͭAڜMSUχp sMo_0AO@6`A߄dAÐ_qFUB44J9셝 1OKt%ԛM@% ju׉B Q=woC,4ƊJ0: 4)ÎRQ}>8!PiEP\T8dI*_#5s"M?4--76;4f@B)!)qהF.{a~J^B]48IbYQɍ;TG xaGZ&Eg xdѭPʢ.V)`C[<ʞ[.b pN,hQ|Q6h2NN }YGk$^S]CZ{ԳPSLs2H-ԑ)ou϶s_b*hӐ^Tm^&,z~  u;"I `LyV6"1mZvJqL+!}ꫪ Ny_7sOdM(#c=ă+s~aF\锋(7w{CPh##{rbX`&EjkI6P(?|TVE> -TL̉"A.HtƑ ]"DlqB[ דc͂ߕ- wV1^*af\8*ZFB3dwJXVp%M+PO7UNҴd_&ΚNd3vAM[}Ե8lϽ&saEG/%iԍ7$FL]HBY+d6yG!>ҔW"WŨ̎h'ޭ 1p{zShFF*W8tӚZŗ?]fe,f]=tP2qt#T#qH9VUqϽÉ&Kq[07m(W-xʴj,W?({F XKkgV|:7Q\rQmz fؓ ςm'DB}a4𗝛 E7T`/d =%x[d3ʮsS-ܼݴBӱ,z cW6SXrY=͆{pͳ(FdBLlH~hlGׁ8@Ms\ǰ{ EvV75X%]qz썂?᱈luE`O@K*.e cP iRox!k"o:xu3) 8 *}\LxO@?! ߅af[b^sJg*պ;MB u"pT$:f<%wTlezreX^oMNJpR8rNS&[yD:]mG۳I+(V+]?yMMS[':pAREvP^%B߆96 bkw J?:}E;Rc𙾁]_ג؈L.E]2+lB|Ŕr.jE`h?,^*(m~d{هxuFI0kX F6ġF'9׷cEx{q(zm6,v6fg~ 0\(F%];zwOD;Hϙe4bvxIJ`J0Soӌ@ )~iP/jD{䧧 źUuYIi!u/'hOĜ^~r0WaRE8h gVe&-NF0!zax$D<"2_ w~,1}%Vժ[Xל,pʙ¬K@֩ %wuY)); FN&5 aB)lcΤ6~SX*v9IxZaN?}J3lVmuyMu. E🝞"RݝPx}U.^m^@ƘxD($"Mpі*%K'8|zбI}#ڲ1MH8jhr/:},ߺ4B(5DH>і84m"6Gu%kl&N=+AWJiQcnyXv p` DHn{Ǻ $q~Ѭ1kGk# 5Ѵq5sFeNN%+< ?xdze2|q lģfBO5i?y kWV"-)?6gq^EX`^.CQ@ lwgdzxŪ8;~󰢼>z"WgL*3F 9C%7b4Rt+_`Y5,W8wn* H u8oBETdNyl߼xx6PS>2dFPqor~uЌP轟ɛH&H%FX>UTȰLD]Z+)8*mj'n5-HRC"f_s[76vkP\{ |Y36 iԑ] /m>9QBcpz!fq0%dP:\`ޓJID]jrG _YE?̡yCQLI)xP@v;G%-W\#u 0 DL 1.|Fi@j"n܀W'nb&S"i.-@,?Z)H68{NXfFö@@LAdhPOXP˽xW֌t)-M3w#-y,,J2STMځ<  Z/pӠ1: ,zϴ3BkPA%MY'Tb`}+IX=lb=aͩAHUhL.~QWˌ(חԔ h'~SO'HuP9J=Br}0&S'9XU!D ͢VwwJW=QNl}>B xgȱK3[ϾDfpDi3|%q#-E%޽Pyf\Tm%X]>hқlˮiN'G&raNP20>^5@s4ITdge'\/7CE`!C2"%9K >^ :+~/QX.bCۓgVU4歝B 4Fp9&iQ?uzqf%}>BɌ{,x'׀QnZE$?>-9]M0!n2dStmgz6|dPR &=#WZA 1Ub=eӐ=kJf.X}mkr Ի4/'3.A9!Ծb T5prlV cd,.Kc`X= żZ 1uX 1bј%iU{U@LP wٶ-j;:'{F+Q0]TSnoޅu L$ѦBPR*iz/s}x{o "ʊ,PurT6A=k.X{ qR&ny`cg)?("=[. B@1ŵB)[%$='ec"nP~9 !phgɶ;AˉkcwP9U >,6}~%-ܺn NWDvmη Gӓz:f:})a';ze)H^Qù+ vB|tN(u,i!n27prsSC :99,ޔ(TChbz(jMU3~]8=0ٷ}ujB~0ɋ;w+D.nR2Gg 8%,6"mf&H0tK-N${yѭnK=U0W9Fz`Yo/xstQOź~`Jfx&J3=ä`i\׵9~&4,@ݼaå_AQSR)? >=)Z.3)V/s#yTqFWd XüqXio=~ƕ2Fm#&#asї-RץS(C/K,>ΜJ{| )^9Іw$ς6Uĝ _)U0*R>g hWȀنwE=}m6#WX^C <./+lw0Xo%JؖSu~]޽·dOחFESC0oFIpl!ݐqR {)<#3b@cAgo0g*vDYp%]sb-1U\]a'}lfwK3HX* !F 2/ =^'[/UwФ{Cy>t@`!3:Hk7c#+$ r~ }uX(7M0\:?.~fQ"YBO:GpZѾ1IwuM; j%)39f>`byy[ /C\FU̯]ay( 11b ^BF4pt<R>ȟ3&p^L{9[p}hLMTMawG5g}PDCp]JT6gJy䷓X 59;N,MEv~x0cυϛя2N2=Nh XS&@WV0B%N^ HAcWA'GqN= erw|K:eo%ɾZS{{}Lݤq'Bە6^ot5!d\ژ;³wO]ݙbG"H2), !=Y=jJLΧԝȝ;E}o }ٙs@;{QB3z#*Ycrv  cMP$'F¬%e BTh)i>^sBo`[fh_Lsn l\Iؕ7Ǎ.'Q+sR"3Ȣ'-n ; qOX_H \;X+ù1 ;8h03n|Yŏ:jCe@r&qȒ\n(9|k{=x,!H\p*<[l͢YI\W)^wN ~EOn{N9 QV9l>P;Dkv9V(m\05DF$aQuyۿ($TCF}0y% K_a{c owR!黳`lkemgLV - z m53 S|Kͭa>D(>|D [< # &Қ}@8sCɇF拞QW>X9+Dc=10ڌ !KBt1S1^Yk@Im]gj>K }-2SS6s)mB0sJuCR5pR0LAd }괞tmșfQ} Rqfp]r+w[z)2yelsçcf5Ms0z7kYtjvY" )fT‚}QW$K٣/D?!K5O w>PS6 xBPY}}g\q~GɫKN y f\ ޿ix|TȻ<:pz`o`6{}[WPXE⑊(6I2pTZ =zx @5hw鲀-#qH#3D.vk"ezeX8@C#l-JƠ=SέY+MTg/YX9z5š: ຫG6rAψD@yNۗ jGOP^#W3:+ͽMk[є;wN_oPW+/tШM|tm a tQ I^˷? /kWϱ ( H7EKn{щHrV@aQBؿ>4w_Q2*)fh傄Dh%r֟vbNnWe4]r> 㸬trWYV'HS~)Ksԋ1uInX!K|T? y)\L¶a2RNpYjǩ1NjV=>].>^zKPDöB<]L'yjMcGfxoN1Tں/m戂&# (9zH$P'Z1z?'j_6͗$7f:֮#)<EǔҙZYt 6Av+w?WbI'[(NaI}9?nsl=ȤQ4Nޤv jraaU;d31hmlxJ$Ǹ[kko }g!y;~M ePf*vKd]e]T8%Y `olluo˘Jz;<*/(BdV2`jqM=6<XӘ рV)ߪ'._9KDytM -ӲL" ΞBkV P r|~o`|Ø P^l==>Y? fzy_:+(`;l\*M3 H!ZȬ;I4s^Yndt"b& P{HIKb5a%' @fYDm^0kV3e󳇜D &qpAQ7Vb=:9*Jlւ4yIn_kwU1?<@L+ЈN_`Qdc].0b*Ͻ7Z4x8p>^G|zwd-tN¾'He+?A%\|J;ATy 2 [xNx1bY6G/1gs{9TW|`Ü0 sz#&c(VcT5[c(;{5j,giKxtPξtԔa|͎q\$+\-P6c"KIn9NoVXtKTQEZtc-<Fؗ'0&t |axڣq^{ʩGW<+6":@Yۏ1: DҴ%7ꮈCRA;[i0>IJs@]K̏q2 G$_#}*r1o@kbMHԪaX`OPV&1<=Ȫ(wL^6/|Hn֋$Ԋx8Aգv_V61s@ t ;)׻"T֍{L--7{7nj()%$bm TkOiPg]Uk4:C(/1;4:b1ξs>VדyI-jހiHiBLɟB.lȹ׶/Ra53qKA*[;.@ٹ)mO2G Do?GePP5M1%`6Y(VB-@Dfޡ;jWDޚsbu3d5b~P. \tCIr-7hSԑn|_ywXNߠVm9m˪ܣ˯T@ ؓ|Z#UԟҲ;:L*zJ4C?$ NWudJwi $3~^D/(CuS,ۡ~\*59el3qZ5EW$A+ "[6 sB+pTbmo7O3{<'`mD2"4/^irY].c|H`R4Kf£r }ѯ>4D*y5:斬p\B3VơUgnuP g9_Vz5Thh#7ǝ/+q+J\]%v_n C(hiZ5$?9-Fa#wL[EWpWr 4`#-p`bشxyf³Cݓ"+ᷗz-BJtdnLuE\?T7C]ϗ9P?Cئ z/L%OOUK~eG%N;>VT>ESG^Z tC=XI, ;Fpba=1'* _ ~-%Jf(`!t#*:#a]B~%(B$e:叻ڧ*ƢO1$bUI 1g|'9QS\ F$4N:ZD/-")46J!~ey6;鱿cVaQ 㡙D@˿+,m5Ψ7l=ENjE{+ M_p9KѺL*%PJyhl/+&SSua@cd >1Tz;Ζ9~ch6j>4bHpI]$Z2ΎCi}wt0)uMv}{UhAhU ݎ2 MwhqޚJ'nDW֧]Ue4}ˆ_HmzMCޕ][xE9<Rrkh^ VtچJ{ /[­.݇F&58\jh23H5@do3+qlȶz1NrgkF& yWŌ"K |崛E7ßuzْ=P9G_]U0121t\[ #ࡖu-?@k`*psSBǵr{v۴S1 k.`3YS0q'bjrL_dEH!3?.A E%^wu?}'Kk45FIU| _J㹱#,JٺgzmճM!J"7Y_mς2+F׏'}Z2$C&D %V+~L`jYElaG|xtȿ5mAڬ/b9zV>RZRAdf\qƣZԣRQ7.gG|n"Qjd?pj/{rNl1jl)B4h 1R_EIN;ܻj"fŝQMsH)U5[iZ&`ɇ ZY6p FvxƂwP`' D26ϟG3\۪[ȳH7c ٍqL4@)DOY ڴ *8m%q{q |4Ƕ\IR1Su|xZ+SS|Drդ4q}S1U>~@%9"wSQLg Snr{뀬gzW MV%ǜa`k]R!*P$^u"t 'fHd7o$n]fDy<'cV[]{yzy XCvJ{{ST4]%ig4ɂ(Q߸ {]}C?do$ #onɹ>1Y N]&J:e>{w"&Zn15"9$6ãtx}'*hN}H'oE=tf)@ƩQH\Rab]'?K~H|kK%4 Cʵ 7艧|zt|,82XlH+F0Ur.̠qbJ }ï6Tt- QhI1%}O2bq@9& l㰛ݴa߹"uKZL~E"^ҷ9Ztؘ3ݙ͗j!# g8z/hqXWs*`֔%78ѰpOS+t!CL2gxªsi9/r#rMAՖ@1} yzi(0,24@PFؼ5@J#?~b%9 Czԋ1k¢@y(ơ&vu|^3ʼKf #@omt:Ӫ=mjU2bmnach?mà ̗u$9{[=feBcnY_O}T4*XluMKP4 `΋DW"i+}[8_鶏cտ* G Llz;sG85iBU~\W۴V"3!}}Gq{zپ2t59FOIJЊ3EmO4e9C$~m.xHW}D;tEe>?iqOS(Q,VY.̓X7Ӻ;-<]#3+ElvU0oVr Tz{bf/wߝBLWQFx:A{e&;M쉄gUFn ju]Nבm{L\n,TMf#"w3nf~*]^"$'1 ԝ%ȷch+ڡ&{:Hۜ ͩ)jI 5ti- -yD⫋b[/%SucqG*ڦռ@  g-TPdaadCi 5fnퟱ9YÊyр$xWH _8}:Q5o;{Bb`JAMAً yžt} =Bhb =ݧ #LD6bɖtNe9;+HOֈ8^ MALvS|[ ;\nQ )1<Ĕ^7+lfy|-Y@ºPVaYH/Y^in{o}Y.PtN+p00bsuդv׼y?=i8+ߝ=2ԍ;fIj8mL<Hơz~DKeQ+췾ܿP/83a}w9 jQ@m:};Nش¿$h\b/uwPZ {Bhj[V椑Q$qe]rzF>,ϺP˶!ڡz HyQ)ȰHBI&QͳѠ>" ACۥ2J *z%!{._9Xm::WjHk&@v)h7 mͻ}zh&C\]Xw-ؑ0kAp$rt%ZlĒ۔:qk0mVw7ש֍=Ei ີZp*:(l $mN_'2zf/ߺ^;P]z.x-`l%%GA5 ⱸzc}l+:udΖUT+ǩw9T1 ^RζMw.b 5D5VrӴ#јs"xfI0A@}wBLl5=7咬 щ^ /O.O5} d\W;%W9aDQZT]|v{SfRMV7kK²1܏$U "WCX8npr*|c qIQNuש&n6{^C{V} w 4k9h43?D%JԻxc/U:"c)mS Qi&0@LK C7۸Hԫӗ'Vj蜪OJ>_*y5׹ð@D6ogcE ;]S p=-kVw+Ҍ?f;h_Mvg V4 ?%4|&.by$:"O9&7p?iA.yen:ӂw,AFċ鹹|aDMMh+9iR=N$޸'gYs)+:yRSdfC KhMԎʔnt(myה"QZ%ϡ6Yq:;fr_m_\,+-$x:ȯ|6K Ui}9ԿP@c> (c:4*Hq6s/ߞp:^oiO=+tέfF xN}VIf&ɬC[Pg^az65iO]G1O'$0OgݓY/&pRvs/K}6R)s_gj?*'ܴ :3S;~бa0 E %V@{uXS-lOgάKAMq[-r>AfA%2rs#TZpUq$N\#Ҏg&IxѺnΌf kc__. t[îJsW7zQ\+)2Lye|HcT@D<7 5*H7(݌{qP4^0%; s('4X"ƊY2,ZbBAZpt\:q+.%Yb"/ #Oy;އ6 *"PL뷤Ë#@_S&id u6*-x*a8ڷ$Y)㑒*;Lqk3ajWA-X+v!wՙ>R ߡ2lQP"1hI oe0ȍ?p/HN7iLO@u%`}h);'@C&x˿vȞVE3ڦ`2e{Ԇz̑Cu~ŠtOZx\{ Y5k``qc* Ee zzUGԴ=/CB-63#7)/BI?&~lP5,^}ctA'(R /傷#ꦑ?XO)cEj3hh}ԎҜ^?&1`FV2 r,H8 wgه?`HkocJ?hÝ2 9c  DjU%K(`b-:0B%75@iC=1υR?ph oD:WqoUc+?Ww`}ϖc:y䶁&,hBX@` =b YxQ )ږ3GIufʔ^[w-R%]kfƺ)â5MXxF+"@r9je}'N: 1uڄR-V.Iq`1t/&? %bjMC)zT$Xl[4 x-j7  &i z $$˵asOzm AVN({&>c-qTa=l@kW rl#, tdL jN9}51nװҲ.5HhRp9\Q?[Ds'y"n:<fMȫ Ϟ͜7UIiLCm"oB Y}?Pgk&ݥ!=T=&G&+A}%L'\s QF)P˾"|}vxed_:ZQqcM8roǿ響Qiw*BGv}0Mh7t* j^BIhpA{ܔ/ID>0S Ede5._⠄ $>y?O?-<# dxE, |&u5]u݀VBJUlaFv %5.q|/*(>0"ɖp4bS169Z5zʪTDZVq+a8TEtfY*mI8ĝBī;pwnWkZ w4%{{)At_-ZR颰!+ɜ2Xo ^QWLz:X^,zWTyؠ{5ZfTHg?]Ƿ~GKn#w,:ZmW F.X.~(+f7<`soEP8EC}K̟OhU7hvYϖË%nx?SHr‹m509s3h,[sN".5gF6Hgm8VJ:RN4V;p<1+#k,~8JdD OlRɿ8 5X8>n+gXƲ [bEǏ!ig"yv}-PHrxroBl)DR OU<ԍ* `gWW6#d]u)Xjm8]JC/1܃3 ;j{g&oLa延8b`2 E#(=@SyMi59;ؓ'5B]cs}7x`A ՛Z؀xA,v яB3ю+o*NN3ď֝; 1fOB$gFXqs33&G6 ЫsE)}X?ďhػ5/&S#ĝTmG +LY^+-#4[HHSɸjH\šd:`Q3nzEpz U\ ew2n|ow+tLV."AkS_UU*uC4Jh,ۥjk&ͫbOo:1…m.~e$*]1@!M3:O)vn% WCɅ?Nzv^RoWmU]}ʱg dR.$|M$`3q(?!FhG"eW)>yfbC*TV'՜Sp.>-,,v桦H%>Y,ׇG4'zAre?ZOo>2h܌`RV:Pf>aGHD"3$MM8g#$P?u3x۔--Jo1W˜\bJou`gjKekj'(eVf'5 F2<2j| vax ԩڱ#(J֡[3uWgp017gxuICz֒Yj${k  *~8 We3jiCA\*2JW_6L $_ϼ*iM˒t0m'k?55*ܼ;M{~9" 3$Av㬇ژfO=(eaÐUճV03˽p6.l:AO5^P I[[ ?q-I2UL8 zT2 giy\`<[x km;c@d ܍nڳ$11<]h)7eAk:alBMv1Z؁6-b[*Bame{RT;gFK¸ip`ji[?[35ˆ|z#n`T UZ:aQf/@"Q~f<؟ B%p83(5}# /7UY{<B%$ ui<)k؜92@lxF&&E łYW`֎|]ݔ^ jE`âft!{ER$'Cj{?2ZH[#⫻=^.BiD< R]yMZ06gKTmUÏe&}A*F ptv,]F.PVDM8>IYUsF+wwS-UVk$'Es'q`vC$XUkCt(\zzG/7ab16Jnk$;N UbQ\ 5vvgw"n@0<)HV܍s WO&emUhGa=(1.}NkGK"l"4=> N8Gr{\E϶UH6Z`^]mm8P;KGoDh`p+ t鋩AhBiѻbꁴIJ hJR"U bq]C*%.E{a@&bYeS.Bxog,!J5sF6n'U[q/rX۶Ъk o|au'BF{cU)dP:Ե"[.vxp6J( vDE!#'<xiPBׁUzх<9lІOx\a¸E ImoMT>ӝCd)Ϗ5ERuzYM"#쪊 4|Zӊ{`)8S۷9i (? 1? :$ 2aB<(C}6 $?TuǔZ$% |FQv$ΧQz[-r?A=m)?u%=-64)6SFdnv scSo+0`ƀ6'ئky(sȝzW̔Afdcr+WQ^os %Gk"2lZ)aeI/kՈI:aI;P42:x͈7o!,Bό765 }bl@x.jA9*qC e"Bxj4 x?5v$>Pb \Ara~KN8حDӏo^|FB , 1yI_QhbH1@f&3,hF٬QݺtcENOU1 zw5G14X[pao2 =HAj,F f4X-ܐ̜]>9$sj-*VGn!Tg׿aՕ¯eF`+0*UTgu&UNS/ۙi%Uo*wOGpT 3`XeH7eiԉ Zi%DZu*xA`ŴMnvykhaCǧxgOTnWoWxTfӼ ?7E$?1 3WLNHR*)c\=t O_N ~m\]Eop7mPT<~~Q|iLi墖^eϨI3QYR>W{?8\#ѩyaw!0pVec (x`=j8 * MrXKFP-!7<QR _qr76pt|Rh QU s\ w.OT6<WҘKiyvj-$㡅OFߔ~=_V Q))}:5:Ӯt?]l9:^*;8nOݎN'.7-/B3EĤa$9C19k't5b Tfd 'ͷxZ`zOxn? #4h^Ƕ P`Zh@ʒsIkD5Ӯkja[\t9&(gHF?JtC\MV`/gX\+чtL֠{PO]oh6A&EQ2SEl 0N ZׁSU3v%_F_/aд>걥1Ccc 0C]uAa3AGӓSaDDG#q&)<Wt<{=p x$^-,좘S֓U6 ?cjA?x0GMO¸gLfu ;br>{]t3G@')',N|>mv<ShBZ&_U=X 5RmGGֆi,oKC  d7, "S3ʿ_!њ̃Ӯ-Opw'.8^q5ڮZo rgjKv6]b\'%/s?K]Z$\͍V sc sRnd~_f,úv\5?v@n_|vi"5U+b>)' 5J\X&lox2oNwy`LK y =ws`,7ѻ2艷Lak΋ q}@"r^obgF }<!>0 wph;NE{\ԚoƑ(>ae?B-J{t^omSkIz$5ۀH G::ܭ0oBqCxP,-bꈯV'oLyAR'<®I&s.s>g:s%/ƮIFfTβ{fT]T%f;Dֶ*C!*3Tɰοnӏ_riܙׯ8{ Q*%m0D*<8UlU}gD'2e;>抢<+\Xk!iA,%5o׊[=#՟^F\8ԣь~҅w*JT:JgvQc,ns%ik\-QQÎ޳Vc8 LZDRSכZ^x4@QxMIRdQUcgTqA`"jXJ-E 7 J[LֵG RZUe2AYhwd(mw`?7p@h9|K4:'4l}1{v:++|`(-'YroQ7SXTb5w 5Ic0v&awk6Wtn"aq3/2V|6U~\j'q.9(l >Tx"PHE3DB;)0wm_jNU]* >XXp \A 9 Q#()*3b\FTGrjN#O $2ackL쨑=^0 q-M}a`qs kx3v//aIc>"D#DtIny&>m</a5p+DjۨQ>ras30g^菅=ZwmUy1L'qo=Q7:@` dp - Rw0OM.*bs.,OTgo }ri\oHp*ؽ"2Sbk rxqw< B|w 1Uf =Ǚ74 oB0"@o O("Bh44KtuEq6~@H<+NƃԳݫ9;S /L*SRNhhьy'ĬhݣF>M ˛6,ٷǓN4 ?{RG⓫ơi۽J\,xu^yMq€#U{9Cq`˧.UՊ \/9/'%wtR!;K1%E*j^n^˼ċ.m59XMJXMMYp%+~Cfw2{ t6H)B VOhHOmv]MIaS c:^Etzu=. k{JJ$v>Ā.'kMِQS@k"2AEn們6XZMzӚ/*qU{={wqCԝ<=kI/ GU6W0b Q]4q׊@˱9[ HTF q:~u9NDF@O)F~MbfNiLlXl^JS`iԞ3']u0#HmPg(YgE0RF6=2vstFKmR{V)qXBqghR`8 qN6 ΎݼW*Gj %фV DӰ peET5 ] Ae@S`Uj&T?a?QM2+&41:Ϯw=0 Sz_ @Qns;.[zV ^yE7tL/w^rsv6XgȾ哔G*qˢ `/r'=&6eyJ ?єJ2WJ}uS.k.Dn#&BD=¡ds-g+'`[Kx#[NcZ˳u&^)bB7.QR93 {&vp=k#0+z\=J\BZ7x N2мD OcgA9+᤬[!p U߆x@5_Hܰ49sW.1{FU) ~ >Y9uTPf 4k cSLIJ̐~ݠ颂J>N (6@K}ҹ]bKx[ 0 o7$-P (MT6DMWL )5)Լn (h,!cTx1 z_e& PmsШM܈? RPsݲ<&RO(HhM$EՍ/'9ϣ:qadx$V(Y~Gh m!b7'8FDeJ0}9X)ڵ P]4z39sBvi"PUsgʛwqry8ɬ =92zV[]:fu$OFߒ!-m&YVNo$BwJPlP|7>AUׇB= J3y mY&|)M] F<kůO::$RޑKi J2q GV:}SSC\fC(uXTy{`~[1˦8rv"(y)8sT%UjmPBG=8[7}\XoeraB)7 #֎z{(jeu ɦT# mF~!;\\CX8h)ASm%mO|m*xivHΜc!^&S%g~EVhW޹ 6-")4EI\3:W٢ϔ׏נA +"i5R6ji25ԧV3Vǥi>|ۖ.x &uX+)m 5$r%ItZo1y`rnCLXS. F,VfNVk!3|1(=6:\a0G@1Wf`II!rsl"?) <2 %\=@aKd'9IݜNAU%nwkPZ&VgOP*ѷUéiWõ.`euURlJx(q17f-/න+S%$&LZ66vܴەҡ yKhQ>m@+LȆD\10ԉr z= Hj^80:3uNwHߣC~eMf2;%78HxMҠmT-.%UD Q,ќO1U7T?Co)K R#mYUz?K+#[&QDgOT3IE,'i95YJA=S@jPZiY˾ hzRsC&ж̣qIx`Re1dA iήb(cGـ.˩Nk-6zώn%E~<7QN>7i ˽OTynT5ΰŻG_tfwE&cxjNUm %BQڠO7R6XNÚbM:T_3*rp.#T[-}*rYR;?J%z$rg TǨ [N_Z ,ccj^ݏ]D0 Ek n(N5r .(1"J/Fd|,lIvx k%WPzO-9s)U[D'l>?X> PFK~4q/c]E@e\OҗG*y~nab({fB^]˰~:?1͏ح$%}6Wi SWcv"/(PR4`.vQ!#2e}&)Hj'-AB@y-'xG7žJF4s&PaK=k xhɓ3tT0ˢJXJSII]ʞK D|e7T2P|c[]*Է(;ki cL;,S" jvӍx'3`xJrqU̒+L\!Iy\BEqO7aKf g<`obA\[$ +‚;,G!ߜSgU <.&R "Z;$RCfJHh nA!$ <`)d!\`1a5e;EDA>PU=cx'CO<5'-to5al#\Ԅ00еs5O+o3Y[[!Fb8W_4"1.c"aztF?+CgNbJWɨbGI`an߆Ñu-O5򅂡;BdE'0);AW@f7 a|U9"F]$N3~Ou㲁߱`Zi+.FkvTkh2jYmk: ia+]aqVp*;#(s8gX/{oԥ e1. f72Q t^|X]4j] =NM:<6[>@w~+rOmJ-} 'z6Ū'YU̓&@tjrj_c ۈ]֚sLqN岡1xdfcj;(sW]cPpoޑ}ӰO6cjBe# i_ 1˾ӲY"ΙbYoA{5=_K]"y,*e[3MA|ќ|5DTFA^VZ;I,>nK̷Q ڛ iS$;,|v~ͬRu/&dkM:b5}*,r0i|c B-:74b/z @6nq#%owY *aTwC]wBUk_%%5bXMhJI'J7(U\VK!(c"nBvUR8!pu? soAD/7A@`b JAվ_1RܝW5lW( T靚zW[~1rNr),UVgcZz%侣nON~,CbjÀ\IQMʌS?C7 {1zp,>E[XXYi̛#B:jW|F&8~_0LL&0Qf57ȶ#bpWY×&E__?oFaVtRcMr? Đ'A l~"MCamwCu<f{'"ai{#%I`U͋=4LDq54ѓ4z7M(~#1*&M8 )f ν} V픧될'gȂ,,}AdMFTDM1og $hU򵃀[5d&9*h./S犽C"3)MH/F 2-|e4#lh YR"%`^5qȨ\njpU[zye~w%1gNa ]&oz)wppLa4w@To?¤4K, XU/zVg%Z6B5m c}E%rhkTG ydq?lb;s:F[}Y 30+RH\imݒ9UYWٓVhn9ArU)= ߐ̀AőnMY&ۥ#CY7@,Sf%WXQM1?MӟOe"j%aaGA3~%C_^- ǹCxw_Jpk5zhI#(FL*}l,JDxUcc%P\**ߍ%DX8#8J&˚pŇBb5d79j5/v`\&e7!p^o`ɇb(?C'(=tŮY!/Ye:Kt}Ic+?^8&qH:Ho0=&AR>979R{H@cS!ׯowyзah>e}NZD MȽ7+w%  MwN& x6g@BĝG5FC˜kt~#żQ;Q3 v3V pV݃JfUɟ1wA߽հ)¼ܼyGdYI6;/i!/8GnLd.ǶTRiN@G(H•UW0)0QJ4-0`XH^|ݽ{ds*#۬zG4",#H+-5dP,:g?[d_s̠D 5x2)1߀MzX5P?K]!#QP$MпQ#$&ؕ ^y*/AAlIdf+Iq բO0}$XdvH%M芫TwYmrxVHTC7iY#y),|u.=ge?v.)]c*^LQPRӬttyp.xX]wTs";iFj|gRɯⷁ+=tlb(}'JX/$x+X{ I*U"`[!U<Ѫe3>*"L'rr3TfV4óo+!=/_Wg0 gQLzl9?1ģ[?i@#c4Pq?]]:ָVwqPL]e^|6Q hLJ}_h5哌7)#5d&((r-9a>klV_Xف"K oLHhu-aǷ_q<4[YfҴfpUy9mw=WW;.+z4e a1pSd6\aգBYGFnD,s382C-~0ζu1Y>`,ƶgEv4<${ |M41"yX=ˤC@gARYx\7lCޠq-=nC)TXLj]o>ہ"$eLt+)rS*- Ca.Z_5WW鼂J?n[ &([0x^D񑘦 P_ړbqs] RAFXҭ|EXq*eqTr=:Ȱ[6=vqTEM3}BLݞPyjɂ=^~羘:q_%[jF_DA1x%mOp}IbpЈh.Մ0l{WgLȒzC7=9B6x,}q`GXP4V>w%X<'ꅙ*( _T՜{Q#!Ƭ/S@:I^hr˿hRUA$Y3qۗ $lyoͩA4o''^ǁj^Lgs'td"~`i d-|2/c+ w9<U%ʻTcvhR`*tE^}g&.h% lNah.m+ ߀+eN؍!)T!Dz-5AҶ2%{أ~gB N ^.yRw."Z=Ĺ]\]~Guw4h\~( #ɭG q*'Mu)]ִ _* QTvzz >` %5e%ӻ&' i<@zK wY@Ji 7ij3|Yt{݀yHe">#:Zva48!}EIC_i|v&~6 g,DeaypbJj>eH# +AƳcS@|2Ac#LٕI…\${ /yB' eQ-"]Y0k,pتҾh,k[ydLpWWQKD|X" ĸղA|CS֔4yXJ FzwBR&]R6bQv[3 3%ޠ]k+̄l8YΔg0AD}=TmÔkgH"/H?SpӫHBa`8">? ArB@}fgAp!XIƪ#"#Z;8ګpU@1<7u5##SA"uU3d>OtBw$ G0vCA0RDUXɬ܀c>aP,3^fgiT-=QDS]E„Id[w^ŇTXN\9D˓?G慶R 4C9W[Zz'3BP81h!<J<ϭ#Voĉ\q1:s` P-)/-PkM~^Zܤ2EI)n K5pe W--aZhd^oVE0*o*/yvrKfQ< ⬛ ÞȫQW|UIݥ'[D3RW !tX:TxCfw(JJߕK1ʯ5z*`YD[šQ uH.n $-tT.mCɋ$4Ș-U6J&q$ʶ5"gkV\-kH+i]$L՚TY{:Be Jq4@,n :rNH=%N*g:R~g|/tmMbyT6 ,V3zi?fK?\QQ~Z hgl-NtTV0H# lSM]]db{-1ޑI|m}xTJ7e>|-zϭ/" դ (_UT*aΏT4!:DYuQU`|;$oT˶_K'x2p~v"K2䯄cQa[}iKC2!Kb'gDVE풢nŮRaTWf*4KQPS>CEoMvVzms^ΓkXwK}aH0~-}R8|b Hw5RGB YSo hQ/E¬&ksMmrBGQ212_=Cc '/JbY V{.\R_|̱E4C$> o΀9,fUNS/XI1RfkO#6 ([43,y[ wâyR]IZCBc$MA3sC gw5-g1pd2U(l`8*%0[.Yx/* Ѻ?WU!R~p*]pe/ɷ ߛ X/Dy2bȥx!T$)J|Q `gx$81ErQ&68 QZ d[Av,Az ]aZøO˝if TMie83$m'J#0 ~l/ՒM%憕D~sq*J`KSX,.XjYqn9.-. ܷ;g!wV H]i)OhWuM`E'-d-#Uj؉pUY<d1fEMڷX:٨DWK1A%LWZ c$P!,84@,;ϙWU/.T1v){r0'Z00R0J{󷄻@䆞 {SU}߶*ԽU-^6ğ i%RA K.;>?WL G=KoN5; 5K:vI @nHQy ,;#b#F8+nlokoF ݸeןZ X#T`ak_C3S?Dz6bMS=t(x˦qNE|`JCV3f?ī9E6/Vk$h=D롰8!KMZ7ذb=I7LAAU+1yN;7&/ L4C̰-.}z]Vnj0x,XR$mC/ԞS{YYu:覫.v>x@|JS؀rrh%pEҧл~A+hCu$ΊBؘ&jlqOpZ?ag=aEl'VWܡX\JTd bc~ *LyWCJ][w{H![FZ2pSt ,I/-pxVgju=)%b~bl/?QH|~[PP"[zݔsoA¶jm3 `1eB3Je#=!GWHWe }L Yg:hŗy/.vMbK g!J Mrj7 > >1̀7l}&lWQ_@E@+F'+n)b|F|`bPY'DnOG-%+r=WRB7Xσ:^@7̿l;1A `] *^=f<3[obT:5#{0X]$l8R8_ +80;[jT_7׿x+r{)l6&J6u$jTI)!ۈļqD6Z"兖{B%ˎsCmyo,͉w }Yrvrr)p.osp8ݿ$hZMXAhZdY䲭%jc q{Ϯ+BeHt_8ty%R^,X F )"u0rg lۉ1Cɣ:u u~pčn*O!yի}uz”E_׿{q%p=D@vZ>YL+oO"%}LZKD`j2*NO++C5["\_{ɨMz^.;9 ϟd'nL,Tr REcч#+#W!*h"עD[Rfj L]|} Lty'iΨ\ҍlE|_DX#k"|X;ovYXyӺE.4Ƭ%NAh PlWljm,|%) h\A|] 6D ѐRXS*'fƟQ5灝|t6g~M'\ %j1 丯|1ѭ&4|C\/r-8YӅK_C* \5O_>/-C [%ҧtcџBjaL NЯuI%^n4ۆ7(>UP'ĨgRKAFh%doTE:Hwrp0!W&8vq- ;EFp1G=g"}KTs>xrSo.ۅU6mmv)i+MATuR?ΦTpw%Ojokș~e :סZVM?0+\c8rbcM'Q6 x6>Omv"tiC{= !@L D'\!g0$b1<LO %}>f4:?\m% +/"{piv 8LylߞL {DgIbܽL2>&oi '8V^p E H0\mO'맲K%9 od=F&ǜN% W5Zm9>̹6 oǣp]#x]L3>HA#b4y: )`,/M|iB#9 0`2DbrG?ƾh -U=U3-4C? 1b3K>VS{\ȢMnR,aK J9's.MyI}I#0ŃH(ER8MXiѶ@X$Ш:LO`?~Zjζ t]A>\^gbvk; ˸:'O y\o2=%g{e;K8RY`v,Xt"V;V1h]"%GaDR N]Jq$dӕêEc/M1;Ϊgt _:9Uה> %Q:ӣYhG j}Wܚ}PD&=K, IAٌk濗(FsB!]7qvd0"A*IoO3=z:@cPbfcYx4X{;b>gĵ󚒂iHla5Ԫ[~OYB;F3gB }y)MPWZΘ| Kj:ly{odjiBa0sl}0{ _Mƃ 5roPkf9n}P]<( !,pK ~UdfeDnD+N67ڵ\m;?zL_mxhBɎ)S?I5'ҿ/׵Au6E1A\M-UPLF~X4C`% IrUrWӳpjҡ,F8y 'ٷT՗*/>H2z^rݔL2FsB `ְf P,Ddp!A&# `\e^T=`KKF7JW }+n^Fi9'WSn8R;s:O5U7fRӝF'4Teu+ߙB74ԞDQ /KHb6Wl2% v"L;ŘRdWf kTn-@$@0yS[PjY,hܿ1)3b NDZL>607=$W&#Ź-\02E#WZ:1DK6gDfy範䁽) (%"mx`ųѼ>W]g 3 T+''Y"?;S7,|-ml: !voYW(O D3_qj?*fhn`Q.[inQj:mὉ_)ű},,')159xqmhd) ;x Q_+p-}QX-a-IW/TS yfs7!{nIlP҈1SЈaN}߂WVHаPn9rS&!@[`MdY0P^3./v +) =pvW7.eg`G9 bcp*UJ7|/%{&c%xMإ#.> NjrKK8?3f:XCr R&p=&ՠ 趖 :C̯)֝U3Bkz27̈́uy넹'HOXNQ-Ve.8Dd2Lt<^O,(mo{@ICYh]WH$dUީ 9=Kٶ8=p*Q|m?3ҙewi_2k7MCw2¹ېeݸ2.a A#1^}2s.l>]04<(ijټNԌ/|uȪwz\1,6 Yr8J"^kU㳱ʁ;܌ ]LJȹ#=KS:ST83{YEV4hiʗT~qd>IM:OnBt cIYwgMe.MzTmL+W!~Ys zT"8f><="v'&C1pbU1N1i2 /x,6h%frƫrTELߦ]2xZowݾjtF4g;RMr:C } \vS~>8"f@  1_SOsWKϕ{;T< h?nwp`{[q[hiWKPW WaȓTYhi_BOk':dڱ^wpB}zycvhW-||) [bT4k 7VRɴ7}kD 4CTXN*I5u=vww"#w!om>Hmz^VJevY0"_vJja萒Cu@钒UZH)BxT2 \G\i  üƾJ Z30C-k~n;F%*YNOXX*eZΘ.^%E[\r-ǀ,KJA=Smf[[@{)SYk0x7>_֩Ja}}+XoD>ªZG1S֪_%KvuDA ҧx2] E*&{ aVyh3#3 _ce{s`>)o1ٓ@>X| Wt I$UXӘXV^O .OEazpP( HqCR.Bf֋|AQ\= S<@B ϢX<czѷ>1qN~"a+[%Yw77c>;_5,]q Z4<..TF@3 pI3Ngk]o=DX^s:#Nm6{~bwUBTj,]%/2fW2wgiiaABVyHRJD ()M<=%gvlY \0u"|whc b5f-rtX D=>SØ|8IG{`˜}E ]w W[m7m;%3{v_*Yb ^s0E%JD3$j͟r\;ܵy9й^W3-W?lT5Ɖ&$\J2i벷-zK1Hezc5Ch8?OR`3_c&R%ͮ~Ccž&qYoTQ?`2N8]3IfiL@_vҫYKGIɱaSv ==Z% Qw/k[24I6N>LX)[!x[* AJ(mn[6xOH`,(9#v b3@9Ű~v$!pYS Ҷ06(FRQd V=Y7檦LΜ:ԢI(vnIS)q^Y)>[kvφͿ`0tolcD2.6E@T~3~Ev(3]jxy;rqs|T cے"Z?yM`hGb_ )[UǺ槔a>gX|$ЅvOP [oEWui\Vw^;*)c% ?mKmwc+a-$hp bԳ"̮s+ΜQWfH.EkH4+EۍYXt#@@Vh]Vѻ&5| Nj! _|:Df@pEA!A~>YiXu[2hdyTp2R+)#jJ>"47RǛ j5h'E\R2őc'2^榶mf-2D;$p {i^$C|FxK晻=6#fln^({]8}f|DbC'1ƒXf-=]>I.gmL #% qɝhP?Fj=ynqΟCA +5czȑ3jS|Ĉcy#wg3wT8݅zlV{Sf(IeuhF5uunܺ5<62bGE2lɔ&k"pyoKRY- 3RU(Ī $z~Aς,kJ1Kux,>C֪YFo-_jr"(E/Fԟ([C!!ɬ%G rU 2S0EUV\m4YXl&1ŏZ GH`N놕VG I\ Mg*L#c5LW u4Afu|*'#IU0^n%@j̆u)2]A_SRdR}P}d&'1 pRn?6[y'.MТ983l-iG ?ͳl}Q:{7{/Mޢ G7dZʮTl_^6= K'ܯk0l+zMFf]HJpY4fѮ3'S1·Y5H|V-,1'T;y4$S m>2n]%2MU'gvu+;( T4FCtru -ӬJcv3@#9Q>4  ؄xʕwr<:) a菏ֶ3X=a# ?8lBlA |xlCJeC4^Q0 W`ЫQgH)D43ҭiXue&WVeQD .V$o-IvۈWG:.ZAtKrGm>re}jb/ӇzU7^ʓa oBfCL3q$2P`?W=bEl?j&)|p0G$R;g÷C0p$TX^Z%6Y9`En 7P0ǤP<ҁԣ埩{;LT=ޑ輽z qTn=$x\ho/HJ< fa|V师' 5a^Nn Fxj :N`t[P=2z^#8փYHhZeL3 ԐcÖOcK=iUuMXAtq;5?{"h3aTyNh2tښvgO(4S+72~>QUo큘 LWBY4+J7Eǧ9۠ `NflBh 0%[ $Ml . &Zzݬpd[KvÆnȑ O}eg~&~zRN*Zw= Wՙu9JF)ziXgt;bx' hgII]bwUf_twwm77Iyڴ Kbx|/]erP };zʂqI/nlK+﷖x&<^:E)AsG)5# XXxzJA8M^Nxl|XC #HDM)&X+ƅ(_F n=j|\2YlutvQXoa*)?!x%~1,q%$7mt暳O"5fm{PR9 S#?Uk6Jw5ɾW_٘|Em]YG Ne+]1>qdm?~vF( KGԳ 4" g3CA>-*$1"Xw10=P./7?(K6Aoʫ$$N; ;ךG)kGyBTa;rϨP3\͉D qvT%,?`<7w'tMBl? z&;#K@Uyk-UkPm>v6f8\C~6I'#)NFvoTڪtV ۷֩>:ǀ_,ľ(ǜPRkMIc<0N\ T;G GѓZ~36tkM ,auǟ%G(^'4& DF ʸ*gHP@LY˟|U{p }5dҌ@2]߇O`xS"T":3 Q%RLnFzp)&e62@jcw8`fibޜQ/H/ op܄bFx0ۢh%Œ0cgNŴ%'$NΠK<񔈻8G!w~ZB1~ʃ *{rojm;5X߃w%2ߴ CGY7Jp" f@RM.nfhas&xIfm.,4cXSB|^E/z{}tVWzi~+%1oV bð4L_+Uӌnv3gֱ aDORFQtR7zƦٴӕ_.i"߂73L7:S!}a)k PiY,; (vr!i^\%ɹioJpy);p6ZNv~h]frWҦW;/C4b~ޟt}8F[995bdI܏-CL&V[?!,@~dwG{yf a).3t@ .FyyY6b#YV.OՠHǦ 15IdJvʡ} ʰ1.R:˛1v1 e{kHy IGҵafB|Oіy|!҆`P/B1+|c OV:ɋ | V04H [Nb$N`#)avڲv"$]@{'&pNFԘi#(e^. rXk hS }L+fC"xP lZ,UEw~H @An:]&>Z/bE/IcFQ\k| xV" f%ے &NsG{ܮܰ3mO8ZEV~T%h+t"ޛK);f>wC:yܸF@9ce'RøF-u4 yp&!,ʷ]۸Z;,[XP򧻹6XUE3(eoǔ3y*w J#8`Hl"&<.H+U__O ETPbiZA[:&ύk]GʥIX̘23F]zͫ!k619[m@Ut z?(@sa)>edXY{mi%໋Ő޻' GnZ $c2̇&բ&qK[ μDp漖KT CR]wjo sDz;D6r{:: Ǡӎ\la!? _vuMG"k^Z n/@a .fv#K&̀s8Se^`Һ$/.igx\\-C[!f\ ^<^]Dj[A7{0π#8tLk'0G1x*[O]q-F+x}3e64\yȔc@ c/ gSG=뿠ꋍ71}եޘ:Bچ>56qHCV,R{]ts*]$l.H8egt\71.RCR~鄍lO)A ΂aoZ`KŦ 7 \}qxul%p8Qo),{(||q E\2ǍVa9,P j#Sd2=z"%B1w@"K#Yz6/s#)v: D4xjxs!1|(SͿ)S/r.{g QM&GvX˿OA1*2+jo;Ej@nO6AYA{"Vk]p̈́ɴ?4.!-8sklȺn"E*dKe  C tQ - j(qq%i0!/w)!ٍg ni.咭/r7h X%h< 2ƌl4\z z?.oRr3xb7s{6xD;f%1@JGv3BR:4s248e۳,jV ngгk3[GޞS+'39gz֍ɑf+s*~1sE_AmC_nu9~c_[y2+*ڇpYjpݭimr-h|a德$$ӯ,rhlE͌kCl]llYG-PFOVYkD0ww5WK X%usÍ CUnVR= Q&.wU ?\ F\5] Ǭ,ljz@]3Q6 b Mϖ*Q`n$UэOS FRI|[ZELm^71 q8庎!B7pCޭ=椇h&xAN+V^ś0f4HeJV5gWdb&H㜨D)x,I; \,Z-4$z!r}ǥtY `Mb1x/[_^fmKVcFzI{[RlWL-ƔbCdsd9@KdÌQ$o,n7VO?n d4vrR肣%p#8ao&7*EH{ ,9r= =H'jQF-62G;?\@s3y7x@i<"_7*J۵( :˿ ҽNLz0Biռ7A&`ub$uN̵HoNd.+}i(.|~%?5K`au?@T?,2}*}.0QmHS;fߋ,bsG')٦ CfQd?'Adzrjd a!O%kr BW&?~!۸9%RIZ 0nYk(X)' ]HScqaO'Yxņp 7ahu4lK=Ap@P\\䙡\ƅGǚ9")9JѠ= _h;LVeVO#d(2&VƋfg|Bs7T<3\?{M.}{WH_-S-:X"*֯bbcb!y%xV9AIO#>=vе'1oyBqNkP6'Vjqff[E+* ~|A2enKm H3j#9wJ&ai͉+eV0qT S,|^"1;z1F̷-7a հٷ - Ie޹QkBz g%*n,G&!~<XMo/sr^l~Cj\(D%4|g2\uQ*= WM gǜ Fي*ewd5 }a;$}_\0jJ`8ገ@94)7S/zL!@14[5dY[IʹB>ND.#z󿳐H%|* S]L)'$*f@ȴ[bIn|8 >Sk]ݡiaL,)X:kreJ_#$S ^ UP/f}|1ǐt! s}y͕!X:QvI7\쟥`s~?,#w1\ U Lk4kĞ<ٲ>JjU'JM_Wzw͞ßl|fkD f)?:92BaY u6c,@Wog3JPL3@ɰ5}g/ A1fUR;z4^R.iR,3v[6rMeAblk `Q㠸JbePwmֈK*ZA&zhtN2KIg5N?%_RIt3=9F6J:2c. ^< -]̱>S*N1 LkQ65K8X^:k~YcZ#7b S^*ЎxcK#u8|->įyVh3?/ą HYCWG9(vه+O7؃Wywoq`QzE糽;G eh ٗ2k\ xbǍbҿ=6nEgIаt!cJQ545[0rMhL5Gm.D5-IU+hWjG|JgqNȘ'eS*]^qQcJ|AdM\'jș_ /_އq%&び{LY5ro쒷6iw3äi^Vx>IʃfUvCB.5/I1a X҃bۺ)wR]4B. g{ө#h I ʘy@ j %g8CG*PAS#;z8rVMh*rj CI;9mFdfPqfjwua(=T#;~8|W8feHO9`Ob}K5h Hrƽ,o{琥܇MTGG̒PaDfP/=d/ĪDNF j aP0{f*\:>}Le-4[ -kOe*˕tS m&%s򗵃YiO^Z1@ȻeKzohᅣ@Tf(&)|A߽c+bpX${ҽ7sCj]_e"iPKccS9BL1 Y$h"^k~y$W Ļ?Ԥf kY~8. aPg2ͨx!*!C,3#S{qM$$\.#}߰ 2y`h} DhMcѠ0XBP;ӖAN|J\D <{*:[6&O`j<7'X(ZeP!)X EWd韘ndװFD߃έ\hVYh}oq)b7:1/ygXnl֞.GҴbOVF`!^+Α;seiɶl?A|gݨuf(e;BF^9%(!ڨ;SʥOAkl. 49f;Jazeu"#Q\}VVVt'?E%Ab)o)pH-n ؋ghlkb]  $$_,w>*r* 0Ԥ= E˿uߊJ[P3{4_?ӊruM8gpRs@_=h+X !m/SCZ\a#h4^gAN<0KbkЧ3|]'dZ2^{^߹/>H@EOɁ <-a GtA+eѮ,ү~ тuE&u^8w':I{;g*vἨ/(Vn8!T_S"rDb0ۯnPYb}Xz%Eq1IQXB#-T">a7 ] k]WX2tRͪy ˖ d6N,umNdU2p(ŕU>i,Te= &L- 3$yԚyX_~\zy̼)R+te|5v]1LFwlB+Q<_/-.\"*6Z0a#Ht@$M`=9QTB $F3LJ`ggx}œvLxt3>ejg_GOg*{zxG,[ۈO4Kp]@zTX{QZ9CQqZL?VbBa6.fĭ"2ҾX<"Vn zTz&yX{6)%n.QRw9'D, cWr w.jsVvY-e߆wMGEʊ! r`H]Ò ?o{L W &u+I;t}?_Bax Ӈ7XE.z3XЗ@iIMg<#\Uk &ꋄ뿤Ӡ7pl:6b`*D: 1McM}ZHMZOe\DrjEݸ1!#?٬ uL7~B+[+{L"܌`ғ;Ps"P}c}a5NMr' bco$6q ܌0!C—Ν>$1[q}|ě]O3ُV!e1RP8¯=5AWq;+ }6㲣t.f3xify$MWH`F/{HAG6AI킁 -RNAJW[5~ wZdbͅC;_w`Bh=R;_\=ϚWHs#@Hmk0/0ut-`5*6ū0 y?RhHP.(LTeX. +'wZ F|jbFQ-0~:yX[pi b%}Zm_{*qR%x24O㖆G])ts/E瓨x-X~4x+nML\Dw|qE۞>֫Auw'J4"De#=`;дlj8(IAև,J9(}L0\IxYNy2'`GQuz i XH" SQOYz5lK3nxb\/|R(|s5]7St&1hY)3 r)E2ܞhŞ<ƀf叏|U8*)c=o2ǁN*9 $'޶8.BLs|s]VhTj $L57j1s ݿ) ]S3#V6PÔcg -2ZʺӃU "G?dŮ0刺Ĩp8 ¦Q»$p`EuxJ@Ee'ryK+L#+e = P8 XR!(v!VC0 ڧ̀#Ljj4A]T lvld.=ͣ}lx;뵥69EhJ/2l-Y, H?}{Y=C1,%.gXMB*G^ݷ$BdDbdTWҚ6"مpgL2*nMuu_L멂zC^`'j^ nZ&v&n"ntȷGDs*!nűA@g=ͩ3GI4JHqAETIC!7z}q<6ZgLt3H>3w,MC_dZµYA;צ'UQ>$j)$`=ܓQnvnJ˧VLՋ˨[q,1^oyikj8ew4<(T|>8цtP)}~Lݑg]Ll}I05Ԇ ކapȼ5t>×[CiDG}35?Q},1Y~s+0J_E7t.u(.?<6Z${N?9q@ZDoZ~#$׿2fΏilv"P& 4~Ra8]}ɘ9ohswtSŇ\d.;"ybU`"iʝbCe4D~&ͼM6 y<<"5ʯtkGn<s ?:j/n$(]6sW ɫԣQ,Q>DEYL0ka<ڒJpԞFDZ1HfB#> G3IqL'uH2b#ں4Xg}385C 3ŭ? rcsk"؎[fI8V*}`U»a,,4\iVZ1:;ZӔ/BvBq鞔~DćR;*/ 1^,BW XW۷$+O725Pr<4Zcc\I1/BfEW73y<ֳOCeBb~Obb&JjY02/N o;}>d5}ʓ۪0OȞc~z7- 1C7` )++H)1)oD|/ԗ0sЬ:&[`S]6%+3E{@v Acˋ`F>]^ 1cs׬d03BJ&΍YU'K^$~KR/mI!Q&%qws3~~gye&ygHF{ǫj"~ǚj9vc{`ՠx;sf#e\]eLf?p8y4ũ0ХԔӺ84Ĩ9"[dp$3K߇WƱ{a5H=w#Y-Ww |g. M!?vsY= ^Y\Z'5Ej/^5GnSG/ ЌH?rHYo~2RE]dr8 ع~w>ҷ8 L =8TwBL kJ%@)g6ù d4nS XrOƘIhrraVب ilr 6i gMVAKBL;F*Z35"zn@ &?}YAz,`2&Upݞz&UѣY=gIߖU72 J';6ɺ.gkȣH1r#1Ŭ3LY)g,x =T u K\ SDTKʰ?_U=vTT)kQ5 ̉C2!(udX~S8W`7_QR'}k=g=$Gen'Rȭș2iܝDl˃(aIb*>;(p&q9kMah_y6\sL[&,JΌa4M)gyRN5j{ޓ`:,SFz양t~٘f(8HɊlwgiS\ Ļ*K2iޢ1+` R*ʥ/ͨjLD؇%Nj_#[oqmOT`(*,# ey.qlP3l:lUD]p9 t7ʬB<'F[:hqE- i ퟷv~3Ƥ!!?taQ@kQ| ̾_cKGg?R~'[a1&7$<;TxCD#ňio9nUDډ3Z*yk0;mjƆ.w~ݩ)WfH㐷1( S ph|߀)<3P6jvfE,ۼf*ɣ~5^ Q*h=4EKM$zDȴ!YO*#{|S,mӆ5@O4U Kk:ΝnnS[ڿlY $fA3[K]}dNMjWdt<1|1iA54m6{ Uo#iDqU.dc^#dgXdz:u.8^F# yZAjslU^V$~XYwzTҼ^4$A2k?ZpwQYx!aqsd)E,q?{}!g~2lAwtc+o*NM[qbL g)M>l|,ZP-"R)zd|@z"=KƷI`!TlU~5sqqHڿ #OBC#Bo 'a俥JO_{z=4? >,j  [UvЮô8"fub(¨֢1k3P+\izwYb@I\jB2f3$^uHEw> f&o_,IYA? 5>˗ۤwKX8R` oO$b% {멅:stq픂q[$x4;Y_ N -Dt,&hjjnj삈lAl"T=*Gxq[0e;M-*"o=ˬ.>2ֻ{p!UYePwf[1`P#"=e(0iV0vjp-IW>|Eov N3irl!:fȺpqVG@/LJmi+ YosAl-7EՐ-N +Ӓ7Si:XBԿ[3J4۩r0,?<2߃yYu\a'1byOE$>L8nMǕ(`=v{#itcXb\Q*=Nꆌ3߳`W'z6 ƄE#J^ rE}ѬN;;YH!2[zJQ{o$|%  ϚnynXX@-_˖ kU(*鍽uIF2viiV͸LX<0=0C|׼i38c.SߵBRHXoP#ʞ}BMKH Ou6?,G󉬸,c*Oi.T$-l{=[·#j h<\.vz~ M 0K] ÄU[Sv/κW|:V$AC\ $֒c YAB4 ڲM$5>0ʶBۅv1%~T`p#0N8PR=iyT0쭴af^5B<TcV_cF1I޽T 929MԀIa%cVn r :w,ldxyx nSvP#̄eyB3نb)K_e"4㹢HAIeTrvt9x_A@ڠWQ ߂qbM/?e A4,uN/d'd-e}սm՚wPm`O]9'+58`I%Ļ| iŤ#z7tX4|=g/{{w7tVY:zXD#Я%s"P愉.ZNUt缆?RpCvss?zYiyhxit#?eGnHZ6gcMAN6ԕUxؕFCߊe|FX ~UA nDr^CoUn"̒pTǐ:l=,a㻵1Q4{fzn ƙQcgIX"#?;hrpY5^ei4۬a{֏U'MIEW/OJ#!@+XQnL踇zdXJbզ>"$|t5'{=^_Ne f3O:1Oҏ8g5[χ*χTdG3\5-G_}m,@#3>[c?K. |uU]vp!~cxXh mDͿ J4Q;ki \]Đ삽,w r\/#*sm%ā<ƾhGݑ,R.{I{i$Fd P"K)B{ o* LJu If8ҽsjYў$͏G HDL.{+wAf5-HxPfI,{$r 11JNR&z{ J5B{ź$sq4o/W# cM5%>7Ѫ[:"f8JZ4Asv6 Ε!뛄#vX4mkH.mVwJne%tQ~*OKV a,r\-DV"PSE\;c k)rg׳g]4 kԸɟg2G .p6|snA^?=w[v( (q=6=T}f.}YG;6~,3+Tzbw']*Jh{r  O|Yt軛a<(F[onG,p"5v4mɔ/UWީךqb\L[0G"MXX(dpZ|^7}[k͞sBPUN 4 aME';o9ia灚}&'(4NyD ;:%5'pbtƯ6| GdlqH \ݠSG2pPȒ|ġ6z :`ɤd|xYG89$ f Gq>FKڱs IR9_V׉B_FM%+x9-Z؎|Z *0K!`T;g ✮*DCu j}Bd[[ՃayQ" e[V\$GBI릩p\\ƀ2]mZD KZ捘?Or= 3D-RHil}Wgg#Aw]a|Bk}.F+\E 4m9;Iǵ_"` |.jKIʹC2hq 2ɘ ftJLـڀm{Dshnj> uDArW!i= ޒ#!x'.}Up4@uQMO6 lR=j+L\fODHzK6rO92Pq5M;o0})qGQq'%m:KY( "s[SQJoo.0YZX\6SًvP&%6CAlmrJa2ǠP9B$)\>APm/eclI|A)'!MYoK{cXؿ[og֯{#"r {R4܉!v=j xNcK%a?a?qjZHG br..Vհ 6^ y- !i >|o+8DkQ m`=%wIV>;'/#YLG`ej+\Hb\~DRR$v9YNM2gbPz">oOΥ +qIY`QzRz<\ -$8Ro+h?q7Tl%0xk j8(twc4Wz3`} NranWOdv~C@U1z7J컪Bݥ3.!"!"S? \bCd)vT/`sʀ6 s>"uQv&J7^kmY=m񥡬}=L|Ā;UȆFc-^݃OȚĴv[hnZ] IHK@OͩHf5fe&,uwǴ sg):d;eSʋu:q?IgvH_8v@8^J*^!pOw32,B]d@2g$ ]3P24%` ,Hu]'+xԅ,<솘'˃ YOɧʻ-Gr 6ۑ27i9\t-@史[raXŶ+W> )F)7&$)s=w效"+E%!C}}-GfZ@GB=?Φ7{4-"1YL]"ʭՓ J&VyHV<_,2c/%ԏSNj8͵QNBZۙkk\u<8St|DVN3Q S[Gت^}RF⎈']t`vPAkX?[HQ!00i^TO,;(ř>?dy+Q=ip1T|S/XUQU[,<li#)ٕ U+ڦu@K%0p K`9) y2@P:k У˲R{VU=QUe N};D?1!bu-b*~gԛcH2#jfS\JMnO$xPWW3 xb[~‹c@ĴOޝ!L!d+KQ f&؊ >͐L(e;f1z? OqqC=yf%; g\"_C0TA &*$3 $i03ICnMݎ*C؎ֆGua~S3]xC 5O0ԃF鮮7H]Jb:CJmlhG⋓`x;xR+WlKu:]Nk49] ȄH2=& mdT}OXڊ~E*&n' (B+#|]ӯ~]k?W+]X΀1&BJ)s*]ĮI&p[@ ja _Z~m`lh!"Ο̎ sh]NȸM`{ ]$ϠQ~&vLM|o?YvPx{5PNHeߏ|)b'{B}X|*fwڀs+<zਃ{# " o cujJrKV.8Oln,T*Ra*JL''I:M) ЗÛ/~d_ʋJJN?!dA*S C A?| a2'pN7&g?-ɾrr_*QF~J< ;;eAONv;QD&_z}Zu7[ 1\A ~ŝTV6 z 3v9 nnPm<*L=@u8y}x9vƦ. `ń3wB{?Z4lʃ`:;[Dj:cU{5&׷rcT֜ rE\Puk%U Jq>ڿN.J4ߨFvEfbVn~bfV$Q XvKvoB,2Kn0* AA{sd%6# ZϜ[v2e>$ ?C|Xu @G!Q sT.A}f =?[ ۰͊\6hҌY2ݖ (&Z 9p"c"}]f;`#KeϯdJ(%j^+b󥢩4kr)\~q+Zo#cii8>W!\5LVJ`147{L ]^ZIUa:YcƤK'f?ĩUt,,`qs܏yH :w˩uťx_*_r` FNsJ(=Ao&|*TPj@Dm1]*BUpDE{pc|*P:)aqUg)]T,Bb=cWY.u^ҽY)$HZE0I)dWUƑ v<,ٝQuʙyzU_\'@TJGN='[0>h[*;)?wۂIchz* +n#PYt[A<qQprKXxZW9UeE8 3\FVfH:y8֗VPہ"/=fkBΣmPumc'-\j(AVC. .LvEkdua\G;Xg؊&c!XoxKgzұcmrdK8M m>j+Q b#vBeٟW$Wݿ+th]0?ϛl+ ψ@S{}Oh&>l8e\hwISp,= e* &Kt{cIu`f,ˡFA+ :5P~TUCIZGljqn^P&[P 獒Vt#46KHL^_Z[HG2ыhp3c$n2X겔I\d{Z-C[2P5M\F.Idq:ZL- ҜYޝxؗ2;,*T 玆'3fk8~)/ >OrtJ_Y -ܮSjiOqgmrVlj>Q&OxI/тa/HY]<"TE{ kKAkL0)+&cA.u=d.LNa1Cfx"QՊ߆wt?V~oܖ.[lw\>ḥ# '憦u0=F,o/SH͝ j5f@pէBWˀ{s"@i;Pc<NeMqdϭ{d sB줘EBf Bi9DΌ"EY +j&V{No[1.HJԮXO(1$ԞxHV3u/G }yodٙ9Zz7bB׊lɟAP*6! %X;Kʶ(bq![0ΓY/@(AFYXf9hQY*}&B.;TGȥZ'-% Ajk1U>I8 xˋ˖`C]B__zW(+{l,Fiuo&~E3bt\ 7&2V6aRiu_TTv3jf??^kU\1W<*ں^I7b定"Ū d5lO]k!^%p81I?Vk:boB ܸ/?ihosy*M5q_CHҸ6/?nsKU/|a(%Z+ (ڑ9g[Q|z\հcMfJ8u|7æDmyEc% V_' ? AVJЗsͦwZu" " oRu y+)1fEY?p`_5ʣk8έcP%qx7OGhĝ Jn (eNWؑK]Ѽ!v)t8Q7qeKYIu9#y;>Ǒntm@x]tPj>ip qES!yr5v20I} +DoRF򐁱撓Sᨷ%ehIU-hqf%˽wspߧ*7k2o'Gք15{FW$4҇!ta뮨,x9zLJ{s !]RgNIzQI溲I0r}|)x .Ĉ[rS WD "_ΦrW>]Lz[=eJLw u]˹D!XJ;I:j|#3z2#rMP[ }:_7T]hCYfnOPt}1򎖱2i%R`!50TA.UG>݊9;G A QzpB`s2"v:=OMv*{2C]3K^f Uzwug hL<) ![,@ 4D8ٮsm Ē*(x7tddquku%\Rw>'t ma t@(̉)_9Jsi%H%i9.)AV'aYr䩌dn8"ׂ[ +*ks+O k<`I~`Y럹 C(ūCx֌0|T4t6blwLS28$MS}_\ũJ2\S1 )"ES;cbsU6?h慟A }12E-w9ԃS9 H `d1!fYX$lM jc=#(<ա8@מIcΛDՙghx._4NQl5TQ=>]q]+SWn1ϗhzD  imU4fD88tI-e`ʸzQu9&ix00A8sӟw+atoFfAh rleY R6 D"0@뀣bկ\Gqʼn| b7eh/+T|O,/G;{KB58m$IKl IRN&C?1b S/ Tr\$M˚`ÉJB<ŭ,vqO |ݨYҰ>isWe輪Ɂeo {.S:2!oP.Fj֤@(_Kū0;Lf'̗r"UP πloRRb?s4аuΨuj'QCBF1AXK>mʴO0)X~SCV?VYSV>L+(GVr#ӂ¯iKT4 Bw89Dase7nCq2F"ԃ.aH/. B<.$ M|bZmXhB-%.blXد$5Aԫ+$M2X>iV? fϴzRf6"X  %Hʆr9=p2TmV~s7@v㳮ij zrV[W?5D$k]G\Ϗ#P:@d/_XF~ MP#_8qXf?$@|ô$ߒj(2a@r[UDfmjK;H>Hٖf\D:D~o³;j .݂Ѿ< NwEEw1xZ:PWW5_bz7?x bw\U!=,w*Aǵ+ҏFWfFї_#^\~x.7ntUJjN@x"tTnwpWמ.z\fA/Գ}W B+X| {wHuL#@!p<ء-l;m]i {Nq0|^ˮXm_=,±_lUd+))iC ,J5\f+W(D3fNXb]B'phGi <(`Oȷ+ϚNɭ]NM 0z:rsќ O[BU8Bٲ/04+i7cmxStaOkvVD0m}Ltۤ0*I΍mvյq+Og=([ 4GHA6~g;ѵZc,^_NvZۏ{/ìc}_-C=?=$v7J0?󿌈N5hE/|ݾWbxcA"+?+,7tljAe[{>n,0{a | \_}?4H,A.p!A9g701vW4p)@pE˙݃~m'J=Tw&"*@ xF0!_9 vLDaR'y^*ynsqvˆtk73H1tUc28o]’ΉsM{ #r0YksɨkJk&*:!8{!NNgAPl0dgYZDt WђG1grL>w .}yOpUO_Jͷ,Tn1 t#/)]K%p7U+rR&lȩ&9%WrQsNt7ԐVjr;hG }u~dށO;i[ Sя'P"r2~~A(\P|Pzy07a9 ǶxԔ'{~Bnԏ)%DP&^$CJg@h|<{)7pGGKv;DgGeHrߠf;#0=%>ֈFajC 渣;"Qأi2Ʌ1vEEjnNtE}ega|g- z.2,aAdx986Tl]e 3'ǘ9+/M|ek|cA;=>Q"§yat0g="翊7h4Ɓ5ë?dzTWU$iU vPAv [º7̕>)l\c&A5cO/XÂ:F XS?՟Hv1. Ն)7&5Z`#R"%ȰM.h9R:E OxN)5po,EA'C;1_h.:eEp<]Nii+hOїk'vaF#XαU T)n7s$m \c :!Gf@c,|SZZ7X xߋo=ءEfPq+xtHx;_zRJa(? ܚsح~ =a^{4Ї S+ \ȝ;Gӗs76 2(ڟ ¡1%z@9t?ݨnߡyH6 H]T qlk2y{8?Cp:tp KmI5jWvJaAN@~ݾkۓ; 5m6dಆ/0q 4gٸFg4h ~԰@4?-vj dxIh;:7NY$G}uN {Im? kdk,t׶=Mmq;,9%EIѢ5mWоnr9x.cF+'_'9WʷxkPČZeGX,RK k'v*'ek݅ѥ5}J9D,Eq*0^WP?{ߖmqPX9Ge 3De[-$=g?@esjY61-0\dRy6݂^ll?M{6G5Kl.KasEIu@u|MEM(M甝dLQ83d,*e{I7E$RbSwY~^urHոS= jB'5SZ̕ZʘVƟ"ZQA BoDƺ;e`q㧿w>:Sc71T`owĘSuLFza.[t pSO6rȘuB6]䊞`t 뫤,ڮ6ɴfѵĮUD-6 CZ,db޸MG#LA‘Ĥ T{NX'ӹRL>Îx:4MB1V49cβr*-'&ń܃6ν_>TKWos[Sx?lK^V+ܽSN.8 .[!`zњ+PcٗC'/CaJ)04EZjՆ;9(?jvuLZ168ݰĕHjk2M`zjzeڞiS߯FGu{.1`Ul9)wk\` LZIm8T"𼙃X7ѤKX~4 Տ\x {_V-ݝvڧ( p%#+8=  (RD-آ[yjB2jI80o &_Z}61dlAz'|ˈanˆKׄubFK8E:caAXYQ9PlB5"9יEo@%LF~(K [|$'-OKj9\#e#MPB 8mbiw\>l-nݺW @Js@8ndX. Pf<)8[լ3{Ѕ (|-B;7eocPSlL7:aN\6GGl׷w.uw\;q<1c1] Ehl"["I @>a`lwRBλ%qU70PmJ?z* -wQϘ(*JZ}i%y8HêrmJo+""T&ڠ̉xKtKPL~2?>mDҲhzc/)JS[t &C2r.J0z!5`hF giI{ o6 lPZZKe%h(ii.ء1KTa]Vv8XPs>Pbl +FXq8xa.B Zn?GA ڥzy3W!icuk қk;Gv 9pV/6Il$D= 7M6w6Gr[gk*7v6 Y =tzH/n0`c(  z\rvej'VQ3GقDݖ;+~wT#Y+5Q%v3qXT-IbT%q;Q iPp3a#b"IfS'DyZܭ-B65mQ1KJ|g&ؾNJ]1-+4AGKVW0RH~=CgBAXq0۸;4ߢQuK]7yߌ2PgOYz #\{ ;h䂰KEZK,:-Ɖ>5 *)[]Cҩ:FRsN)XE@-jh*N&V1(Ng .Ih g MkptrwMY+,s+xaM=_P$DCNB@̒^NLk [KTK~AB0ݚւ)0.l AպFK>C Hem 家FX ~ Ke:  ly0Ɩ2`4}ӿ^;2㎪oFSViNuGLTI )4>-e:ՄJqs{WR^ޖ؊+I\MGE(Xv?i[KibA'fIR&*& K@8i]ʿT!¯zM{nφvb-0he5Lj4RnEul鮭`>l!: ` 9<7jf TaL )ƒ1L@] P`ݱ,xfqZM"(`Q j51IՎS?í U[MFyΎڬC8]a ZŪ+S '#4S6KEے]KۓivKV-5tϭMbT"]Dl? ;V~8|T}pbq2?CJ0Ff'F=QEZ|?lY$ }tf@&.s ݋vk>C= ~VL.s=;s#X .q-pz)ᶌg.e)|b,ZLbDbw}^{#?aV]];XwqG}7V::RtѸcR$.Hbz ݝh6ޠb*|y (h*[B1YY$EYe]ci//Ⱥ `qJ_~2$;`UK4pqL4MBTw{$Њ.FU T) Wz[QSq`2^I$4ôFX;ќrr1,kL 5![] Fz-dG,@ s'*-50gC?W R:;)Hb 桬گfJn[bPQW.R5B.vmt LbB~g-R+o|)JYno`I͖% Pւ+W.ȸvi?=IJ;ιX84>ϽiUrI fF !\B/ĵ??K*<tw?#1 ة"NwYe`qǟ BV[Ѕh*8PI 4˃^+\TaI~UXUvzu>gAvW$͕hF0bޓVL,`ăKfفDM]T#]kMd:SU޲'xfZO&`g񐤵9tC>aUxsJ{v1-9=eüLu.&2Y. :hZZRNP_ɘ{[kϡ7B][_'z-jw祌N`@ 2lKaϢV95a~+E<Т- [bncͤt2dU~֑]&L.no Ngj 3]%'ţfƯR\_2Va.!ٴ0mMgSӃ|/:,h/Mz/0@Uy8 SQ4^Q>",XwaT7uF i{"B[zNp8eOUY >jޭ0D1"x+ΎRYXΘVti[ B'/g'kb`չ^^1x^Rv!f+ _W;qx<+`.U9$x gvT'%[:`m#T{(X{QlŶԫ}X+D&':XGZ -W=d$b!*l'~kwys%E#:2KJuQܛ%}jmQț}&v`OmŎK:4}vv?uf՘q₇콓,zZ?E oYTPwsO $#%!E}\ix=YqFͦXyo%eqd;[zZ緔uksYɥ8>sMxyf fjm d yvu0WgݓϞB11֍?I|+E>Q-Գ~n}8/[QS-!@yiw%h L>?F:( inPI@95&z8#ymεI;-{pf>?S8P]՞羿}޿nKwAe`q^Zz˵(D SU]5 z:$dY=D/w+ϡGt?mR*TmcO"UAt_wyh@se"bt;#W[wGȍ+tHkpzQ''pcD$}G+gNmZ3W b0kb>7ize\k20ЅBHΆz` }c^Iy>Z0 l9IYzjҳ"So_h#u-NcdnP50hgb+ 0 Z5- L 4Ntb67;lFCr*_aOD^d^o$\R:kl{Zș]]BbR]Ԙb}u;e4r;lw, 26 vRnxǭil~wK vIWlE.>Ո:B MD2 (x r(9~jBj{VةD-},ԐqkD{B֯8A]D Ki?r72~ oV'9&?ʀ;9<.g€*-E|p`=5=(-0 MGj| v2U |`dL$-'- }D\mUUk51*V Fm7:5A8m& 86GpRD!C>+8@:k2x]A0-=s8eZ7#aM 蛢 Y F-hm. 5i[&61_hpJZv!g.l7kz |oMEotc ͉ZdJ:hPB1鰙FҜϏ Xg OBi@{qg'(  G]/;P2^e-`j0jh-U*LQ`ބ =&v60 4Os eK݁-: !#8 FI-E E$/vM5 eSb $Z: j3Pb"~ѩWZڜJiYVi ߸ab6D)g~J@7CGb f54$ 'b"L](wa}k=55GN`ҀNX=Μϊ Vf– ZH:X8*:>yQ@hkǕ5w[ v5g R{5Vy o18Vv@ے SŸzC+&!giAK׉xn Plje&Gj<%s0)4vHi7,iذNk9s󂃼48fS i`ǚÉCs1lwtXwq; Ͳ+PaKE*5?;hzD`!G9hmmL5׻ Oii -Bj@T"^c&~I~xNtV1,6=`p {CB)6I3{eɶXm0θZ@PY 8xTXoMC΍X;&"K踳4h/R6YP+M2&jܹibk@b6`5`_kWD"aٺ:r[5H3iqCs0SK{ ;.ayǍnk2 b Pw2 O{I*iU MSvYϤ4T8`k29G'ElT?alLw+WbQIƬp6;f pY)90_z3_Q꛽ME4P9r *}Nd|Gl]6X>98c#8,r~k~#[y8ω\`fU隲'5%f:@\UڒW=)v'BZS5͸3 ep mj6ͭ95:=[qV=ҦިqΠlo>@a )n@F"^eӚd[%3N !5ĵɔeԤmNĸyq:6pz [W}V+8W PS ¦_#$SAfi'LCfbފރ>6 B@;-Y;J"D7.DtoP0Ӂ"0UNy CY~bM8CۉjmM<Ѭ.r>ְ>7'[*DP8i0 ρ vɡWd~`s]P*$>Fbds_~37lIP5Pq'u;B|-q/աXX.)Np|Wӝv KQlk[fhs2  qhXI "^OK2ޚc{jbLnd(`d0ӵW-C#FHBuͦzL N afU48,(s]di͊7B,+siM䰎'sbtxڱӛHbQ|ڬHˍ2\$0{,bK,Ol<]ke̍]ǽRD5 ~F3Ĭ9M&@ów5bbOS"C3h=#]fXΥɦ taKg+103@;ֺ8{>DRy9aQhrk{^rA|YUTYjmuЀg! L{CԙAIOV;.uw{W`S&A)0֞uf ؘ3O!𐘟,S I 7}fz0?egZH$'V%gUk'|:ApH ׸"ϐ [`zkQD$'<ӝUS;_Ena.Kjqw]a.!+ȍFLN d8wv8y=L)ߩ'x3!9Z3  'vٙlvi?FKc E8ZYuhR38aj8nd ;_oDUo7۸qXw/^!Lsv`LJX, $ТުI3;D4&D5Yj,Y]Ĭw>m;u`9.ki)uj{:8+u/9-2@#ffzgl::+wU){!!ݟ|ɨAj:uGgHV#}Ձ޾'#_$ʉU5rufp T?z[ Xwq?G>Vx\o1oL)9yAtY]-ī޼Q5`;T_sA|dfchrE?yvMl3&{hxg" d(d'ME ڄbgZtO{yI+/득)%4!i@:~!@xjN2П7I6 qAgV>yDfNE_F<Ȓ8- &`# -1=~''/'~0s/~V P+Xv䩮rZڵwcarX99iOج"W1wq;w[>pݷ0$GCL%QQ1J(`NY:#BƈŅaHo+8|0|fe"=OXx*LPM(_`8 z"R0Tѓ ]*cNb^)>C'_ 8P0bi 'a)pr~slPeNIlo͚9:k 'N@<5V'M85]1p>ɒa8-Nsj.rz}#cxIxd dkpkxg::73:sjp8~Z`/=1X?9_ .gFpżkE3 .O׫uj`q?+pĮ j@Ĉϳ/**A%sf S]%HpJ2G  Ebښ-*l?>"1T)QޚzwAہMlB&AڽgD(=(ފտz5[+6{&]?( k9r@*Mi,g#0LˁRC&˜BuZҼ@o4P6Y}0@ n>lT`%OfN_䰎i]Sc'8{u^JpJ15bFLV3xoH5_xYN}]GY3+֊[sscqLcG{{;d9toW;e`q?xD /N} y;S&ªTH2+pU8O`ER z25i2WljZEF C`7 }f4U8+:Āk]Oz9+Z5=fӜ+S _/HqS¸&V1E) 4ͤ5-)M>JW1Ncg`}ma ꬩf1٧G΍e&^/hgjfx 8h| bҶbh,Ro ـ)1$]@asG=w& d?81/rRy/XxyNy#4 sl2PXFLtbg&soVy7ILZ"j.f@&Be~ץ;.uw|^sY,='!O_A A(Z *` K *:6(m|֘5H2Nf&&'j;>-B4%bwYg]O)+rFURUì>x I>+Crtu[·vr*8pH\,<>XPjs+g=0&:n}vB {!at00E/Yz5Yiw`R =D4'?(^I~p=9z>"&ugST3FE=8Ƃ=,e{dVS}| 68gG«Ί|;ٞv>ֿoBlCf9P}>,}|Y{v ?GKnUP36L/\;.uwx69- #֋63+!^(E |n8t) y]:((YWV3^`C@B\='g-X "NrԢ pXvSHmLG ?H=3"g9, P_oOm@ Ye[q`ǜ2<+/e !WgI+#TsMѷ`HQu, nwc=IFA"e:=<3 Yn:@WΉuFNP*LjCy ;:GN@]ٺH?ǵ#vy2c fb%;or \)ЁNrfUv_Ye9d޷ԉA:&kL SyQ2A$U=wD_M{:T:8ƥ(W;.uw8xVKi[& 9sF3A^:!{A ɬ!m6$T}2;aڏǀph1#-z{I<8w i9g׈Fk I/wIMoUldO41CAڋ0"~.Y!GyBףn"%Q]8?hNL'O| Gg3XX[:!yoA7Bյ .ǃukKRK<ߟ% 7y*ڵ5yrv+ sXIpelx݀a@&6#& {Yx{D ,<@=+ZiqT*'9VBA$jH)Uylg a+eY=jأagU;/Ǚ}=8oJwqO \}wB-a^CqO`$Gg3dKhpZ=/ 1gҰĕ՝`iL`|q}g4I砩N^l ]*dj}S'Inx6 by;FEQш)l!LwX'$Ih|d  –%dؠx<HB}ࠩ#!s0f>Su4/=w /N Ρ eI3j2==iݾq;iF_|F̟1;Ab<ӭ "=e2=~Iy4ͱc,g]?W0Lfl!Ckl`vDMFPg(1@xj;bY- tOgvm%_Nli3;ϧP| `qǟR}ĭ٢%ZFp$*b Lq616;ޥ]ks?%+x9Iz"V~89Ѕ4K{*i <ޙz:5hn rP962WdnnPM[tg; eqЉGhKNN~٦ӂ#T904&xm"y_\9H5M {2a6fQartB =YJt Y^ىΌA`fHH0N݀\@0|n[U0TTt9FK\dI Yf83abk%&8mC>x($r21T9eX*MN3lqs auʼ axUn88,P]իrzȤKw zr3MAc ƥv[ Xw|"PGMwJ&BcLcYL8šg.f .'ad~QQ! :ADQП` &#|s@>H{fK[ nm`L\Ċ|4&x8}K|JMx"̒-{:i`HD >4vܦ.(󐃸Ђ}a3Ώ_[xk$Cx-nֽpFvº\vѪLm ~`h"꠳1uV0:HnvS.ɳ]/M3֓ ;2ƅ"Zf)˘dQ;l$1mCMV$}ȝ5+?ڿ\'NCkh-Ц[=#Yo:I8Xk/"2pJ@ORm` K ):&n֑I贯񤈞ф&?g@}X&̰+]5ۡx6 /,!{ ٧Zzd%FVm5˦NRmƲr:۩;q%[sh-;Rk&/mspck mxpΕ^;ԯ~n6&:o`@rY8lPG4*na==: jՑNԏZs×%S| Rhހ0'U)}Q@IRFc*/g bxCw2V~e bL;w!Ƿ_ S?UOL KR%k(ab#hg${E+WO1QДއ M)#6>)=R+홨o K+5 %p[ftlX: { |*꒥(ء:9TQ͵q%ZZ?Ӧ6P -Ak'HOV jv#$-ܙ Wا:e+u" @J>d)aO qky[{m`POu;e EJ )%sYwD$^0ЭƕoFZMa@h=0ZY6$$-Ŧ!{/m2zD5BfQx7./giq۟SCsoQ_ڊFf+9XcJ׳UqzMG#{4GgQk=6#8"_7( sFn1ݠhK} ![0jUN?\\'%~FZ${o r; 7jI=m\L3nؿVzN~m) `qǿߥZ6 ([]$ &%`RحuDh|ف`(K#k]XuބA/a#S p7R0RZ0>KHkd˺AgK!A4RImؙ9X,2o [#PY T "r.~/v?00ESmͼ8X/l9%ߏƖ͊hj,wm)f>ĺ `qǿߗhӎi]o]1"|YԊ5bX%[Ӽ 'DVYk"S$%SPAE=aU;1-M 0b)ȥ-g%z pr c>/Y30@GDF F[>)ɠ_9(,W:IO ݏ`E @ۇ}F 78aTYeVee[# ;k# FL4+mRf*ߥK()u$~g#Әp(샔{A6pRШ =n&>=hn@p2b^x\K T58t* UCELXH=<`Uqk~!mVDc.rm^m!8 `Z bn 2ŖŬ.ސQe"\8+űȣ,2l' 1*DF矻9]S{:(Tk+<oD{F\YrQꃦ%-;Ku(< bQiZ jtJuSmc]=BEB:aU)J҄Zk3Z)ෘX;.u{f2)*]R~Ҧ5c.mX&-<•Rq[`UF h,^GJT4ݶ$\`x%M)=7F<ϛp_w"î׺PoT:v/|-dҦ1T86mQSpb#-Z{); O-MnaFVam$([yje>BIDs,PZ>KtJL?mW}eТ: -+EOFY,r MI?ml^A^JQTps %Yy[-xH`R*P\]Bt6-e5ÙϞ"2mc+1r9w*1՘),9oLl*TEj᤯r*Y ȩ.猁+Q}S$!< LxS+ pl Ad1,́Sv68\WҵYtW}|U3@NW!{) -6}t%YMoMܩn=147ݚ" :]4 2̄M 1^nS $t#{.EIiۆԵ0C3Ss?rA;Gzw¬]}'fОȶhZh2|)f{(L:!ZVL~WdN}aW^anDkD$1z$)Z&s^˧JwB(z2 $K­` Ǿ.Pf}3@ `,@2TώTbD ^AQޢ1f+oBLWNL$~rM(]4V߶ۧ-HY_{ϗ, [v DϭLKm%e C j>Jm,uޟSN[|O \ (˴-^43v,mBZҾi/DW$sTSϱƢVBж:’͎ m_Ms2>ikҍ_`U\e@&tqCߊ«tM'elYP!:e> ftj[m{-sĚR.8 *Qqhi<D~˹RlŬ`ݲB=˹ ǶXY!r dTζ3߇m헫u]"Wgj˭z|'TU̱O>VCټǃTbFw34qPe !WZ-e2@T5@웷nFEVUɤIcAe0;0a QےnфokZȅINU|D%_%BjWF̨x"&^e@vغ~)OSUvA0Xw0ױ'D^)FV:s´]>Iuú3F&>"hmh :]z=,:sF5dV2}m:UUuni)Zw0֛Rpt[`#zA6u!44vLφ=7C@e"6A0vӠ'TiQ; EZ4[2JcD+yCzCMo=bք~ƧcDșZaꪶ q軂F5h(e୩aLF y2!fML>^Qc&ˆ]9-,UYQ- jM!9Ml.y' t6z'&٠呪ZR;u18;HʗkooG @#5$QcpT0zS,`T*D[jdyýܺwq;O*5Ͳ7iv0'C"̤кnڃv0#xܒQ`j:a6[@M#uc& 5 (Mt).Vޤy@*;[, vPh320dj;߶ՏؽikR4 *m'VWrmn^+b*8b3E<d--d]ijm:o}w}_Bҡ2 ʷ"e@=kŨhCs2Sv-a@s-e)@o]{-R yBMˠ5\ f^~!!`PA鹢8` فH}ե3%1|f- Xbٜ!f[ҺS fk E[ۈh?Z KЍС7$SKG4[|$-q6r`JMM ϸs FwU\k & dd^=M;U,&f>x+N&-[7/ɬ,`D ҏ.kfQ.5{ A|May+~߭V3R2~ؼ[|5}'bxwmQ hH=)S6kHB6 mƒ",Fz` RkcnǼdU$ @cXToq|CTthI% C1vpC+w0߮|5e(!@2J֎7 Į#ސi?nh+> ym*gfcfO٪\(0U8beBJP\殩:-3$;:Md3+H7ŀ)4"}m^nPbtd:`0BfZTC5g2U(Y_: &j85ʕ Wk;|z&L; ;8/֤K.>DɚܓYDijgD1So 7O 9<{yiG V  +bTTc]&YYZZCP^{38Tf`Jn&u64O;]0{ya 0+9NoGBNH\gK95k+ݵ #Y;|p18 ](ؘ MKZ +[g B LSĕ Ysfo<Q ռpbBדR^N:L 4{Xb.dsO0⾥+i.{Q 0TZi?W P w8(ҴPU,F l \Rw,`C!D[0]MuֲiW8rc';}y6w^<Tc(ͮ9DcRslv;/I":yOZH?#ޣ8ۍ8L1(u)Y381bg#N*_3} v;8#RSw}8 lC<>$&H4 rLAOE#D~MM(ghݺ{ds-5-2wxNyHN{R'fH@8M|Nʈ0Ot{w3`Xqfٜ<&Dg?`k۰5rmzq<WFrC^Xb40fD,41l NBP:k\0Ӹ}Hم*JRΕN{@!xm*VhI>9P]ujn'pF7fkrVUQf;ָNAYyk}/ĺ `q?t|Co)yt dmצCsH&XEЀCTuTSb!8KHOGc' `hY43N5*b)gJ@pm8!9!2 %w߁{P3h8宑d2gj Lͽ9J/s>==K ;5X3{}5/p/z-O5Bױ𶗽&t.4~rOi'UK3ѝS'X8,8𙹊q=lemXHdt>a/hWk#D04&`,z{y]}[G |:"ߘ bq4k^xuc obYXckJv&I}tSq圜ELxFl`nTi׀Mܞ1$X%OB5{w cb`e@y !:`Ӏ;#fH睉 /4^{!21vZ K<ϲMx^CHm탚'`t `w~G]x8կ, g%Φ볈e߳ΖG?p_k w\;QՔLIvX\PAȚׁW uW9=`v>dE<:+*罼v'zsbPʮZ{Sz/6c2wo Ӯb8 d_o@DzKO7oi}NN\~Զ]+|=gnNF^/jufN?M7[6 '0r//Xw0?vA MG,N"87wC6&CUurY Ȯ!`43B*TaJp^Rxc0tD4cZ;w5 )R+9^K!dE3k}! jl&+ 9? '+n e}``O|g1&pL1&myis N&jD}gfm-ޮYR7?-}B\(ehA\oxh˞k ^m g|5}Zpަ}!MXTzPprU@"qy0*{|䤧*<~;.uw6e+l"2kuvOϖkJE`E ~-yNaal,{tI[ۈe'@SLM 0m=s1Mjlz#N^!_`%/jXdlh7FC?@ߌI:a>\h 3A #A4ule l93LS -1c$8DY?ఆHrdar 6H MttPh-X);I2`qfҔ`GC?|7s#tkg0\y|Oٯp^g,KZYU͈c``O,c$qLpƛ;pL ߳yitVe}>9Vep`zGkхi6VէnkZ=b-+_s67焖.L M鳞S}<97 3}@X+Wi'Rf5̀&s Zc`'}ccri "seC[1w~'f{{ogߓu*@-5Ņ\O}s(k`vQx w`zJӳ +#2j N{4RiR޻6IЎfS wc)Sc8;H&shbjI0zP)x5\o֟wp %էЅH-dhEHGP_h+4,i2iV0vڏI \ׂ1m (!7=6Pw{E1ß`WHb`,Fy=?&,Ķ_д-|"SRjZgm_j|*Lqۮ&Wv7uvf^҅O- y2 =l3Hu9LtQ䔗k#2CVsj@g?To Gʿ\Cs&܄koBptKl<GɂXw91]0YRqbm TE7'!O ,\J ,zjK=?#c% 67U#1a{l4ke O(m)v.,1i,6Sd_C P=.F7&ܾJf>"]ݶYLB6ꛮ2P_L`tϡ˅t}Qb2\^,p u~e?' Ͼ t8NEbBtK{3Uk ǧhJL `f6)L& /{[=IR&'R,|%{ q)Q>8"3Rf賉4cR2M.*y@t2ڪiCU?UT?X^x|78' 2{)**F i:#7nFC䐻DŽ?΢\.é󴽈؀ 5_C0(XubT,lf ٌ좇ߊu!<|K Z&I .^Y^M;zªvN% {=-֟d (#QxE*Tg&V`?2P{YVʤ4 6Bo)J'0pro@mPw dG |27= ֢=9]sWApB06yD{D ks3\H=SY#߉8x+6jQwH[{oEp*Z ܞszR =k2c'2^ynY3e`yR`>p7'׸29+4d [~%-X{ϟ$%PyeLp3@c#T+3) Y3Ƿ  au;/l^@C\)oѕ-E}rn(CHuo?߫?bzz x A 匆NTF?@O "Mw)n1>5\!d&gݔ11*-ߝLȰ|Pntboܢ f1Ƞ̅dqpKB1SLl071?ԙZ{>2nJi41Cjxh+ ƷYTkB;5a@&{ڌ3 7y*u6)f[~pڠIk P\`v(%=XJ3S2<x@RΦsXe~ȟHTcA10vаvHIrFH6e \؎wjc<2-x،4ViTs5Дt=T.-w@9OݠgѭKڗHʾ%_޹ YxBA;k @̂*C=i`2hǙɆ6C3 odL!(AVS}+p)RX!¶W:l~IO%Phq JpZF% H莮0`f_P= ^qna 4)Š9+rЛ ?`w yt"KH[ABvQI|%EкaI>=۹;OgetФɇ 髿C`Q[/]"$B09DAd?b3<FaQ)ٶw6:`hvmADe읺Yz嗳aNo31TG5RLOmAn0'v\} duB^CRDŊZG=֐$c\g57g P\[~~1lx7%9%5]Xh2K6>#.X9Ȏ<[:E0YJDRRW\RÐrcT|`2Fba\E5lfR~EFwRypHCt ̘ӿWы$ef%Eq3ڳfnQSa҈ `t* ThgCU桔)LљEY̏Hgs{ La5RmJ9gCrhv @$ɞO:E!HׂaUa0 g?o6UԝKPGp.~Ls1hM0 ]}_ۧzzh>\pb^,b"uqWx")}ʀvMfzCaUk+KYgʘ is% spM&x§KX`*@"6ڬQ%HS_b(iTVV7fd9$1t#"|s8Un䑪0Aƻ.=E e]"fNx˞ 'YP/cĘ])*̅FԾ8GCՅEi(XRQww  HB9*KUʊȂjeCQe_A`:`X0ګlZ(mrn1_PD2R<ËLВڌ#~8S+yG.אa/L $I:WY@h2o 9r#O2tL [(GLUoTǛލ1PM#j@[A3l){}π|57KL Fmk젝LM1Z9wx/ޓSi2U'&{198КD`,. ʌ}e78(B84U H[#+l];9x4n I\TKv@"@:W))(=7r uO `)Qf6k/e(C"=X_?l=x.i<' se>sLT IDAT؁kQjTiDM=HLZ>N2$)|QbyC%pk5PRbK1vrꣳM*>_z086X}Hh? Ц3%c@fH cj'2d57 Z7cdg&?WXL ڀ7ưF`gS{ eW]%0N_rjޗ|`cW5O羫M/ =pTšyigW~015-~؞ɠ)gzxg@UITzup[Y}цۼ $s+GoKuk5mq/zJ?dД+v͋w 8iRr.@(:XzY]F?ljGpTsg{acC!4X b+myNXzz?Sj3j. :MIʧjnt&jtFBJr'53cRI%\(Irw@L"\4ҟ~~'}=EpJ|j`(o;@7&Cp9Ԍnk`B\(~q&lbsYH*\FE$[0A xnk sC4 J0#@ѨzPF$¬`6YOiMMTi3 ݜy48A@)KVa-(AָޱYuT$AgG65t& ـ@$ t},YCBT8zau/f@E|RfژLT11vQSicvܗ y?Ɂ]wbR_[LVBópcJai7/?sդ8ϳ=lC^RFmOjx'r=.y!))OoNqu!೬Mx>P>x! 8 |Azz?k Yx2iҍH>Ϊjɹ8G ^A9F R'M) =lJL9ÜrQ_UHx\*4F6{3?[U f\Ңr6V`|a%Fb;K|NyEҋ]HbD9+!eHmҳʘa8[cB BLTbF=- Юu^:?Ia] l/^dYI.iLeBx2}֍ih1Pfp6MV/G{ `{W35D![1욌a_ы4)fn0SjdKZ">YjZwHVJa̽)AtkF<ȻOsڮdƀ&ȆkĐIr2wpFPģ۳EDg=U/k4d4'JﵮdIV‚f?riL :c30 9y{)6&7i_5|Kq nI37n2d1WL_vv76x0TG"a'Ιp<* i{d.MMW~)BWQ| $%~aZjڞfNqwyo)+`Dav٥' l&~PDe0fP;3^jN .; 7yG8zb `{W?L'TԀ3qBq8XQ1^ RSCy1-ѧNM'?RuRF6+6YNNp0?A ӤМ|Ɉ:tiiŏ! %ÒiTpo^M5٩jy BTI݌)Xȩϓ0ް H&2:.o!C%Oڂd*i՚ys$X)T70k(s ś}#䣿 )@n^lO VD6I$j+(2I3֨S1LD4;{s#*Peצ@^]|B֔$2"Z)`2JzySp\޹)LұUW;YC)/Nlb)0&.#>RS9%ʰ,Kv)g1Sæ][kpy= yx0L fAq'kU_{i˦+?Lzz?koP(|ο=F,EК1 IAHW|XZ{Ď;[*Ēv"># D} b$4;6XcB"i`h[s>0ib*bh|g4w4N _ c|Ip5F=Oaxf [8Qڤ"^*8hi#22$=:A⼁Ɠ} +~iՙy>;f&. 2ߎ<ޠßЌDzw_( qse=Dw>j%s)DN_@  K0{cK ۛ] X{_ޔY{k{ۏ"2kv5}&>W}0/& PrS*@s4!}S8F6_}bKC$C J+L鵁֢JirXZs8ZON^ 1|^̖}~Y^O:4I${t t|iPy&fJ:55:עH{;>EbC/!`]Hg,@ENIʷ&EL~5^et=54.ߕH^1T28e7jX 1aI`&N> j7/3kh3ÛI'UxI@\hkШQ*`СQgmm{4l ^M1&h6bE|c앲@HVbfx.ʒZ93L0%'gqH0Et4#'bZ_E>VA&ƍ}0~Bx1w"}5hdK>UDSN̥}70 mx@b3 rqu-u'sb8`T3&$n AS 0k3Td&$ `{]?~6fɏ&.ش(Cyh_3~( JN"fƜO]սk!qO` 2<5ՍmQؔZ¶ӆY;i}_DT.hP_v}io_=" 9@QXTL..Xѐ$Da:ܓd[59 w1q?#'GcS#An@gBA}m|t. n݁ؓf,2 p_敤QE !p{<ݘ5UJo||={d^XjEP@¡~WcNmLsD:7׃_ NE"[ʸkӇ:1=|ei2|[ Ɏ8g8 8k6=HyrZbC;V> CM2D~S.=LC4٨{hj S_ b@ZZ x$=@byHvt,*b4eݼº%tDfp#/ ZFq^F #kO_v:NXR Xmkm#S75MGݾ4h4 7D]lx ?2B\] ܛ$zsIwL%kjDeSޱmR@zl @L}p1Y)? Ufy4r& L!=⯵BV,w^r_BlMg!'`z`\̌˯Cd(:k|`{~>iX51~q&'/ 5ƽtg崧<~mm=er _^O:My> o X#SO* S^ 4S a:=įAzkqH?oR?j>?Q͐PñYsў[kP ɉQ.C//{!d qջgnf8R&H#PT]% rBYDCr*f iDw z.I5㲹l|R˷U04h YzV>oR_ru'7)>7Ӱ. x& hEPjsLX|Naggkh!\$r=V3?*v-mX>aB|>xmW{`]`*2ib2^O  [a`%=z&pp4 ~a̋+ـ_)Kx2랎/x֨-B;% p(VTrڇ)0%5Bw^^?'Z-烓^\2'7K_ecQ+8(?oiwODEKUBm2< {zژ*bf0{s|i;S;JqPI&6 $h`1r^s M:ASm1Zr"B* b^!f*` 17ƶ^dMhO'r*;yI=MOJ6h)=3O|5> Unrzx3ø "p@XJГD! ,^8y?w}w. @a!KTw.cTヨmN.a!Lߏ 36 s?CL;o0޽o:O ᅿk~N&I!lC4x>t*G6ot8x/`Αyi ӆ*51xx*}SY7=zzp/b )oöz[RD4' IA }]+Q{YSsIr e> ;kMNz vTKk!ۀxOôqZy坳dV(3ë?&8tVD5+oTZMx-Ԫ|Z3pYGBqۋQYڴ|H OTLambV8~Sh\Y"s>Mu;$?;ڳ906x7xzio CKC͍֞?Vpx9|> om @.^Ofs24W>WAn{箫/3Oa9G3uZ_QgFI׬ mq8S#Xu:߂.1oh-90W{ ]M3 #Xd@c=L&f2 2>=4J8w3[V cyVd;}:x-1օUwXL繿k^/^O?3 E) @?tX)K D@@Gr %Yqk%*t݉7a\A0O@->+&&A}K Dk04y4L+Y}(DE }>#9uoT ԁ!Xv qHYh|.@>fb59U ba3U_}|^/^^aΈ㶃.T)Bkr -tCӂpa]dJ5[{2MUWVgcO Yr IDATX]5ʨO,@"=-~ch0ۓb $a(Omk45WMA*Gġ9cPuOs;Hpl7ۏ ֓Jh-?>`fph~u@[Y&557zAïw0l9F=&PIF}Cr⹧fawH2Ş hCٸ b|;o v&>j7ی,ߎQrMs؇c?Y*F|{}2ݩZ^:S>cLm@+=P^0ݳlļ9J# P晐_ś5v&@j{1_>zkuę^X^pMmWڧx`&RT;ehpU\'G+ Cb+?Fp$'$%YbcUd5?G"Y- gv2I.2O_kQZv5zx4lO'zݾ87lAh{H4+ 2ù~t9z3z05&&g5ȼC47%#$JИMlG4~@! ][a⋻7V$!o7ūBg/0օ5ɱ!X7h'$>g7PWU>LkGXel{fg\l:TuśP'0Vd1:0x· |耴~Zmسu7qg7 aXx?CJC O!jYA3Fyu@U[k5֊!ZuA\5Zb #btT9#aegsVo^/^^Y)N)ŋqsa _*LO 黚lX\Ʃho<zdNj0vr03WlB&E9Ghkc>8K_7 iB`5qؼv 88w<F| .o?ƑA^KOe9۞>Oњ{gypp>DJ4 i y(~7MD+Uf$HIJ7>\5+ӟOG$J=c2^{̔77apRXSK>ED*Mbo߽@jd7cj,e2mkwXC{2]8N \}p~#ԩ}ǠYՁݨ?L9#?&F(BW# 5t>a#$+nptd`~ &cWNZ}DhaO π+&. 1"i k^/^^V9B4"{<,#`؋8!Idޖ0s)f.v[Bߠy AY?aDxIGpSd>+9B@Hl4~߻iQKajggjtsj3\~|\?n=G$ 'Fev`ifʸ9l ܚ&Ɨ0nv1AӔ:I0L:՗)\o)R ĮsEWHF!DZ#|J[ 9yL/O1 `߅CJuJL`՜u61FLS3҄$#uMSÎ.V v&{up: @;!MvfPZwωBl}^@͕19JzG^2q|~j~{޽tꌄ;J rX|>'Nt V`Q``W$I.}΅<~?' VP3V f>ϹajfVu #aGOr^1G0k+h@1CC!auahbiCFڦw Ĩ (Y%,"YΔl~r"ΐvhnuqkD *ZٞBf BV+ vB[.y/ 7\R;ʀƪ8x>羉yxʕ0nQ' q60R`qMLV /]+Z ]2X^s#~+ͼ,g`tw,Rdu$ϸ|m !-`3m /&G@cB(ӍVYxՠtT8))mߟR(hZ at 5B|72ka m^jme+^ 6 !?I}.jȤF$-eޒ#\aL??SHG-\}:)g0xڷW,nu/ҙ6(e$"j KÂ! d s dCz׈o 7<}](H '}H«E$ќyӐ]6gVDzQ!@'4p1;"CU&1x1zX^`gP k{Q5CvL>W3qK~6bp:6ee>vB #*IB rH "lY irO-")gIԟBFB+ y>SUpi:ߡSAD@?K$S%2֛{|=!8 a|X*|?NrU`s5;YlHO̞4|.6#-] qsi3. .Z7Ɓ.u5<"7U۫ȗfaiGadoq=U1l:M־'"a0h6PO*(4NяVi}~]?>K= -&BTiID7e! Md?(lAgS>ຆB,CVdz2N~q1@4E,0LޱrQ&.2"Ew=j Ş =-("XX'nVF,R/^/^B&dnjr3d.BlPn [A7C+f ϩFw'U`dwfGP>C:MCB Ifm#zR}C$Mxa4O I.@׌6ck+io|OCdK`dzn}$_ɧ & |c/PeED?+bfگz9$@xfp! ``l6qOԩ>Kv/ZK"vΨqђ )kV>"H[wlFT~ p{iRB5VwdIR&Y2~u8<qؓ>kk}4GVOZ,v2Ps3NԘ:ڟqp0@ 냯L8R qֱUhYj*hߎd%O }@4FTX1\gܘuS k,?;w6svvEk-#BvwMFJ匶̅wx- `(@!k *봤9RH'B<=,$C)&*Xo`jېĺOl'>K[l8Η^/^O2uCM`&}QVCQɵA L=e Y^f>T)x`kKWMr@(kߞCԹDb t{&' tЬpwjc#_L}&K뒞{"˼Wd|\&u X$3VH67FLd/S2 %StLz c8Bmq6%4+'@l3%ް+% yTeGV- 0k"i'46pLL+XK 3q5z2Y1~to:IQ{>YVdoUsrӳܧG7|):އ@9CSup5pq2VIϷ *u1yvCMxtDV f98!0t5r&W*n6Q0xIL-āh~*{:X._Ĩ!9؆+Veު n3+jY8%S2xBKHVoxmkEt v3D9EPZurgҳ8y( 0 [{2d{ T9;i&0_+CgKLRoepl,tsѨ"a";(/is?XX^ bdq6[FɼĴN 2 =δr@t ;aZn*8DkH]ƹxdj 02cNV&Xᑅl}x }f89@lV'Spm )Y/:Byh14ItoUFT15 &:^`!v+ @7D#, gÜ|>Un1Cl@{/H]H![[{|5 )E^gm xF,g?BQʠL #b"y= =P8|C-eep : E9W@N6T.C;(}=묄 tm <$HС{:%1p>3Op huFQgyJtiY 1`"u i,5/_TmHHJLyzV$l0(s*hv.ufp9l KC3S6tM%k,I Q&I|8π!=In1teTS535[ere$u *2d)γ<)TTA#5sdlܖDg Yٔ@7@fBėTX/PȺ1`8ZZX9ޠؘxc5 IDATdSR,d=t2Ò}%yFP9 he *9t瓲u^s-+e,]X=8StgV0u։&4v8V|vsΦO0~HNszgߓ耍W`DgIZ<À )lZXBY4i`Tf#w`L۰<11o#ll@nP`RRkivzSmH^PQ'Ք* L-o%h --g aQ 4¨!eniahjX aS/VۗT.V.S a[" g͂Bb"1J0hk`J"r(Y0B 9OliY+HW{~[j0\`j%u)?x'$=ܻ.卩$&ak8m  E-a+V:TAnNtLO"]1_z֚gyq49qZYkhv}XՆL.fFa=fEfCg`h,)'K0[SQ)gE$ 2+gCg uWg I5n(GxNQf s-6v,{4XgDA6J%~{ WОj`@Mit6UcA2O;3/^/^ǟ~qK*$LS n]VeD?ixqN Rb)>Y0D:Et]dKÛJh(5[:h7^F^?Li߇&2%Y/Y'W+*Tyb趎yFeHSZm_]];&XH-:\槨Y"UWaV3* iRW>;"9'Nʟ (nsv[H&[{]3ˀUyGh yDCCLH+f%biV~\ށĴ""OLRpbv9 =r-$/d^XYvؒЅ`90i)YQ0¼,rF2B,6f Z?'~ӤS0T'с7i5ץIyHlaw"i lϩ{|`;cw>0Ywg sPM[g%Isʨ*(-m ki5FU2O2=b&3x ɼ9X)ƥOiyP(#~_b0+ΰp=}KiBXi)S]`?ѧ64a,tA0.kޒ0֓f1u|wd 8,YpI9%%cjXYjcU4Pi4Mri} Ř+_B).k}˵6LtiK]w X߇qU5` bϔ1c=y~v7N6A R&fr~ ;KQ}TꙄ`7b@8p _$ (YzB0⸎5 8iV Ͽfʭs-gUMkx\fa|m bTHPw=A6ba"p$؎Sra5II=KSs|"d=xK-S =bYdMxǠ `o᏿bb:M>X& 4T)3/K҆5qiZAIWcR ݸ12Pm&@ܳX*eJH,p)`azS8{jФo l _Oe{BQnGz(rM3NpJxüW1%~'Xaʎf}iZ9߃y 9dr%|#AF_kV~{Xc5+5h[#lw??i4u5?pmoFg,os[7xVb< Jݝ/@ACg9er tSdi pZ8.85Ho̕#0pLj^W8HV`es&k}i5:881^?~ֽ։ Lu0?}Dۀĭ)PfVa#W=اX>],l`mgicJC 6+^>-XY'q8þ2Xؓlweb `o_D|Vo<|MM* LG(E `j4^.W5&Ca~D/juSz9t95;54`Lj&N0@c5Lpyx7dP Q 3?-rp hj"\WOEK r0,) fL{4!fwc\; T祑nܼxl| 6D4\'fT/ԼD\p=S)k\`scr+M]ԧ]Ր$3GOĄd}!iR  @\Cf/ yec 0fd=$czb>^ F Ӳ|@HA p`蓆*q2x+гdX5'EY`g{Uʫר2xs=w1úP^; WkTtarWk rkcT̻i9cjiCba e_4Ϧ?); eb `oⲉKTǓ/5vGUpӆEƖOĔa0k[RCJčpWqpe]|ghXK2C*R*aXeRQQ`k4o+`LEC$zQN~֥lBbn෾NY;UP " ϻ)F{a6:`/Bup`b-nj@H!kXGM=ub| T6`̐sxg]e <6\WgJtgDx8$;~}-Jf<p>8< ݒ ؙCj1Vdw. {} olA?1l`xu6Epv?K&b(U#_Fm 'HY?@RFY~յVBCg_yWFU=)[6^LO5P^ a;BWX[~/D6U5%cHi^^R!BKC}B^-Y.HRX̯~gI(+4"jXžphdT5FQ}\K[lD#[U^$(4SZo\yVn ,Ÿ;> =G >iVT3M),#3y@5Z- Y0,ȠK}4K}av,@mx908矆4{'Y$Tf(أFMNLc13[tNlnV0jt}!tDkZTrBEb_и =ل I7jcM( 80W{m'u_4KSmS롙 /}2kzg&CAS6ROcͨuלFV[㜹zP{ʂЀȴë]Qw_WnqT b&=inaCeh >h_X}g~XXs+HL9҄*0nքFJn= 7ܴtS(PZ0S" QR}~zJȄNz.c=ۈއPx~BC㢼O j@)™3@KFãKs \ɧ7:8 6&dׅጞ\5HE#1. k_1q>v0y q.S/bɈK[!5 W͐*{-ų#$N `g;65ͽDFݽhhM536ȂXRF1fwdz4i[LL("EvJBos%lT" HS+X>Dt; }5lba6f(u'N]8.xSMe/J͓4">֬5mЖ.i,dᥲr2c#EVޘFFs䁮1};0{u蛾>γa \2,E oakJ~:cr=gR 6v7& `ן*7>k5ƌX v5*(-*35ƒ~tdRPy z621n CXB(ӣt}s)͕v1BTSc#5i.uc9蘅LF29CTAVS^?ƇdI7T0¶~!mr[98v,T %7{<`:9ob |4ai}ft_ ˍ$n%?L Kx3ُC8/{iO>aɱ؎F>0EPQJ=BpPqky~%׆+չ|H^}1m$kf&Ć8;3x4Ts2L~ݿ/}k'Ny3(F<~ 9lsKwLTQ)a2c7Rx&ir,  MijE)6$lŦ0M'j ےM)H/9~) U;?0`MCyfM,+C|GR`\A]$[-q )I-!KװM&_e)л aJkPLY뭼 wN!0vVP;t0uFXL/3~TFؐ&"dԷiG?M&]C>JmfK/w" JϘ‰9c"?SY| (%mK$82DZQ Bga|VTt31Fch^ @B!&j"df>V3 s*k mLs,J|CuE2<(oOl >oqu ̶&8+tS[N9EpiRNty/j}}_فIҵva`@g&ʫ*Lз[2NĔOVDNKqǥ@?@#m^6f{2Q0^Sh.bM6IIh {Z慦Ez|TML@E,ޥ!=EFFm>9U IDATxBhvLӍ醆DRDK(|w]sgЛ2}mvZ $ AŨ3xaeÍ{JG[}&DII]4HwrkZhӠEvjg6 ]Ԧhn`3[s E6aO`_o"0RU{u3$ jdV=|42p0ag5_Szp!S}YR%s`Tď{Έ~Ĕ27'cOtuʕ; sOU*A;zQ`m!`s'&\dO,kwD-a^ϭu.TajhEbCƀ_%Lkad6C9EBE lKk⋄r,:3!YBHIhk3zX@<Z$M51¯g =Z:- HTzHivj*VMi@a{yuoVhm*|rڿ|Sفe66\56vZ@ ާ?S]7+bx;}'@5/Nϟ+1-e%X:3~ >b8_`ЪP/@`w_dMY\ƨѕ`MW{Rb? Z$@x {0HjVYaˆ^<1Q܂Zjiϝέp3eŐnkzdC!G``FXڪb3 ԓY'lhE=3eT|5 $Zgap8A:I3 pfxרכbod᱾?/^e6=ؘYn  e]ѤP7;LLVx &"lCL8?y`q.aZ}Ӄ7,`i mzRx2H4.x)fD $ 8ω~Z(4G˷y X Er%mw4a[:|o(1bK~Ѵ vd[خk8~^P>\~\L`lx>_|\ ?Uo$p]D6 s:zy>8txqs9:p?G!鞁P$>P5H_#0R̡eaXW})\lxI4]k>$-I|ǽв!_6(l? [׃74i c9izL"pba}fpPl{ᥡd҃ߊ^/>\u -~Llg)CsT7{m^zV/' :ŇMsߥN_pf8jI艔PLp~q_u:I4Ӛޞr7@|m+\X7Þqg^|zζMyf'Ou cyo^zdz#k=?h-5 >oXuܾpM *d `}_E_\}6 T`哄iv@'h▽kEۡ[Sao@Yp0Qր|ɏ7t/@t+_Ij&6rdboM[ qU%o&|5I5-M ^g!!1 Q=>AIe ϚOS ޼-#f]Jzl@b0>k~d{od񡹯7;f>Xey'_mߚjՍeć ۀsAVJ2t;3V{oK}ٶd[/-Yu]j| XКrg{?×ÜwIqk0blTa|( kǟс豰C`R:W;4W^H4sm ȋ7 LTZxr VbtȠ߯ɍmDT~ b]kWn} hzaiKoDփJڟ7u`?:lsIř$p>3 {[aM 0si0|!D$7au?Iea}__/^I'HBҠ5%X@QF?XeBnMXF]_ h8'v J܆; &wS/)rchb:AC^0"g@s0>:oᡝQ5÷9d͋y^\Ͼ/ ڦX a'09V߀KTgg`@hU|e"LE*d@I$&nXIJ&VD;3N;.bl;(1pY4Kұ < c=l54Vy9xp"&-lqw-柒O'qq6__|X~4a.^R,qƦuN/>wKeKo@`{&gLۘ6p>:lP){ft X6ۚΧɈ1bsro^j3.j%r787u_n ^7%;LZm__X_= g1ߏ P#ĕ5ە+5$eѾ1Cf0rHugPIؙaj$ mi\ӌE dp.}Ej\ءrװP~XKP RH%}a_.1X"]>Z۞6W I[74}ށ0؊!s?57iS2kz0@EsvB,rvpij&2z}cic.W)D ix/:Vp2\pN/O\zQ=72#85nբZ2|qMɶ㚂ܬۍjK,L}5ja\q+A/51}wk[9<)ѬQRb;,֩;s;s_/}?^o\pRsKTSya僾T4#wdAeB)x!7L,j6@-vc_msH4pבtdڹ &շs#E;V N 5HK4sp_bv #`C[g>37a4P"xдo gI^{+6CQmr&zxvXF߲I50`1Y{9㙭"M4r K{3:1s5Ɠ st煁RH쟟`4ѐ, {g?<[F=7ƕ1Vy&P:Acw dDq:: qgq=Pu){^0{8#C9G/21E&c8u`HS}}<2_O0yv{sO@f¢YY/r2\d9jeV3fX79$L,bߖx,^E$VdGV˭#WU&Z깭  X(C 6:M"EOY4@c0ʩI7%g|'Y@?/Z?[ EI*u}55WzC &K}G*-`0:;='`87nyr4zw]w˗]|ֹYjƽ7cy~4fNt܇h|@Frzx NWcuֵ݁yEχh00@8WD}&pDg}:CLcoh0W@PB#UK(Ⱦs IƆd0ߐ׈1ptp6@D(%fd[rو8ZRp^yO&*<}^Wfܖ#b7DVoߚWylVSHpYk9`Hf&}eT'9,*_գfv`G! ӷ01-v$ecZYX=S;n݇ce\ \NPs }YoMPЉ$9@^A4) & {RaҊN 1vf&lhc&0g 0C9g d[|Ak3i) 6{Y. ص)7a{ -}&\S>= S-E1bk;.gnMUPo4 3 5 " Yػf? `tbkD9|vs<7{j{(3 K[V8{ ? k fuL }xcؙŚܒ\ M L ۓoGi-҂ɃPo6 N9<\Ht=oI=eXr؛lf$b'k_x|&Ī,Q>X=k}}xzo, Ш͓ eFA-ќB. }J=S*R!HXT-'E7)>SaJޠdcp4[!mlӀy+miXm "QLAG01UƁ;0XrB^aBUn9׼ϹWcEIfKÄ֨ն\^:2[S66[>\ppFml. =9"Ag C.{L$CGWĀ1/3v,~Š5cS?5We|r? ơ!1veړ>G䯙̔eVrִOF<b܏#ͯZ}ﳚex1Z믄ʚ Ȑ=T%X>lð 3M5P us;_lڬ[kX.ܭ)?/2ݮ&c~0qaWL!Qn12߀vׁ깣8}O[szu¥]5(H5|5Hw@#0t- h%{޷l acv)W 2aMBƮQ~z&bz a5XBzI޺)p%dq c*/1=uQ#BЊ,ig30̍Mz9-y 5 XHsQ@Sւgq D$ 3U<ә X}K\.SEjy/‘xVN Zvt 63p] Y_v԰˙K?[q*/@W5K,=2-XP҆ʽf eL6`ߍx*=קke)f0kҸQ}L`6 SJά's`E|b0guߨ1</~caU o!k{m@GپvMt:VkzH/}~03Pc"q^gjxX%CNkCc{JzLlP1+C b}F&WfeL΄sbhL\,Ȧyҋ$ey}=T4ݧ2,Jvu][TJM6= xOH&`3sa͡E+;`GcCcL"{#x&Q6 ?.afmU>F1 Jә)i0ƺ@{Vڐ*&t0`FT q@ƗC9>^װ 3n`g@fDй SP4 _S35ųp芡?82ǐ#! cZ`f ? .WA^/)7 SqS(]BWO^ emڮz`sύPzM4lu *$Z-TyFꄸ<-ofFPӣ)$`w{CV`?`+u>]^C5nGKV@rvOSxzrb"mJ:pSXu% YZQt 0vШ&]z s-r<ͧM9ND‡nd1-ܽOʹxL?zq^SJܼɑhI ٧j3 o0z-Nl߽>I^#ZHO+@02yLҀVDk{W[.@ x*E,LM){UW!f3L#Fv7 IA(S ϓJ&vX( )սHJ}1~8x]]O 9vi):?o91G'c'/1Mo\&0X7}U:4e|-L r =1y_ Ӡr_'9d@d0DW̩U$rZXг%??D$d\wMq۰y=2lI)Q} aH9q ]д+ ZXj% _u b| EѨF4炉pٯ N?ϘDfb0?twp+FAL|{\\Kj9o9K1SF5 hQrq3uE}K`%F{@_,n14>[^Iҟ yr4S<̔QFMH{*DUsɸ Zك&&a}ΞW[[/~,8Zh㋶҂GEmg]92&jS[rBtXTçH#q(޺Է3'ffp775a M|xI+3|ԲmHӐ *"!jF4gmm3$^G1RZL}}׿"=Td5aNt1,YP[4H{)_H~DJp%&)u \[ Jk摲O4>>cQ hDf)I !!b^ʔ0N'aRk+E0;dQEMAevcUiC2E8 LVvq~AjfeSOK2&9<Z TgjljGe7H³1gkw<HϻԢ{>Fɭ#].V?/}t[\ jUm>FCde NQAj"DKӕ7hl߼tL&bK}siXٴlHlggbR.=g<){ (mje'ɆlCHCg((.P(Ͼ `}__w tj!۞/i9U6R\;Z}Ee: 0;~N֟+5:K9Ц^ᣃ@EX0ʀNk$ bN᧚pCa)io [dv $2 eiRN8fH.vŤ xit(" `J$̷W2U` ,!ؓp:! |T*"c?nc2XZijˊ1?6`!QLV &L8\aI"B]J [ 66}ϐ6:I2#H>2UՂ:ȵEs{~G &Rbs &T.>x$(+Vq%zVm$n!@:R9I@!n]Ww]_2I {,BhIl㟻`ʖos[=Q E02ۢY=J#MJQoK%1^9If,= T t5ֈ܍!=|&6@ML/DzR}o ģ!9ωJhF?n˻(Rl6h(d#Qp9LT0&RRb2~!0z[c3r\8dRf1&ea=8h Xްi a9B f$@.LVM}#5Ou4w4N{οA=Q3ݻ-!1gh6/}2̸d!#=h$ /իy"A稜U2 Ztg zj2+I_ Q6[;obA01.>rY`aHDV_`m߄,U)}j) tpEѡgX/}uePbvCXO(JA==j.Zw LF9cG X)aE0ƶS&IW[,c8#XZD4ZAeĈq~P)`?<`r4 X$ρű7;!h Y2phQXHW],78. ŭ}ݽBsOx34Q֚f\EJЮo OT a \ 9Đ'B=g4Z`+'4Jfa66kz;EH"zNA,'UT~g0=M7 z7s=pi8C. $g@e6XS\_o nxt8H);<ݫ,p'x2 $Mq s)J^ ͿS3S'|  ͓Y⁦<$.mGmuqP£|V -%I<5RiDRkt>LreY2TWU. e!c ۓR-PSv˄,L)X8s{($0V`z*=TS¨BmC*d& 83DPh ; B+g !~򷯔X+xn#.+ j$x/Mv  $J _CJ==դN:@kw6 457Iޣ,OH~xʸT;^Dy4ׂ΁ `@R5RB*<BsԒu.s6@j蕴EHI-]E6nd.gfCm)b`)zT :{PF&#".@+-DUj4lNaxdczj!D-܂RS~ 6lH2QFlOfx֗Hwgߧ'q/R2F{}C eZM<=ߌpAǻFOFԓƈl4p:QSh(cMAT4PAs4n6tWxj%)d`ƂT+ fqs4;҈.PAik- m^j)G.,!|@#-Jj מdh%rs0{Fg8 WK/ @ se0c A %G'3n2+Z9aQ4l1'PuZh/ڴlF␕!%yN`s+k/DRіfm\C<-;\`F|rL1gD&HHb"vXj ';}k%@ $,Ȇ񮌑A *Z p*EzRHD1H`_!;6D_9Ll=AWgV$Å.3I^ znKNHg,DlUN)f:g2MJAwfK7B|}ќ i2p>P86aE5>)\`"`ꌦ0p 3fM4Mf{ࠪ=f'EMJt_Їe}a]R=&QY~NO=g&PW]e,M ׄ;ڸ =$XGXeq9,IZwFM}&Wcúe?1^V=΄}\"֠i{z0\*V|{F- 8P.eetd`RLQֹ޷r!伃tLXfb~G6M5Z2)S/& {q{ʭ"&8_P9g[urrSk*9Rc>NVnGj $@ I,amYx/E N=21%,V[£_b1U"4U&2|aPPJ˥LA1= BOjW i|O Tځha"ҷ#uW΀'oMC20Gq5 A(2dsG.l|EVdZEIb/?G _'HB,D)NJ(=_Ц TUH`aԣJB.(`QWuß=@ hKY%o0Fv: M?jaL=4 >bTO'ɷ;@bs+eD+tY'8\'`@l7 U{-aI6ox]I- z*s͗HlgvE$7> IDATDy%nA+I%; /%w1<kj0qjJ_< h)U"*V>TAp x#SqJڮy] D6O' lb0,0v@뺛_Qk<.B[*?ÊδLOEh^3!YɄ&FZ^ur4{;W^qa$Vv(2)30R `}_}`/ lTis,a |kPf m4B.7CG7r& (EFި_SJǾ3yrmsmeL}[PPJ 3s^)hCdĸ뚝(JBA[̔شRM2[<gF x~s4 zN=2B }zW>cZkWG5`r|ggwI a%}Cƶ~h oH/AA3P9ߤ5؈ƈ! WD`*"\LO50й{BKW!א^8'P)<ϫ0 t64vvZUEn>4=A 4J$vuyp-+ԾGBYBigq~ [#)!HWtA az*ѓʡj붰j!96/L0Aƭ8ζ.o>cak-z c<) ÌFo0Y ,aԑ\/$,:j:A)Ul CR_2RoA _VR 04?/rS[VOnUT)"ftI 4JԦ]bhݯk 4 5z~KXq-:Ne{8xMax-dTzԕ )3 dĶ͛~;~ɉy9Ba)~!' ﶆ%C4n`=`?f,x80V>րĤSRLuIʔM'Ʒ@ֱ2kriƣd!]!;]M I@td0A5.OcQ`8EyA:|E8B0_+A;))&}|yH5,kREG1]t LTqa0& }0(бX*toMl.[AyMոՒ*B}R̨jBUaN>8 kme?cy$R 8 \ 響Q$// +-/黃$C$ʱsRҚθUi{B># PiPῪql}.O$(:R28 D[1=uX_4:Xg "0Y͸Mu >zgY2vn hVw`V6Roi }ݨlK805L' b}鋭P eSag ʃ)1ڄ8iqĪ󲍳tc`z"uXi%޸I{&C={1y2$̽se(CTfTU5%, h8 V6K):1*(?mѪ N;: -Šzp7hHpXwfIdaM18kÊ>Rt)>ʈG$peYB!б7 PakCXPӜյj5DcG?:/Y}R m3RQlAbնn7)6'Hpe*oqMCbcY )yLY`ݩPp$Ԝ/iOU {2{e*`9~x_{m8p@V!eq(DC7tn1?on?Ł&Y"CʎxZBXamV-;_M " XG;X5"cޏ`!ojE,i;i=ҜtyB̈>ށ z i/%gx?oRd_e2QamLyjL9@ӌ{ |_l1)P̹ac#m^mԒɩ75E zc(3=n |~wG_59>'qyjdm=cm{`Ldm(IT ?s}~3cϣ'f=6o~=PVEvQ/ ooVjL0^М/;FX0^١q+u tv>6ϥLRmو f}/uL5 -#[;5LO>]+x䌸md* &+X߯Yh=n8,úHqCZA#!R{ MXܚݧދ3`뜯@ܰ h4C۸[acb89`(޸]{TuJog~6}{ *@,vbg(+?8ӵFg0+AvaKY~tNYpq`<\Zƞ/TdaPWOifu ô{V(c-5W.@cum` O?6C;@+AQggx]IޜL5= 0CANeqPO|rr}tX 2y9gou۶JYUX_dA wklv뵡+t2⭸|;'ؠSPp:??ʸsb;MFm: 9DsF^FY0[!=/~^%iYm/oM Kc,5o&~/P3 _rc`M_%ql[iLl8SfFO gk}oW_kpymϯ!-/GkgsʧxG`@*G-Jxmw-G2ҳY:X302~|>;=V 45Pcr:V`݇_HzqS[Vmsh RקF/60߇ ? ,U9 dݿomv>~ w%>oo+/5*VPU b}׿X6)|8p7)ЛXt6[%EQW`*\_Oe\KC{lPblG;qiksހN~bu[}:IdF^ l}k,Rm ½^St<~eVxg ?`5h[j}._Kc]O!QP74S|y؟ى̬zL`F9-/'Ӿi4>\G0ʽ/~q__O~?&K3^߬i//ǵgjxc>;`6CU8pTz1SӺL{}oroʍ `}_v 7tn27ib|B1n01zZzɌ${=v\]n[r?b0z6.E?PȤzm;:J?_Ѱv[/jX||_It, ~1WU8Wlx%-PkBnWU1127X>|jl  n ,Uk`L,(4= d'F)t9c x_y ?@w|^rK^x{tL^{s|7c:}X`g»; ~`gy\f(V}}"34켖 (c?Im?osjׇ̎%\&}c?o>NBُ~X_i:HC$~`8lȂnuЋ \~Y=K4: sA51gqr :`bHd+u`k(lܺ>iTO5Jj2((R^tAxOX\U>m}9^6ğ(-ZZDN,f2ynN)b/?'X&Üt~{ry ^mћZAl779C8ƒaCpoކ.y /`yȿ@O;x1m_wTs ="v~A1I!~g?~#5} ^6iL.p}?{Ʀ|xh3J#xq??ڹ_xh/ $&P2=C"5dls o,&IT jrWC4|+^RuZ붥sz{"{lxXދZ5ɑ3LJ ^}zG Wf '&iE{ s J>Ai%v(Wm kF/C'(C:׃b`pA7N҂v,3m4\sJ~NhzbW\dqг5no>O:l^ N3q1QOg }|wkYP?׋][lq*MhxsD}]7چkRW~٘Rpا8[]oy86pt m0HOA]-[?&2d 3g5ɧ=2B"gP+F={/yQH-z->*^ <[X;5Jߐ.I`y5 X׿_nm,z\`)h0-)3H`rnl3' &G`q>S. {)z6z9N^jI h6r] D+cf̊'6(8%z 0#DBd6q7X @#5}ǩ h1!m))F,Mhq$0]-P}/Ex&K܇#i|[4 7L)*R rJCsh6^ ]53:o ƞk.}ΩvT&_[V>|-~0m2΢k羣d 19m/b|QvV:1(ij}]+rѳR2a-rk* w ,vڳܻ@DmktR{HD ?Kd\ZlHF֤ tՏ782=ƒ3Ido_8G4Wf[ջ&5v .Knއ `}_?xVq8lNax2 ᯻BԊUqeaulPN"Z+F6LwZ3C㡪: oR|g7v>/{&SV5O"^`bc':teg `LQE\v ?:̆q!)301dF,'r ~NL-»oӴ-@*hs׃QRP@n@? ߘ]&a{gOd+%h? g/+g+I&9ُlig'┇~1L(Q~{Z߰[3k3`òfq'Cq`g*rL%,qvY3 yAc5)?h҂C1E3~?\<& X9\ ,!^S b}AX1/zMx QXL$&70 N5Nrtco2U)TdqдI"&o\JӣEoLr/~\qzTQ!.8!{Xlc(^/845J~HN+6F/88Rͨ1B{y4Uk--022< e-LuJFhad_s`=P%({Z{D?G^Q߂\| ^iI2@#?(0WʺԽt ()5U:8gt--%Mb8H?fώ}gD' ,és˚r=J2@W.Lᯡ+C\/z LWR桠h:ks,fdPndQi3]+fC,y \䯥a<ժtƝ٩(S[d5E&PMSNaF{onS\ah@隔MH4A,!HcҔw`Mδכ1 ! wCgd?cXy! X2i +>kXeE31&DhCq t0@tp˙ތ>X]z!l!sg ]Ss]4Pdֲ2DXq(ߘl0@c{yzx r6tz`p1 /Cf&w^I[ëȆ3vtp_Y{Ĩ}儬S‡TѼS̝G&CG{!ݻȥ pu{pC@c^ tp/P {>ܨ ٕ˜ V;a .8lvy|^i%WO5 >cǿCszlP芊tZ_i(mƠj)zygby%cl`wgE^;ew-⍫C3ڪ|/Uݨ4FS2k]}u '! `R1} >Z^]XT?S hB9 mŘO@ i@T d ^HC{_Ld%ÏB,KtUv`82C<ˢq/|gL: H}γnt66 pýEOh aPԇy`eLg{F`BD 4s7'3R.2A`C9bu)(#z8{O5XRSqyA(dH&b<:S~=# &7nM>xxgf:6Ϧa.5y^Ufq{Fi1ìs_қI¯}`3C]r P=,@f3H4A^D3H?1(z Cۚ.EB&hYt-=F6S=m)31a o%ϋ rG50ٛjU2d yU03D7z;" !)VЉWPzpR A幵av 2PӞL7nQy/fpe!elV˽mKT8(/C{5/`۾, `}_"?H/RW1tt_*jbGR7Da&6p8dsnSZ6`̍ҌC5=Z!_v6ɌKsbEJE3>C&kp ʔzMIөN$cS8xBp(n`T {mאӴ,%~nad`N8H*VLPW*+@\SzOBYGg#ՊspؘUcSgƯ sn!zC bM׆Y -ɭcm!C{c঳s=1 P͑c[m+鏍k@QS='P9>\u6Sۚ#Tا#AMd\DhbU4%27{}E Sn[!D TiyٰB>Ø|R-CX{`E.!)g`PO1FcLt60C [@ռjo\Nu٣;@_*/sC}{b3V.HF KS+=jOl$ d}InkaX#O580}@Xj8Bc F𢧼mO,Zn,iSil,ͿnH@75 %b7/8,Bԛt fߚ#CQSZ%8èϼxƵӉʎBDSjh ,2ElzaHX>3z1LCeH;Ћ#@hGB>b5 h:XҘԠw|D4 A#X[#եV#X՜L2lX<&aiaP$SRz+3&o:$P8loĕX53wÐϩVrWM=G12jQ]vv}]Stu%`״X.솪ZWJ7`C10=TW(܈lh3$#NAіilH=af !tV]CWN?O,^RW?|tL&Sr20@,P7lTάj"ٹIMڹ' Vw 5v`78ĪfO5ـfv-׸`rAaXNrjf)ot-I80O+f(+֖{C=_G;l秩MI&mBYBY11&Iт4k? L믰aV 9dx b4ÆkS=x)}P$5y-~02&@TLVN^ ~&+l*oiĺX6V 3Hhs 'ތf=O2c_0(rQM&c.K|&pXbn\&8| 'f;C'bl" MI@s^Ȟ$g| sFճCDI;It :wWJ'2y8&#< 8 )۹D Rm8 ݴ{uzV=s%'IńCDCxA@a2h;ZšaUHhE*huXJk,^ FHb B%bC9{o;|wj-G}~3|欻kjP 5;o1:$Ѧ`< qb('>b PH?x z|A9t=$Aښ*S-ٳ >t H -|,;<"r\"M$ Óᰶ3IޠBGj`MCkC1l,!yЦ=Iooc9f[MK66>xaӨSsQ#"ZнݧJ:Y^\2@U3QVh%U C*e RܦGZ[`XdP)y@ PnIC,8b&f[5b`c=n_ՔtIOjEq\U5d"('%}yzvyr[]s c'"\d24cj*HR(6d4', CB|[G~Kb~2 O:\SleЌ(ͥFؘ9#hb)L$(r 1l˜43)QWy= v[道 ĂBQOGX~MьRSm ޜYpǒjSB7)zqqDPC"rLg s`T+ Vk˱pxxI",!:IQ{'\509  D&9ӿ0`}6?zF tW+3z9 =Z84 LxC(Lio\!LԋcH&wރXjnbfTyysh}c7Yk 7qfcqLxS ÔHe!h`!`HQ*l*wMyUպy8"ˬ[j\4Ԥ'VjHxД0 1@SE"M!2`7o_Hr$1 5yzFFAu*nݵE{f4<N&8E놑lqZ V vx9ȕ e ffb/L`TS>Q$#} Ae{ ꊛkʀ1,ņtukzM IOd;\룉T._`WK lvTQ1$:ncG64-BRkH." vqwW~aYEA$aKT NVl`@Iw@@£ `m9 q\,!hɒuYEZ*^œVB^EBvUE>DEK=Iʰz(i :%V)Q4~LՉ9$=ZGS J"HJ0x^^XWi/&RA/'Њ{&U=r^PV3"44'M=&FIF; З"e8wH 0Oi4?, Mtf]EŅ  Z]0dC*T utc4{^CplTRXbk7 Fַa Zd5yU[k 5Z?4&[U"̴+@ca4w MFàk)}eJG4yeJcAcr~(X&vSk6DW!`UV\cD¹f_4;ϐl4|ݷ'|88j+-Dy)p*u҃ښ-Fǵ%њ[ʵD#0O[#'Ӭ51h^m@qE@{/V @% qy6"ѥV8R՘[qAupOݪՓ:"|b( 8V Cidw Gqy sy@=6PX ! @>kRJI٫䂀L YS|kVn;&kX笪 `+Q*$acqE!.Njj#6Ry;vRH9D.@-1+^-T/>@%CV{jHbFFV~9Avze4kf w:r)/yA=p}uz҇x=yϭOuAc߬]}ԠXU"v)4hj_ 89zpdqA'KϤV85{\J׳/NL:nktJ<FD`kpe454XZ1TCS{ D?njfi=b ؚ͐'rվiSq z^N{ 6{a<ů5=VPCKw=ւ4Rˈ .Mg.@Dħ"."\> o((Xæ^P=][? \І2.#oɟI}[},;¼og[ mӷҜmQY3?hfZK,':晐|␑Cˊ). e+,L`3&'*| /9IOl?/5#9G%|f;Ű#_z_e쵨N0F_s&ށK9W{z[1oqPz짿 Z1[ A֨ 8FU~\@{2FT ɼvT2m "E4WȈE+_+|u`]cY0D5e'lnblXJ0I%TV$y59uQ}0u `D.-(&L+jO=@`;~esvW>>gK_P=^o͟]_z{o~[|WK1n [ .b3?s#:ꅸFs0ւ5bkJkK@Mh+c5.QmazןWGb7YD07 {FmC5/+c2 `O8  2F7LDIda@ShOHoL6QaܚےA~a8c[\ %2oAƧ 9K[̒tz7؁i A `PVxV㚵}kʺԵjx^3Tbh*k2'^}2Z!#gh'AOt1L \=RmakIg?#ђP IDAT~lӊT5%>usRDayLLWHuY| =Ceǐ[J0%iJW uzW$` OJ/@ag{<)dN:=x/ޔ&f3Ȕ ,OdPFM1%"!Su-l,,050}z=4(ۗWg~''~}ި۷o'o?QZqz=Þ_wxO?hݺ}ַ[/o|g/K?c}Ss~/Q9_`%`8g z V*?a֨Z{؁+a8H 06+*ffWt(k5Ug2mS`T0fo(S ] Ո]bfϱ)#Ft{fݲH~ uf]Q6 `7ZOxj8T6հ",Q ՜*L$ a8@H3/OCmXj ưH`Շg`'.TnA=jTk -๺?;_/|+ 4ÖG5-c:#+@@5wY(ϵ'V-?Yڨl8b y:L~g_lr(Ϫ O|B§~T}S_'߾zz['~O[=YI~a H:mpO_m,!FkG=Puº^?z+8 uF LrscݦovDPp ;N36Su~n{kӜN>?nܸ#̼`xc}7}{}۷}GkԕyvZsZs=Gs{}Qd5Oz>X]%f(b3 `aXgX]9ˈ`O*#`10˅s ƇRl("@J0];pP͟o OS?Ym+؃-`2kDO*܊IiM [*ٞkoΰ ~ahLΣ:Sٛ>8nW 0@Re-.{dښns\0W^ pSO ̹ vg[gn"Sr}nG3?s7>d:?qfu䤏Vmn|)̼[v0wFNIvv26uHP3\ pc:vU3x <,Lzq/wk#ׯ׃O|B=U_X?[̓>l8w6кK)V u5BaDÜ!qaZQ0NFuOgн*se$㵊xg$u?R >Tzj6qEϯOOʯz_< }..xGiur4jXCW׫;oW|/?#_~i}/? 0PFhnVeY>.S:)&*H|Q!i|llf5U3u}K$[1׬t@4+ 5כ3c7SQ>׭ ?N=\4Xzr^ܹCo|clʞ)pD :_VߙԾܜuA껒0'j5_ژX*uzmO>e-l PMSuh:ulgxDz5#vR|n9X'z.0XopTn,h'%0Oij<74I єK5(`}^$9fɦ:\LImߛ`@&(#ݹ9ڬ Hv id+>G'G^-5IިA;K(j5T:V}Y1,؜0 +硕/ݜ*zvu ~v^+=h7oAgGs7ZV\,.9.agX^`ీBmX~;.y=K1߫/{K}__׭[7u{T7 k/L.`]̺j[{~_/~﫿kx'^Y_WL}?ՐOyez7esXh9|[(Ouf/t`܀ >FC`d;#ᳪ_N?‰-ߟjaas*a9x:PHk V"ap-kx9u*ƺrŀ\yRnL7 c)`:v@jЁ C>qT0*~ Ygp:ADrl`⎦d;qi!l.|*j/i|Cy*8윚xYר: ,$-&[/e"954#%ut[g7!d3XOdZvUK/R9GF[]U*f\IΆg""Ա}\qo}:@ jϻ&}_9ݛ;F4ҫ)9Am=zpYp:za2q 폓?qќ=գ~~D9Aq na-t{@l4Z3><{g^W@/Dش/̱a'&~(]%FXPPu\f#R.@7PFv 13+7*WJY\tW?=٤rvN{ L~T}_wnܸQoxׯ/o]'IB5;ίz?/_[oxuy_+BSt F-i 7<ͣAn, -W&t/'KP`1AQ6VUmuE*>*TW/sVS{mij6{kk,F dfC&;@c>X5י)v2y3HyEyTxp.fE{pEa]e#3y.|d;_gJߞ|oC4_AEn &zg {- c^ ! v;0% D]-bma>TS]_T$'jՐ]8^[0UN2gF;Z3]ݞoԆmgFRYW 8i~lO$EWy"|&}Su#u$U'OS0O͜<>ڜC2̩0>}ɪ>+u^+>YMX|FY54JNՆ>P0m}K4dph5،uZvk\XTT%plX܊Q9^`@Xj>cL{oW~ߔ{QungWܼE"@/ N#*F o|\}~y=ϰu;S#;*F?s1@NcHg[9nGІ`,0|g?< >MVP-'HT&A $6_5 ⼫3x׈6ꐸ KaO})O-fbȿ=\ 0FCz~*ZyxzMaw-Ye:6F ] Q5&Zj~5l9v<X@HbDccr2`T.Wnw6o8HF`B sd6x Ϭ)|0PFe͆ eF<;$ tcjXCql(7DMjG3 |@3aUfj3宓3?Q~C}|W=IO'>uz/߿OGI9b($8x^ƒ`W|VtsP@<7FU xZM 8&0)WKyU iaw LISb ]U&ΐCCJ#KՇe@R N,F1Py RX)S#}H*Xibjfj!hv 0hP6zk .͜'Ko<͡h=iޚhfi r]W.nn+gEGow7Qqpx Z3@ז҇Q'дߡTR>֔$>)?;d')@J.ՠ>}湧RcцJ۳8fpz اz {vLt$sW_ZC6堢:8eHb8^'ץysk1ߞЯS?9a}h{X#|P=iuݷ=|+ z{{=+ԀUcŧ\ThQo}!{fRu F'i? / 蜠@e//W՗[~O86jpȮxDK|??U{jUU/O_Ƭ /G yx~8)GX0@5YvQS(?ڞ̠Ij0>2 W)c09b=SV 6GE$lNl,aEYFWnUݞLaBLÚZ%@ &hXxü }h?ÂGCY`8s̻Κ8*Ta3?阄9U:[fG6dL.OTE_! a<֧{fN.f&2n $*;l2d=pis,m廀<6%Iva4]U2~@R"Spjv&۵Zϼ(-pS(2N1&:9r/>2ؾ3ڠM@yvq B GxN1ԅJg2~թvUb# O9R/qRٌM2P_E_=$ d*m'lVU}|U=Cu3U:cS*Ec,M[ `%Vveb`N4y-.el"q T>HoS;pt6 @'=~ePHY4כiGcqmZaR30<($r%O" Ssj?7}04+}|IŇRsM[ rhNQW2Q6 BlJS<[Mc cp k(za ,tP+SnkүwMmي?=fz*hX:UP9ja|2..WaYԳӥҀ|mJ ma쓿SS#WU di";ؽP5e9Vk'LH^{aQ}`Q])}gwU`-23+NdYON->t׌ c%W@ءoΠ@^K 6?X k, vS?5و ^/^@JC ~D2FP{;d7v$-?C9[䠘>3yyCaNM^B3X<8NNђJH `icB{?_XOnk[{m8nwjHRңC:kY|]-;>O?wBZ 3FT(dUX!@/:l`U=Zk.jtX,ornz/^ȯA6ʫjIV (sD#(@(Bڎ}obQI.S|=ZR 3.6n{ȡ r^BFs5+YB% lz-ELA ,+`XqİD%kׁmD߇%>ptg6У\3(>ń 91jshV$lmё`CTjiWdN :)G*͏d8l5pXCCɺQG 0x)"^Dwҷ绲`.Sq/6sgx'Y"4M')te*n $Sc#-s9;ǐ>0??geСCX23(-Djs޸u1 iڲXU!1jZjC3ړ>6Ud1SCphf-@3w`}HPt?d`J<Pc+͗ mw585 ^B#9C&4 AN&`"M>it)WRE{?\J(ERCtc+Im\v%z$ yyȰ@\vQEk!!~-h[N=%vxOPtiRMj;2c_֤*rl c4 Ͽg}gp$ct$ zUԩ8c1kR̀X$)er^ߧC<%F ddB' LitO#sķjeYbؑ @;`{2\.M[ڽkΈTeu<ޜmbtvMۇOh`OmU r*Xwf x6G'}^_A`lO~nk?h?.MTxL.y1BF5Re})KssX ԟ}}/n\qyWfգf s"STMٕ-x1 f F&@ѵ*> 3ň"v-FWţ)mAuǖ_Ǧd8{9Ufz;T`a{^9.^FL\/GBopϱªs pZ{Btk%#ܨ9-C݋N,@Tv LJӵs!bYufCG!M:B}Pr(B9P-14˜P K#pCf8rFh}Ӏ kNq9y5H$(' ؔVnͱ1LA€Oz,F"Ձ0B{u H_bI3YMyּs Tk2$82`uKדm;-#:*nGy{;Ah} %XyG-wޢGT ^zOjcWMhIü\xº^k6;B~72{UJl4_$.Eò^ l-::5/Qc*APD ЦuI(*aQpq m TJNkS6}!:B%"?<ކ%_ߓgYʯޘ/;0>K JsÊ}ؽNAT0M+G,ʵƿS)LI9$j~n- @)0>U. v\᳖ ܼ^َPAHM!* Rk a,&X.QkKg1:`\裏E,, hh)vm,kH<է z}(~%uV`qł)F4ч2h6gv4BneA;N#vn m2:>02S?;O4E$OF(ZL1)IFY駼>5^W"ᆷ'u0[f(3ecL4kDLX͛w_>ۆ,IYg,g$0[C&#`&RTu˪L)@%|Fa4Uv#z8fHFU @4 tɺ}zsN0vZ ^iO+:Cy deO(Fz>б* &M" ;k8.d!<~0eDk Q{PcfQj,l I(PGlphMދtIڗijK1Fkɛn@ n۵s=WVct 0fE7G)cl(j5'iEXHS>g9)]. S뚲Eƣ }s< Ojl -5q ލɮ R,Xʚ|ɜF(N/j_[/ t'.:g(A Q(_dЗTngQǭ =VS_v U*Ŵ0i (P 1Rj'u~@]ջL)M c;)6 G3EP6$=zHO lpSЕ z%fbꄓX6E P5;u(O2NjO/0$y8G )zX֣E&J1xg;!fP`a^Y܃ ErfC>rˢ̼~uuqqq(N|_MۿG|*4إwFTs䈨f@0V/Z) Q<0pƻ7?}Mݸqn߾]o߮n߾U|n=#\?UZaH%'jR Vk\(,_5'1 1gWX\c|1΋2GNP5)cIé#1o'xc&k>Hy88ޠ#vԌ\Gzmpm GAU<1Im|a` wR ȩ{5'D*UW#V]ثV"/bo. }C0bK $iFw/pv/ڔEm# j/Pij5⨹' Topj^ΰH@of:T}nky4=dҌ/ҍ=-F T8 QVdj68U/%@QM *߻`u~88(Z08T\/"l!u4> mR#Ǜ&|R'-tLPz-YKX)ǜ?+IT5 !r)@`P-iX5L c(qǽD#J) e&5OEH VGVxpnP˟ԓ4dDN:bU`B˭$U+eU?VǤu7CTfq%O'^XWČ,KJ9l7铃KMgQ%F21Dvp7-b̌,> ;0.覈P"Q\CPe#nPʣ sMtw~I/\'?̧zQ_U>X~{U,M -wn:ց,E, fl ̶s}ˋ?)Fx(w t%Q1T. ~i6@gVYl[QQTؖ* 刪'`6dG${ӌDh2m,\?}h̫*YK&Yg:\s9޲KWJ+FF|#U9}h*aqx,kWG-nT `r "=N\O>ylD>&oE\:FyP_tb"hה(p8!jCx(xxN*d4 .oPwςUJH*U5(&p*) 1Ί\É5.QIt쒺_ƔXRٕPhP< Yˉ9 PrN׆6DS-@;C.Bq 9 ~eKu)8JHlnB<]<PԚ7)!m 諓p;JlEEkٲi%VBT:Lb쒤}-Ȉ4/XI Axf/DM?r'C5 f@$ZWhfcQjSg/w@zunD?.{q ̭ѽϖÚ<& 1x^j2C@|bl6:vōG7Klnk\~ÌQFPi X#VQ|OxRQ;6q H<x#s*JI|^w}u}Ճ>X>`=7oښ:cױfppstZ u(*CMoy;ڵkuڵz<~ۯ؃KFU%ICGJi,l}(^KܰѢJYJ98D4TA˫R~J#bFmwUE6QE<0wjRFLOgļjt;T8q=F(c}^N&ُ.8z"RtW:\QES uzyV62lvEScl\3#bCA<+H0Mt(j˾t*(I0DOD J$z$Fc u? X TO?v *c8Kt/:{'u -aS"c)RܒN\G XAzѓ j zMEb1>T2,cilh q6{ѓΌp?9nRo+O=|="+ a m_ͣ8 1ʞuUBcPҗ;Z{mΛQƤz=<1˂ d2NR=c[S?=PduJ+30PJ SxHޓz-+:j?dA ,@c`O tMMZD T/\yn{Yy Q׶B׃H:Qr{f3 ׿Yp,.'',VMS"290 _kE!rqRL(b'@ Z5*?KZ4n|Ͳ\ O&R ݇J,a %Ĝ<";Up|gp(m9\sh*D^"s B 3Y{W1$=H Q>l5Hﻵ^b__U |j'[R"BMd5'_*RL7,<3Sf=֛H93 Q!ZOY=q3&tL4(R}8` ,4|%yZ >֘X:TU}x%P)SǰMmW_+mJo먣{W,4P>pp^ިPFoǸv7%g5w,,dLMSҐ"pt2$:u]Zk(.cM-gĊ,pk(^_]:8$DEc 2sN鐀YPNynܪ0aiڮ@A3/Z6l40*  D_62}U'MѩM%w~L?"s+h!k=L[gtu ?W*+5E b" ؟2ҋ+n8636^ް)gL _1>lT|i\YIlEd|HU@ǡ#)qǿ`\J?U״$~ }@֡n̓P7lp,k|7Л_Mxz/zvWnW;dʦB1=xObk4Cuk;󅃉;H2]?WGѪ{pЋpQ e `Ԯ rPՁbL%Kcה$R"R ݈t@ EXP)}5Fnȱ?64)[C )Jz8#klد+_|?JU:xSk6{Dذ1ZegOAyl |ހqzCoG4TiyV75N8i0tuT=!J,1H +y$145UYhH*387~뽘pR)%ֳ+=Hֳ*|H۹aZ Ss.[eM~دml܁FΤApHlDW}J)d8ΟƶHkmƐc(u%K5mNO({+{:YPFMҞpWWVclXּUC=NXȬO#QN"C^{ yz_INE_5PX0̴k$!AJ:a34O-R"qLɆf-a)lY|fE RR/P8g}۷{M?cV<=IluCQtqFu7Qzw=s(Եkxz}Sܯu` s&*ծYޤrA8z0L ܳ3i}0hPSƺň`h4j4M̞ IJH o%A;=_.Q0Hk3db")(nTfzKx6dt;wh>~Ѽ(:|,u[f܍d3/~.#0\M%kK6;>; T6;϶_J¥]ȋ,~ Yլfa7 x]eovfBjl\?N<2FbhckTiDBϤOUVbL6ng*lҽy]h1nҷl)m]Г:`wGmzHϔkk"fq侐dL۱&{okKSf_45jF I!΃Y1`܁_ I_]X?r&7~PdcUM Pȓx,Z!̼j'1pi gkpۚywuF9*ZbB_~߯/;owU+9HҀZ3ZĦެIBգ³U}?}^k~Y$iP=YE @͠IsM|WV7<{Qz=^uqjд1ٜ 5vBupH{1;Bu!7kj,'`,d$eyV<&֊tRwqKE0~PZ }>簎AR:]l:.?ML< 4B1vP"> Hϑ= XuAg `!ӆb?ŬI,b{72-*ǥ:^viR23cR?z|<| {@ZDuw 6휔`4͛L k(>mJQw5i#عffFz:sw\SQ3 kqp_ΐ3\ȭ__Or*w6?R4: U @u1>>Fgub;K/aW ffg@,P TK.Q O;}3,V9(DqqFk-~ r^oM'/Lc?^}{燞̧8oe^ zCє-#x|j7e?<6vyAc_1plFw$RjJ;} $WxLtfz7|O i#y*u 7'8#&1:)e`H$tq4oj ^0vD.JprƚJ*04 1'3ڳM^zϬ 7s`řW$6L:xP- b$%||4 ^9aMFkR4 -Ɇ554$ZZ2q 0gz5$?j ,KAOSȽ25A<9ڹ z S v Z=- cpR I.[`|đm R` ߩyd@$Cfڸ)&yFn%ajN9-) <>M0[LZjn( v~}$"NkPduo@>KDö&yzݷiqB͒:#AH=-En谑qZ^g㳑)\;J$5s}\eq$EI%PSԙ}0{#rgzΨ<u.Ւ={,ӺNXgT>B0(}6ÓCz@0ܫj׬༠/vqpy5GY^gg٦V}e t>|b}$ARj=u&Fǫ)7#8 uBR|n簟ڦ{;RsHD| ,sp:rJt|m̬D(v,x(m-P<ή,SRj:^WϧĖsYN [r"/4S\DѩIdRؿ\ $*c@ NJnQf+8PLCgG"1J!<⣴`h^cL._y|k| n~Wh ׎PΑe&6mѫP?/z~o5Tՠ-VzlIA X.$Jz0FGy(uh9eZ̎LDI\sr0CBD^[0+peS9˝Ock:&ssMQ. ZqO  n@OZ^ޯQ&fRa;>Eưv&5o@Ƃ3e3@f}tTѨ78z˾DUYH#gI{սd7S3@]޼1b!<Ѿ7d`r=3Df懀U!~,U16/0SGi{8`SB\?$y4Y-4w*1ˀ  IZ.`I0Υ4TKw=ZzfE!a0 Etn oayK 5< vJh3|i Oz%eDx9\XS>#cևwOv:Q;#@K]Sx(m6 6Mz021]a9c.fJclP)IE J"l ?sN϶^/eK7>Td)©X=|5Jx`Q_*7xMi1n\%`kXSSNd.uQ8О%L^A}d^.VS&v.-L\n~ӶG'=R偱tSU¾9]' iA @bu}T=ß2#8ȩ 8l٥RvZ4e1ʆF6< x0Jm~?jkzUQ65nJsW9`(]F8Mx'ӟ"}F- 8Gk6^yFn~00ߨ anwx `;nTK+a'_;J$)1 lꇵs V"1]]7z]$==ښ%`vƆ5 Mg(}ƹ|/d׶ ?w93TMu $q_*}&D(BAJ:J7ֹnxT7'`dӫ>5Yc QL61=,e :~֌'Å[$!ϰuԣ>z(>?z#ar-\ha-+ I)tD%`I6n#4 wD=##a'0g vЁ1 Bhh!;meXڥ, P0Ҹ(wF.M8oT3GRX<]q6ƒs3}F3, X8{a m"m3v&kB93'"uz dk0BrF g ROE;ݴ{$Q |Kʄ Ir15BzmAO[2g@_6}. )?3?SBݘc9wףժpWads a;#C7`$MdHa(5hh`nWp[;d:XW5Hb3k̤(Ma]nˮ9^BF #xMx1evU)p1đm0ee 3P%!@-ZB#?o5Ɯssn#G}{}^k9sg$5|SCcLk|6%W׹/5(p)vut;2Q ZӶ-M g8t?s_X?J+-g`:.0'rQwDط@]pX! {OzOzE,Âc]4s}ϝ^7xV,Ȧ芿!ЈRt4| ի潮]Wg׈J{ot2r%78j5Hb,IRJ;:J#R@u]5|F[ M@t]  Я;HB@=Q\% 39:E+H#WU%hcYk,RӵmyIsgd&@ǤR4Ys4fݣiM}rO۽o`MNt6r_?K0;/ P(#4awqV IDATŪwv6)]ݩ*=h޲GPGX4rLM4c=.ή_2H:B`dt{3g"KǖUa1bY~aDhŭ=ieNn46ޯswVޣ> p^E؟ds4/\\$-<\|o/Fk؞ G8z33.l tE@^k1d 6 zO|dBL0MrhaSA-w`Opb䥨MIfCF.O2l6gq-8:ШIܒHMixb\tTJ\x1.^n݊?Vġ덞ODjL69 {v{ǎrܹ8w`b]z9^WnihsM / +DN`6T(TەxLy#J3:KXsDžRu1i`7.FhiMF1hyv&ƓJ]}xܙ4 <!k+oNDމ]FTY,hX~fٖ~$WZUt͛™,K1 \^}u(4ʹ\~l虁ŽE4y:ou's24cO6ݹcuv9柙a˽Џv:Q=2.̌+NhT̨PQ1zhra`4j˝vm(渂CҀ[u1Y^fٖA`oX7&0[ƚn`UtMy=Z"XXg{ ?wG\#e;yXۈ ȐVlkae]M3y^@a^/QJ(~w?Xk"P#V9i|kn?',DȱdON8w[& EB[_>ڕݝq҈WTFcXY3{@:uPN`6@[b 'l XwhݮU^qY+`\UδXԂ4rtT.^&F7+G({FcSlHsN}K3kX3\0j5DMcԝtfMr׽؂=⨇C0%X4tNu87c @0ր_:Sf!Eyt1t{#宲-͋Fa9;d7c/)X.L^J^;` J`LfuMba3mLgTM _%ͤ=@(5ZrmjJQ7cvIgΟ9F.ZP%nlֱeY$ŵwn^gֻg>,a]zw9MŎա썥4VOj1!㣧 15^uO>XqNdE)&hH6,N.8PWgqN;ϟ޸q#nܸϟxk3 r}@苙2x 9hHx2RǢȝhӾ:wܸ_׮]Yyι*\d3، OtkaaV7])4@Ds#,xHƶ>u23@ܡͦĘΉ ԂU]\c/1=hbt1Xn|J57lAJ׵fBcxu{Y]MlbVw/6BG _#{LpM/7̰Ê+[^mʰaVMVĐX,Jbmԯ˴t!$*wP?{28)ZFpИg3 W]U.ѩy\%N)Q⚤f,j7Nk =Юb;D,!qLZ9`6! L'MxLO؁(j a@ pJWE`ON`7%EY4Z{huŚx. fl?z7g[ڽapւ3B*yR=@S pƲ{ˎ)󃾌Alcaii X{>uV*i|`a0r ZpzOa~O{W >4l/v7V>$`:܈eE/Z58@\`?Uڕky2;3x4u9ZijX3-AʏM01S܏[>1v,yUlk#ܮƲ1t,ggֻw JGAE ]($KO.V& Lsp<6'~ W@haSr̨*:^at'BNMlu`^ wG<"Gą ]m}mhdvIwP 9[JgoŠG=X<@{mt83bTMw;FX9da.}Џ9Zayݾ_ UZ5twDauLg,&0G \Qd߫j U\|tH*)_e[ ̠+_}Hq{=(yр[ANBq+{h{oxF|G=)Pu:$݂FjwAw dN D>[{hw#]J_pmspU 5`N=ZY1FW$.bO,A֍Ա^~qZ|Ro30'݉^Uh?M-D>wVӹn8qD{b}QDdfDqJ#X,5` =H ?sB8 {K-y\B,JC>k}!qmоC< aˢRI {!3Cr-;ݗz"! `צG,7(z-.JS rU ՚W' (q-c]~=_E>5Dsg N>]+͊i$t lR]%ŋHv?xxe:hO @.\z{D@Zy .x v.nuT pv"xژi.\ . %GZ^MAm7X>SюsL{KqLB\U!Q]3沴X $O1 L-щ}#z]iکq9PZʽ+ -t HY†Q4ZQ@Fs%=r^јn<>(¬1tYZgٶ C$Fcs|&? >}J.:[3&`x8B@Ĩg,[zݪ_h5{ԧ6n;vm骭,N9gXgֻk7B-<tm!j.x#XKD3Zua(<,ӑ?IW~_u|imʶlnx0<ƚ)Tmu|~FۙD4EPUD⹉,!eRqN,b_>ӄۻ~w⅋MAz]n:oiַQ&7ЬWi0AP}Ȏm5Fy~AbkePSAy>gg3%+NVjviWEF|DPFj(qR?z9kw4Q]d+gp0)F]f:p &<2ؑ5;{3 zxg3Of+^ڄOlѮ̘zpyf$潹76mzbxc@]VL2N JS;+>!%ө(6P]K=Bzȏxj{w ,חF̹ i@Hn&jȾphcP,1yV_[a iܡ0pm r 5J$$ڕ)3-Ju@Yslt;.-/ IDATJkV+;%4xv,_289o6, ~ dkFWL*{sp`/ H xX0b6@+!>x|6H)k, P6`b\(@y4{\>T %C*H5Pϓ*wgDžxѼXњ ,ǚ>{R-shAs r1o?͏PvC~gU^9.&ǘ܈g,KڜJ:#Zn2knNzce$ BT׼5lrjbmҬF׉wh@Rx+_m@J&t{Dik<@^:7(gcә,k*g\f)i iq/Z'>Wa-`4>әW QqH`w7 ٬yHowJX @?911M*G 5S@'Xd4k Br͇X8TPxܑYGKlJτlpyy8pm|MeXШ|BZ~9ow?ڳ F>ѓ `mB㡍hvJ<:jlM͉LUtOdiEv6| vU!'4¾G4O4̈́E8{ wMLdZE:EaaeP8;`m_ 5m< f\.D$I;x PނrĪe 70$-L%JXg=G|^_+W˗1W g%b֎F0:H mMu%IgEwBmf>9zvܼys0Ѷ[?q$I^HJxr%bƌ2c%3;awuU3m2=}õ fm(wa}Eٓ>!?Bh>|,g'“".4xt8&ˬc@u'bg9W9?Zr*7a43 ɢ3;9@3j̩hh7:2!YXk05poiظȣ+VI! ׊{B)32ڲ6z\f;3p]aUOo88:M@ǖGćdG)|rр[ŰmLl:#0c3 Aq|NwB+qru,F3]RW*`eFTrvtD35Kw5]A2:CX`׉`ҵAϾ0t?K ;) 9*[di e9ch1O}1u{W6^};' u E4Fń454qi'e @o) e9a+XD)$wх#-~`]$Q&[#`br+PJc1D(p҉ZG2oл7$kMO {&Y_B(+7pzƖ8d1.y6X3RBhmK{ XNPb'tR4؀gVWs ffеb@!yhz rkќI((Ah؆ ohZQwnV$8]Y IJa) =XSyXz6Eh=6f"9UL{+{`i+du(:An ̦ 7/ej%)Xf %DO 0ɾ={T:D3H 䎒"*V#'&U'1 =HaCTjа B ͙{7.bK9eLg!9Nu¾dd&gq~V1| /1 $c[.B-7>6]mc̹R6EHoK 5MA[&,<qݻ=w|6)l"Ԙ1uh,!^e8IB1)HGlxH$IR^2{Fqys\'cY.:hɨ2"V)M$3yIy~},N)q4r)MbU4>mX󡙑{Sl "hl볎MvWfPW?,Y^V ,4◀ۙGIbv$GU]5WATsM(fPT؞%E #]Z@"Qo`28.S1Na pnX섙f.[;V3ƣ]2(0?via(2+(fcfE$הq4W3<⦂JP g7Y4"|͸ "HP8JjTYD۪*3FC\H$4\]6-'|os Zd &4c?P͍H7p5RP ib4HgfRڪ < 1Q@ad p6KslJH,jR"Ia,q d=TpƷ;CXΑm#C:`%Z,]uȲqOֈ1“c3b|(.;ƘI-xg*ɩFpGYxQE38jU2+c~r~`FZt7Bm;k7m -ZA" PlA1$f+LG VS;bw{MZ%11Ix4ʹyKPE}Y"d5&?rtC7 D,I75 n-.cTd:S kp!Œq^us!]pT2H;[-#ҥoŵkWW ͍}ɢ"g2%/X\?̣7ٓے$ZfQ8DVfM㻢!tIG`)BtRT&G lg0;Fe ~a >iN6-|HĶrcjbQTSNax sv&snGi I9hXm&e1{BǍls-:D:]7"=KRq?U0ƗEҚG]䐰 'O9L58fg@ GYc d4ihiEh@X3 }$gZLfrR-쐉ğ5l4fUCRr77D1fi"M52@@X Ef;[Fi xE=%a ϣc֍Gt)Jc co4ej/f9WM pN^G2ͩgHYc0( i`Kۅ2I88ťBudsHx 3fl&p]V㵴&G ұd3Fa;5G StE8+nNm`wƑI/1X'71:ݱ1ȅ:М9 u*764H'&1*cȧ즡Ue? Ì'_|zG̬x!h_|ܦ:sgg;5΂39;DR$JQh(lX  3awЅ3ew#[8Zwa^e մ.~L1vhpM+j&xJ}Mʑz/u4u HT݊Ҥ߱@xntzFī^/zYܾ}{h@mLMqx]oƯpNk^ĐIFHTc3.S Y_vMڵkqڵ ^0mETSztĽyHcjgETwB%l׺5hO^c QRe>WҺS ڡXOaaX-}M_:r 010 7FOAwi7H^0]:kJ`tD/%X5ЌZSD؝>b`1 @~&]j ˩$:..||\`%U9LvVg}6ZGVgH@}~fEQ, bPzBw`$:Ԍ98ƿ 4 ,f-B?'s L OKer6ͬų0jC# /RW *94qӋRȰ7c[ I1tJB) ӮIh!dd4fGt+; 1d޺OfS<'15z.ŐŠПQ'Nm@D}cYp &*c%` 89JsJȾlR{_,5(M Ԉ 8R$LJ<-&Ģ(pqݹuat0 8تBU \ЩS/Q Hr7Q5l܊ 9SfO:Ce[Bh S O$TW%QIـi)OcHtKʈ3A3Ⱦ΃)a< 3 "|ktrڕpy?\T cv8Ӹ`$1DefmQeMɝF3PWaRA!*4*(KVvbB)8V #6֢ ~K]0lFC\hm@>u;z?~zW)C !;?FT_P2 \=㱏~_?a/_/tpb*tU6p*BF֌$4$(j_ُc,#>Dﰥ6*"INM(#_uCEP@9=NSj E{QH*#ŤH"Kh@l- LIAR1hR 9'2iZ8KOYŒ},@Ĺ9$Aا:F >_H 1R.LYR☫t]w'-{>"4ܘAdNh34wč4kc6Tf" puyJA)cjB!wHz/V*Х0Ug43 ])/V#!@"kcio :nZͤFF4"UvU\A}8Qr-#;)"_zn*iӉC /P G/L4 7Py-~?5/ƅ kcfm.Ox)ݻ3I7E$LE Q;'Ytq @O{qcN+Wĕ+WόiZ)߹=gBW?.SH6&̫DxS*`m6/440t6 Z7cz 6-=^M8U:@Kn*S4 dSpcP&_5˼&N~@.YL@6µ)ZrcBB߅٫j]t.l/%X IDAT _%=90ROYFE|8@af" 0\EdD"q@Ǔ# &F"iq8 "0Po 8YfD0P;}ZVRә3}3i^!U3.P `|DRU"{(l+>M7 !1k ts;[X%6ݽ8Pflq0=ɐ1RW0:\_b*}dh&b^P±suL}Evƌ2[`lu1ǞfL|qgӞ lR4?N0 LAg O* ! ԡb"H̓_&:V(*)!E(|9jc>ŠLE)S N+"C#2z,:ȝ#aMom`@dNTm-4H)6AH1 XSBLK4hMYBu\C] 1)UڰΘ %odZԞ}{r;)cWj5ۺ0S mQ؀gس3}7w+3#>0V՜p$ZK֙|SI T&dߋ1"JLdFN;~کO4S&f`$eəM)X1I eTxwL}S |İC}QHm qLbtY/D=L/W1';E6Bb z'ԚRSq2$k=(f`"T&GK"4..w4 ;!Cf3sƠX]C (M0`r1{X,:`#CD>%MGηF`dlEA6-' Qm%~@"*/XSp vD AoTEc v:u 6*!MhXX"v.aJ@)+(awFԝ:X:ġ`'Lc9a}P@[Wƫ3Ʀ!a.1R7KRܳ 7%Jb{n c"it qRaQ H>Ltw:# Nzn?Iv3$#,0i x55T ބ֕PVPGSiϦ"o`i)S8]g*Ny96,M4tbag, 45:ehnuչ5Fe 5,b'ViЖg@uqĚh Y (5M^vi :J 0!"IԓNqOξh 2mT&2]誫:}20:Na^^[&{} c_~Apd=܊xv%`vڏ椄׀Vm JE28j+ߴىݵ9qH鐟HzuqAKĖҜ|Ėˀ02pbҾ5=rk|=]/x/5}/;񴏸ۺL:=iVصQ~i"O|B|}N\p%?~*^+!v׎`gz5;JY&w-u-mc]T2IH Ep~ؖsjna#g~Z`op%bv8+W>Vg$}hQjLzV$QD[f6(<^m(R),H>j>7jprP~Jx);` ;I^%Hf 2@%#]1P,uSsF) a!^g pa\F-z#>yNγ(7y)HZd=-ZC!@t<ά knK[kއZP U1z263fbzytr#܎^@I!?p9FӠHI7B'9GT3ӏ9 I^`rRIHF0 R[q~FA<1T XX,p8qK%DZIc26S InqD3D Y.9:q6b"<f}00XQycAM}nzU! @GU WϜm,NJs!%t!_ t JJ9@bo\@x wF6Ҳ<#؊;'].u2mU\ir5Lkg칉:T֮ =0jch# Ɂ9HY>#:Ps/r6yYN zLo&1ze&T: Bq3Oam*E:2S>L&dV>464@$gDTnۂ/3^Mg&RIڙ`blcp,Z.@ :ֈf._45u5}}|lfLILrF>^$.˜Id묍K /DSa¶ 06~d %X*Ӓo]Uk5t,t$ IK5]FGwڨVZH!TH`6sb=Ҿ' h "F=(<)K_+gjiKFݒ \F-ג)=8 "[3BlL=^:@y N)ZZM>P sTLJ5HcAnyEmT6549b哑]7zY#Y-6'M%+P4j K=IDoLoP4?:pJ CY9X_JWW ca_8ctv]9pa-ifdg`d[(^OBGHJ1ݝjD&O\2yquG[~oKE>z=+;$)TFhUny$_u GVtl}&{i QйW&쫿1˿0>uԽ>/ύ[nK^kE?C.*ns§'~3)8\\pᎯm{Mo/7iayHbfTg"S99>K[s\N#@B ,̤A0t4Pz`"M }512Qm܃ ";..haPጌ&@Qc-l1R4,In/SHcdsRs0ejH(oXтM-v|=Xa4f' HzkdJ.i|$ʳ<՜.ȞQ%JP,D Lgr6ʘ\<HL?_1{F)OW c%BcR] k<,0t,Kk{!C6 ^v `vOVRA!:g8XjI;HM8DgXy.z:pF L:Qbkf9x#c0 &DRI0YѰwiTr BFa nQҬC gF)5DaJ@`3PUjNzcj@,Ī,VnpY6W `͔Uɡ((dhAK׷i6 x:s {.u8GM`P%#1CQOȬ*zG(#YSH8TQ2<,FXqY¾:ǥnx4$i#-PF/J:]5wR(@VISL%K_zy|?5oĵkWOoZXΝg5zJg>-/ύ7~7%7xы^2q1O'}Ox|<яV>}c󘈈}`ulN7oތ{ӛ㛾IG-g!cx҄9A<E"yԂ[gS*B:-c8 )$HsS}@._NL 2Xg|r] or( z#@64?&%#*PGQ\Q { r.@Xrb7E}@kPؘ&U럦z(, ߎ=:cOiq7U@z 4`tC5JA5ξ^kϮwˠYR{@=An^SHֺV+' ~RhMC&3 353j}γ*ԁ]QLث I#U/R-f}5@h)g~9[DïI7nv%d;[.ASf{2S͐;I|@-;{Rc a<R9d_(g*Hs}&pY +,23V;帞494.;jmI'L|6G}\{3}~qEJ\"\; r~M"2DGdLfhG1}c&'d jj/QoAW VaPhZ=`XYH3/ŗ{|'wףqw=:';H_D< q#7uCc?( ,-KOue_(uU#bU `!Uo28ZwEc`."(F*>vd˶EfvnŢ[O41`X!b$+AGNSKZ% HEHWW'0a{MSSq@^ pYf~gNAf .)HZ:9e &coNX \ )?JX̅.W`sW2/,kQ?*5*Uͦ:LƆҤ]kVfAF8zhtUm4pL{. ?SI=K#!pd{ly(mY;rc֘Ȭ:.[@!&f: n<,'ыMn!ߩAWW7<9A';:.*MYIZ[5DͲAwğsBg?qhjC4hbe0V'= #U.0<]uL"zXww}l+*؍EjҌed2hF $1N@5<[ IDATN%|Kn:dL{eSk` @F zAtDWI)oWUϿ{7^x衇͛q͸ts8Р֭[q֭Tm͛7֭[._/_ .soߎ۷oj{MkM EK?/p#M;6b6/eZ7 ޑ\)˶ WT<1F1]2R@W@ zrVFcq=XwgKT6 \[e/(E%Z/A+Y RfS51iSnhtsї@,{ѩP^S*#6&i_@I# ۷ -0Ev뢑_tjHmuwX-cYX(`{D FcR` 5ɣxT&± vܬe\-(zU15_*ٱ;ArZgyq&Mrs1kwcr$jC֑tͨT.mBS?yt-mF>"}ݗD>eEe{+ԁa.xJ@!m']7o-Zb{oew$gBrWEЫ.rIƂ|HjdYV EHFtř䚀4ߣsu댁u{ÜesהtX~b[zK<2˔ԈPsWk]M`/i0X7O=?s&b[YuലᗟɟmI #)MrYqn~(~<~'~!"~`;{gbs4viC}|uVRTgX|>,x,V9߇8`˄;j:shFjdzu2쯉)~y@'gܯhsM;lb5!_3qsl(N%&V*g־1z`]pьsŔl!iؖqp"`Tb!Dw Eߨ6pdoȝ2s7͖X3ތu&N٭bS{g\ 9k,wJ1;#ؚ]&:?RgJiNpAx`=q Gd,萋\\=XkcW﵆bofwΎ췽5ߩN5DE@[ís=wRc;K ;2O-%qjYmX?˳{-(>5:9p$,p{ 8u>蕌 |Vs {9#G\s'kMq4w_ŗ/K?Os*UD ۷oۿ/\ƨ~-&N/^nqTݶ{ow10k5{k}WPzX'8b_sg%ouWk;`1(?('wćou Uwk&v.B㈒0SώŸ&l>h9d FOopc١qyL1N|1J˞:v}'w+ܢy`tGjOc}Z}AcwV1RC؆ıy5c8~uX_g3OW7m>ǝ0)ݑ ֱ Wح}>F9{[R0-5t?Ya;[.*eG p`pø&`X_ (I)M>Ggߋ_x+g= xNh=aAwX`&dٲ>K{nWu?pGІ#bcSD1"Z18xx18pၤ,wRၽq/Lϭ;k ]i3x vC#/p^y3>I82AGc 1hJS{`-*BYۀ\,wo'L=RȉH,suIhhF (sѱZ1#e,Rq}5\3Un.iNl!@|K/}gg~'>qC /^hCꡇÈ0+}nW&ٿx_즬 $sx= IvxMҮUK\z*c}-dۙ<.ԫQ\NaEvGK_x- v?nllȡ~F,1眭G6bU\PZY13XHwJXńC}]"⡲Qnd/9`eSSWa54frjk}岼+:FX<Vat 伧ZFQu;\ZH؋7+`[`1p[͙t8ANƝObԆ5w3wr.85͠GUx1uw~x(С6n{3=Zws'`vvir&9nrk:c`6EPRc( hm,h&; {ߍZ-RC3<"3qSf {Dއ3%e}:Ƿ)]%ESќdNN w~g_ 7Ԏ+;y]|ӿ/{^`X?]lLmՎw;G3]%Jhlo:Fj~alXg9+8J}K9SEGWf&-2Vt<M5# 8UqYBzjqD/u#ODS|-V UJe߷<܅jvY79&=:s0i]e7`=rܸvY'',sO)Ұ;wbFag t%q "`0f8tCFjEQt=6?Κe5;+q::c` rbѢXt|CXvWKiMH/;"6܃]"o*{Y..uDV28>%NTxhap64z:ZsiF8:e韋ҝ[?Ϗg}G=SOиqFDhT(TY3kcb.]ɴz[ڵk7~W;s?4lN"=E.b2Kۨ %3>'-";nݣGANl~'5;-{.E.԰iJΆ(⒱wv_Ӆk:kT,+3p'3G6e4baPU{wk?wuf~I9u!ߘ,'y>RkQyoBpZ t~-,k^GhMT$\`o^Z[o{==/{ `}}䧿zǹGQ0yO4_O,nc #)101oy'qƷᝄprf,ϞyFNj!hbG(l?Dk9ͿG?o̿ϻ8O?o//_znNRA|RYd/B ʘVt"Ǭ uKpX3fmɾFFS:4Y-͑ (f1h@6#"~N/_7]^Yn43^ ˞ԥ9@,^Z# x 8Vg(3`~~znY -ȍڸݧӱt\g$"zo[yM@]D0M#f )ts5 dލ#~{Z{aI̔Qg_WہUޔX(g,@>ka ֛}&$Ŀ bɢԉ^Is>׭Sٮ+).>yEz7@|]FIxi#sn`_O _u"ցxn?F (fơYދdic0hrFs6Ě3wam>08h2}7kofwPX} .L}`dzoO{o?&{|=3;}_k0/_,UanTț2 z/0f)(xx˰_ldKo뤁] 36uO0 Wō'_RqL=QF/w6ev _kPP.3 <@rWo;0!"QAuE@⋃L~AgFMw4Jn5|5ٰpgN)LG3ͮ5s)U-viUƙ'dlS;A,*. LӨo28ޒ~r3!?[:kk]Mk"*ـsyN}^[6C4#{B 9Cv:_q>Okf~ӟsqA< C^ s|4 H ֙>ibh5N7okzy)!2?S*wu`c$cM9gYZa׿;;O?|?Ͽ=}?=_׿;_oo?O+?ֽkk( k^:08ZFOhT3eBݥ 1$[71 K(E|.}[vF.`eLeU\B!Mui|vo럻t2H0M !JSvk[svu4@V{Xs&>rcRu `f x!iigpSt7b }W{#5 u?7h~1ґ.1!YF4U?)~o X@L#$.uP]}X MsI2_ͷ/> (5hAu~QX_)뛋$gϻ-,❩'z\H̹({n_Bb--O.ĭD(> 6X.luxgydBB?UX‡׸ darȢx6R}S 7>ƛSٴ?;фa@v6:˞6{ƄcohЛ A& rf2y /X'_tzp3?/^6#.1k* ^X s`4M]=ƈ9ȋ EVAvg/*FfG[ kZ_JK u{lM.` / OeheZX~]yb ҘΰgR fqggdqߝK*| rr)uWjQ 3Ve#sj?nv!3kZ}Ws4hn86[U/(՛N Ry J)tnb[2E)wRlfit  J "h`j0<ߗ3+k#@ d޼2` o1A9Xj`$,D1XF:6WY-v#wnwXzed3^{g(J55jئmXO0QƚPRWajT_B_?_đ/bX`/(kk8#&~W_? ȋ"-\RM܍a(:(ל\ $fewLB ’zW`*#o,GYV9Ĥ$.# .(3S("%Ib3fh^;_ QeZ[`N8rkd/ N6!w`>>6֟)CǷFE,泰sѸc95u&mFiЁHb<ro1[5zDZG˙]a-EIAi`?Y?cƿ,S%g(*9čE0B{E\@icQ &d>~Nrl/_N(iohuT6_+\Mě= :DQE?U1 g㨵#؉rlXM4Ҝnm!w>gb֋yvYۢ|VdLVD$n"ϳ%)&78V( t#]S~zϟs0(V6A,ڼY@T!+Oùv/d4q{0l|; KV5ja2kQ- TI}&by^ƌ,^P)vMR Sj^&JiFV?u]hQ=)`۰1lSK:^63*a=YֻA{\t\'u}֮i (,lI,RHT9Aއc4pEQ(:dϘy̺Fyr){yBdn=kYu< Y9X/lFJfp*VMMyA>\ 1 `0U6&%gbeB:{ljո{4wf`n.V 6$ s6b5[)yxgbĵy=WY6+2(Gh=T4c~t_^ h?d?ԐxRfuW4]y_?33rڀ USˢk "<hUZ55,}/;r?kPL2.σb V,dvMNsj K=֚jY1N\kgX_1>wmSpxjDf9ܦUKgCO@6qH2LT `M,ROj5 dwbC(:y _ ^ )EScgdB8FB6 } 1ȱF)]faDɚ IDATCˤ2!E:n f3A#lqFasTbP9aaWfzPZo2>r"rEFZm׌u%$EIUj4ǵd\: @Lge_2fE%Eb30iR<& F$J+Qv}uth)ݧhЃҸ5}&p8@L4o6Rf,W3hcۊRUywPƑGJ s5QW_dF>%jW3r#c}S%S0YZ#V*^ *>$PNyZ<σoF|yM *~qjR4!elxg=L)N4T!J9֏njGM clNHHh 26$2~" H(j}< N xLVּS/@kya k1_m+jNZ^B=Bǟ]X 5v{DaبHzG\na0=`{ }8sxkeJAfzBǨ*G‰f5.t^kC~?UXVX\֋ nʆbZS$9&4Q) R{"^G>xBox<}!){^: v B#n_ 5EK g"YuƧb5&@c/X SrV""3l{W >a٧(ȆM Q y]Icvdhછf. VL{c);>Y0@Rɯww}8)3UGtYCQa"Sn1n 2ܫūe1=5Nhp)LTeI߼@ bzy`(b0䰗QICRlih4 |{]˰vZQ?2yEdNaf!;&?ҐBc[3%Y2GNȤ8 Hi^lHO<0C>z*M35B[a@p-~%A!d tV;PZz{_(G0X}6JtDZG^'hDi][L4Gbl%*{׸94=U*^ &jBX^UY@Z1jVcNbDXhIz/D"/~}kK5\f=P7k6ًa6Ǥ4`7 Pc/HU:Tw<;|]Ϙ+2 '/H/^B49r?+X&=g96# f\YYO>v Y(@wO>*fckѤ2]ۯA Y.1VT0k-C>]%:az>OAQSq+ӟF,.-Й4ekYGCN2a@+PtĆeAUz?!DxNJI} d5֜1Kbq@<@$ɅKT ΘhWf064c׃Q:w"1"4D&>vL<[ "y\6^S{ڸ1a):iv< `TQ;(cfL3fg2 ׅæ~{LSXUK=JoOO퓰X R e l[߳4fQTa$92 gu6sG^x7y#(Bq.dW-}#\/fgKd)b| @"9J/$g k[cSC'HeL/P xZ4o?'cP۽| T:7u?c2,c%CKpw<\rvT(@\j/9"'(}uNgXXghv ,p^M 8D(E$}]U>"Msf^Rfb)ir*hȷ< X\@0c< XY7Ģ H!*6RCHJ* g/&JRo?AL'7\)2l]#XTrn>8Izt(,QXM2Y})_UM 6]~(OS1W/l.Q2#Gl勿;`fٮQbbPMQG%5O59ײZUu6sckkPF 6yuʕsT6 !uU\ NaM%spO R1n;q6Kx$|.1e&=_׃AF&J[gB%YRQUrDb}|ۨu.` Pm%N kk_'͚ JQa`J5Qjz<02dd_tw`'u96f`OfGeM*pcȲɓӑsL~`i?##GT&.ɐs'u01Z2L-أoL|ZFpyt0\4^i1OCeV&W]x'=i׸g)s,”THX ]:j`g8gQ%%=pX22e*G!g:LO2B0Rf RMRSF[eᔱc-:Ng!G㌴(4 :Y\h0r2PHLRE2M"W3wϦ1.\t8*#<!#;p`%LM=0j棐ށ_צZ8iB؈^TJ>Y=:i.W3 H@sXYڡeV2!jU;0|D)4 @p }DkG ׊ /Ql̜ bz^;%.H@W >KHqYȒ@߫,I^grw!UZ{ rC:I㥧dnUL%"85BbӟIV G z2 Y:4V'?Ta}X6Vb'hzPy K҂30 O1HwÙ2^*Bn 0D :pS4y;F3=?ۓHȧXNL71?! fI, NbF#fBXusFChi4oRA1DڄB x sXTtqJaDBn)N8pSj *h~L+${odAt;\+0Eyۘ%\ŌT }:JGŁUkce ,@ <]kYAat( KCT6BҞ;!61޼sWqn%Tǫɾbg.A L7[Re܍gv:8T$?o*OW>#|͢hJY\h@҈r tw.LqMY{[Z 7֑hWgO21!QKp7Ix?#NQJ-^lF><8pϴƒ>f=R xWE^w((2ԸY"2F, 5A<{=rd:NK-RVl{mz r{\9*}ĚDA0 ɰ^EX -3{$O!Gﳈq U5Mb?q֜6*;D)p{t辇ȲY5hjJ. (cREꧺQaX_Ϥyn+ {2lM3a<|D_?E I~^d>ge0SWAY=WO-D~Q""#Qps'0tMKv-)Mp"l&&)U(s)I,vPg*6 [ᾞE*fV;tg޿-!f>0cIUAȏJp)j(ct`]GZppl쀻QM3qkς쉔 um0Vٛh@Gx&)j&f&VgD"ɔ²ڈy)P²0CK7I}=ӞfuCPt9 - V,{/ShC;؂a)Ƞ0hI P} @~FU9@ s"K75 by&đnl~ę]tS+D&+ eDHGտS$U=,"]``_^2GgN c-`c2_8OS @uq&5F58B3p 4 Nhk{8Hw)y˒`_/QO>}kbPuۋs_Nt A ě-[oD؈ vٽ CD S6q$Er¨gV8Xi).g|D@cѢZS `}dcib‡ڸnxXV kHb> ғQ`ł6*u _"2&P mXjM"k 8=-N̈́ody8#&0/d;r{Xf;uF, \%( 2m#lV1m&2\GC0:2S#UjIk8f09r'漳6MEiĬ!Ow0UexܽdP$$r+YY-v]٠j nsL0Mճj*96 )d+)(@<* ͑韩cx>CKU6j^hN >"#b .RSxF09mF3Hmcc6,MFW<%&q}aVP54ׂzGT%T@pOWab uEZ0hm.leVSrjˑ%gM)k*#9h1@GpR>IC!ҬH\wc &$LCjʱ/pg|a>Bz=YZ/$P@[PA|zWn4ELx} jF q"_D F'$V'r81: `}_HVi zfg|@D(EB;H[NğnXa܌6 KRG)3=P95,a+ lcL0*.?@OQѣo2h;ej کe1j&{^M_*$%"XKu4~3^O'xiCy d +i°Nڹwl{[ ϞH?뛟+U ү^<\eA,{,4¬u[j螃AScvC/>⚓t@G0r 4vYlۖ X[-Hf5w++P~zQpE4+kD#>i"06m,P.\d3Ln%B44\E0r YEC2:s:Fl (RL&̀ @o; OqJ)}㼿ʉuig8h7S]9f*VXxmNǺ!XQl5kt{kڈl$ `&<68i6՚mqT>p{$s*:ENjd+VH#U_ U_&P~)Ȳ#t=I\8rU68ĶܞvIl]Aќ)Ʋe`LW#>K`L7%veԤb00 %dYo[$g.e|^N IDATlJxf&"(Y-#Yr#{YR-mh o[KQ%Ma{RaXC4K F tx x"˴ejB6YFy0IqnW'&bt/uB;Z>3?ޔiUrmF&aYEm%sA;ls֘M Lj pS^MdXki#c}2,l߿sθJyC5G0K4Gf 7c 5k|Fr/"H9ؽɘxR8r0Jo+^ͿhJVo MeuV,=ىK}̻P^>뛟~do4g%TՆ_XȂrvb/@Oq\/Q~6.͵5_fy&☻׊:@NEG"{Mƽ8ĩvq#aؚ Ϟ,sm]πR8kPU@XLfP7q߇ `y/-X- P <p)"r X֬Us=5C  \mN')cLnOT*Xމ,~|PL Ðơ`W2I] ܤ4< ߍJCݣr/.<pݸyXs({RB7< d'hGazc'9nݳ &50! K\k7E3ks\t9ZFZv @)o%^ )L[O؀{>%zx3H'&!ĸ$!AύzۙJ]3bPs-Ô>f_W `Q-g_*g}9;jg2 sWaIbmrc\I &akliџP16pP /0о1ͺIrVD!D)4yk͊\d %SM_ |DI0vku#&a[8+a]"FtIakC̱(XIlRP׾KlP$CNnMm'/ZTJK;\}̌Y`x@[lv ,$k <Ū ?3F_d&"wXsXǥtbӼ&jJb9 R Gp5ic^/)祥A3u)2RQÞa<L߻J;8l8e>#9c)[}gKdO`rQiS 8" bw=\Fؚ M(#>39sHd$vx!7nل&hX~5;QEBQQ  !3cUE*DѲ tD I2C=ѼQ̶cޔAn@EHUy&x'+Q, 4Dߕ: j6 ,m(F˳5kHJmKGhɗ{ ,#ix/o[dfuXìks1 =ta+.!ejo93W9Ȍ{w |J  )y WŦfb$(E_YRZҪ%vU~R{Ƌ~IXKӆ2akQtP@^E7h1Ц0XgKQ|цb4L Pݣzdʔ͛o %hQKdS 3fy*f{&ۮvC0ayϠb8UD$hT'["I]T)6ׁho^?R0& An|ZeHykBii 8*Sicsu bw4c#g`"6$CA 7:+r7fL n̯Ze6?smb}z3uXGI}|VhA (1wtqNw3=WNG]6~koy`z\'BaYވ֬AL~{܇^ezmw-ۋemZ-Ǐy}UF-6׷1̠?K ųuV1ߎ6'X_VZ{ai{Gp2u&Y_ u'*5:QKW]'Z3LX.Xd5r~Xm%u)^sLw-^,fc׹lrGl0> 茑t {jBHVgnʀKA$pv$i J=U$AW_"vZaYQ`#dg2I.x,w;fsFfتlF^g6)Qxʇen`#8=uo.G3krFV𬲃gC-MóbnMDjC ?#rZ3WumlVol2%X;?\nFQ!`FH3,#S/cgǵq ]?۟iBX`cݧ{<0(ɪ^b 5[~Kg 1d q>nN5+ :vjkKR $S 2܀MF Sl-4I&YSHQ?}=̞@Hj?$Sm{f&:$3'k_zn{Wd ZNV3qhXv·JGBZPE)B3ve@#y1`^0ɟŻrz=36n|#{OIw_LW`}w|6qepy/#d yݍ+w^ NJ,yʢyal)QB&c(8n#!Bm<'`wP/tk OlZ,o%XY+\quADV@N)b{𪕛d^Gɫ;r-23`~h߼rXL*l#{,*x~>1@ 0MK^6UK[!ʱS@uX(W=kqX}F XZV={/PJ 䊕'qZ} x; )bx4<("E?u:4x9uS.F}~G8I5u "쉦2U2q%{Hz]z `A=~j5yH]!ūo}&ңW H ayÂ11 !JrOql6ݎDL >6M" 2K0O]龔HX|74<~,"M2Y0M >NgR&JL =虤Dtc %igA P֏󋕑)-*y7 e b&\iolG/wvc0Tf?al`wJ%PYL7{2h܍Zgݬ):,dvVyeA 5AnKrcRg&\8 5| s&wpTOg~ۛ|M[IYam-\W}߇mF5aXڎhejekqCs)@*{Sέ1bwK&v:7EMꓱzff|mzRVR1K<>4{7SVm:(Υm`+嵵DF(&mWHi8y# t;$ 1ȭVM07]SsM.u Ƌ[MݐeUWuوMll. nZr+:pxv55_BM`fBJCp4}9n楶S B{McHa *Vz}/w2Q6ʗ' C .~.G`}Xr^BՆ~]ET- 䐾#O)؀ Y,j56hzcv T+svhOe1M^X^b&c#cʌ)Ed?M[&~T2ybX3K#U7`w7Xݦy<4FLi⾀bh+2y=gNޫɍ1E-:s$, x,e4aKsݪS}95|֎w"~p<[) V6F;0c&hoI#o ͪy9)@xg^cQIE-7W Fjꭟ|~q*ARx8;Ϗ: aw2<)>h&BsC ܫw@߻3OB6uO^sG^spt}5!5NJ-\ f;\hnT1BH#\xG6TB UZ5A 2h HK^yTdm$,&1P߸6Ѐ]{l2AW :xKy@>}D>1T_KTH`yjS\ W`;^_FWKsRۡG>7oZ /-f &6ީ.e f9Ԏ֍2tgJӚb-֗c5JP"h3ehB)$rO7uR"^Ia"w9 gQAꢔ#NbUxjьa/]|"%O"m({Q9-1!櫻):/MHt@ou|SyJ\3we dG1e̐6枵l|U?}|sN!s7-Y'gv?;+hE TėTl7FH|&mWڰL&bz YKe >XvTqU;9y<.k}Y4ǣqMK39мYt|/<]ȭ|@ 1֮5:CΩu}[OMBsD)avFb W؈>?R4Պk[b/fMωҿPd(ַa{ y” q.\S< YƄsj V1Fj/`&qL#<'kK3尟uqীQhbGk^3fKk"㳗AӞs|#"J3i~R~tisGX; PИk ?nJ|nޟ7м嚶bA"<#g:9ɪ:liWr+:tUEȇę@6O)W+Dݴ@ǂT:Q 7 _y{L%y\дpE~hTc1/됽(ĝdQ I ɚ#ˉWVRClN<#Y[?}Eyu Qj eaJu]66P'n(V0\%T;D6/B63~:dA x|^3k:OCz])F*ɱCt%<}_P5O9Y15T6~{]7=i͓5- {'W4ik1ˌD]SF f 4#b+Zr*~rCQl) MCHz |hu8=03wo<#?Ӆ5L1=?/֊YjCƊ`0yyZDf6-:۸Yݿ2M F3>5ʺ4 0d_\'ZakCcۄKo 8i|IkN&׿ơ`Z7IOGrB8Y1>rbzG|DiG1L!t!xm.cT?d!/G]OH"7, m IDAT)Yc5̑uM8 OW=AȒ#azOL)D`,SMV  A|ᤁr["WHqqo q˽,({EDrQp 9)lפŸ_2ȇ5UO&->jyF#z,|_FVpYk v'`fJ"d5yQ9K'j=9t o}`ioL$!z_#;)j*`OW|ׯ5lN/xt=ք]<:!WvScjt1gjpNe$>wmF߲tyG MyLAB 2pgyA~tGc zm8LI%qw@xDH>>nbxzJQ&)]Ťo1TH?gu-A qzn>A#l?#0y>n FLdi[OZJ#GG7$AVP퐩\@9^ wp pLǦa}UWdm>C" 5CwP{8eԩZ}M_NW0s;f @W5DUXߛne6M((@@AHEhi0ح%Deq܆+y Lh~YZm KQB4{b֦vͯM٬*(@ʺw qx -_ f;6ֆMM(xȝ Z<@2rc4^A`hGȨJDxyQrИ"q33ڍ55L{Fز00_ike{S-|mnPJ,{5j&Ȣe,'RRΤ16 Rѕ<;-J#XJ6|X]o {mHtIDt{,Tޯ *^G"J~'h5Z߫P-?gûT _s><8$H۬vvdMx_Zc` 9E0$Pī.J+sSkFQsz*S`Z F& |ԶϤ5âd ({pXfusvs{&M.+4yٝc-KuORBD @S3iq=ou ~"{٪5OaώBI-+E(ǐWʠLTyФ-VgP2FhkM+(p,"Gfˑ^9ćXRnb0(^_>;pRݢLaGGJͷk \#kMP 9(R㌓fb}(!AM!~P%}$bW$4@2:M:(Tq3;2OYN oZ#퀏#>ŎVS9Q$idu-iqM2Vgk\, NeJu T8Mǫ-L!-gxtIY)MZ柦:njx %A?DXv )Fגt)RP;Q7q WHx㦈a-m.j88έ JY|}E-Lo $쟣^t0HMs4Y?FЙha3BͲBl#En%lZ+B:I@|O8nN4$MwE ^z$X0p*@JdGiuhbF$cR=Hxp孏Ys;v٩UlSS>_|~}5O~<;%n }<4`8jbSxE00u0M&B.41Pj )dnsmZ"CX!\ UGParpG@ '>^dé%`Z7Us%)`GGi 0)"WԿM3CgS5 Ё{R#IsslZ{~Nӎ3 hQ\ه 5vHXWYĶQPeF!;,A_ G@# _VyꀜW)= B! B4JĴJAdbzYK{O~sG^MA-ĐaJr}G"+ո".12bߓaBXY6xŀ1aʨlR@1s,M$9(E]|;^M=?SW8'3HdBuw /J@o5Aذ3 +ץ+h1'Μ߾/= I0}3BŊ;(ؒ T`nI&I4R 07$Z'u2P*w1˴ ;LOS i*R"oZpF@@qF],N+"eL +R|93u0 %{Ж %cϜ1}@c"oIiD}M:y+9L/%%W)0oء PZB{RrPg+M@S c&#%M3i 57k᥃(k3&& R{6Rc0@ W=Qosdۜ[s58R[{~LPG`9 opCG' HxaRZ0!q+Eߊn!,Ž(}?Eg& ࢚Q cz$ag.qsMQd9fmP|"xP ,!Gsҳ9e?31O!?H]buk*aQ5;##{cH#Tᓫ5>GٙzHP3K3{.i( >'SSaJM O[Tl!Xզ{lnZ>f{ Mvk<]|#c LQ SetF%z͝1=ft #K?9)TwRywSqf}}9˓>o7> yD{r bJKE61w"gT-NJRJ(!P-{4UMK0ڬ/za"u]ɉ"L cyKZ}@;}Y g X}f1nM `jjFQQ( HwJL44V #`D 0y\ g #KP1@/c j`2aN_9s\N#LC{s蟥MWVerT6`#3Y̩e$#ר* c+=FfHSfoơa$odO?0;zXMEލ=DA, &Ψ] ΢ pBW_ͨ3XHVtlSb`և3SG~|[Bȶ 'e[.pPCISsd n5Nevm1!&YxB0h7@e@!  j7Lӆ?8;<>ź`8#hwgޟ RiϘ/W6mBd,& $`w#c/S͈ʁգ[)U*& V$5~џ{{VIG# #rTū_ͷ?gX)_ɜ 5㪚.71SE-,،1ZyiL X2:6YPmJ!i7!AxǡOBQxza.Š9Ű%8xxՠvNa -^ 3 >ZX&V4ni=~ӤהHd}-5u:?QQ%0-6=ILjiizCTf^_Atɉjf)ӸRd؟'jL8:,~]&E"}+tOW_"ӄɂ-pu#G+"Nx|_}W_H7?9) vmoQl^/jjC-g٢P_hq1˨[wJU iLIGt ` (MIT9a̳VލdX^XT+=a¦`kg4 S;>vޠK7{  \Ϗ 1@9:H˲{ '_c$GIoe[b QEbS4!؊P,EjVZu\KQzoSR2ƕ&ӞZp}[.1$Hlrԃ =qX!FY!?7IT:CQHq5W)jб-5y&6fkqr%l3fPNuQ&S鋊=R7 r)g Ӏ25Lxa6 Cii kepɝoKMCO<,(Vٍoj׵2HR.x^S:2S4>`߱Y"9@CBҕs pkV 0րQvJ4 1cM"ʟ(t1xLd{4340 !q5 Z}~cdUYF7>Go%^^`djgQQʪ@6۸\PgBx%vR߬zNpm굘ȟ)ڄߋhw ̈QVRp"yk_MP&X,%Z( \)vaB֣ (ς֘Z=}vHvM ruCҌױ?ITwddt)>e/F8ɂai=zj6t<ڋBÇ^o/?ZUP>T(-^mB;rd ʬli{c l`4‡⢘)j]oL,9{JzY֑}Tg)i-T7К٪)x9?c&HYV&Ó1= [Vh`nbȚ-Y:j#%xYƱ뱚[0ff= =XZA\Dc.R gfɊ./mN){lxm4 &7z,2ByWʶ=}9$[P6{V<}#e-ޭ?s;!; 8j*z<ԏ(#ST!:}ӇIυe]?漕 u\ArFtBPԚ8UI(uu;ڃe\+Z {8ku~{ {|+Z\o,jy{suP~LJ~SSjh_h$@Wpo.xEU tcmIS }'x'4Xcrc? .ܾa)1d̂N[ w/ ߩŒ)H=u-'b7^ϷV1 ]n&.;S4ŷX;ߋp|ax"e#C;,ⲎX(`u]hޚh|xmd,(neDGO{CH,?`6 9IuO pJQV{.].> 8*F[^ŋՀsZjl\]eN~\jD+`86oޣw=;o?Й˴l5t91]E  ֻiDhce|&>[s!k[ކ5(X_&w8;m,}ޏ~WfN iJ|z^9kQ&e^wAVL;bM 2ŋˀ^1Rn2eXWk<*#1ͭh't׵wDɮosm8Zq֏kmqRb0ٖze-$wϳfa9o>a.wr~oga.E-w,BŒ:޽M%:7PWB&=^M9lg}gr)YЎ/>ϯ(.BC{Ep/XyZX(r1ϓy'K@èU?F`lXkޮ#,h_=&emZ`Jk,^Ժ%;O˹Ǚ>9t 7Xl-/fK n(^wۍ ٲ y!:Û?+uKu-/A`k1T R^\wCj9Ǫ }oֹuum׏RϾ?xE wۏrT&v8.=HDKAV#= U&m@^6Ӳoǝ*xv1.h,KkQ+pg9^"NfGc`?n[pWԕ(D@`f 1|6ʂ%ɺBB\K.x8cy.Iԩ.)y1_f' ,|kwkXȲ.wR.e^Y|& [ljjBX$fkatZ_\ȝ񳤤5;[n ~g) $#}e^q5bk.B F$Gݡ3\Z0 [SJܽ:ɉ[q,5 M5\ "۵̛[}XI_@EʈU./ IDATVhh#F/l, !8ʰĜ̚C 1-Yjhv&V V#n?LQEA熹h:Pd1# 5Y*1xtGg)ST_6zS]faypWOy4qG7Y~|8-p{V1 VLڪ$+PFް|cgk*c! P\+΢h$X'pY?foXbkgh7ռx2:mݶ?V]bHNV Z]8_>x$ӉwҼ#1ג_΢t.n&*l?\\ җ)k7xM^Z[r۸EP W:󾇠17@:C >]C ,c@Q '>H:ӂzDs},&(/@}IBm?gWul%P<"(/bG7B>7vm*r E7"xC-5~h_s 7vF.k>*+ $/5e۹_ӲLfAڱZwIrS!roy|8Qim 3wfظu N3f|4 ery{Ri33 r  r 's]ŴtK%9n w;35j*Űqd0Ȭ&)uFD֩ʟw73 gM2|gЮ;pxSx檥S% 9$.@<=CO؟QY`l6G^[5䋙``8{ͨ)2a1ȡ~VTE3+D/z;Tt2rNg|[618%9[g0jsH~9Np5P|3^ EZcS vl DxbQivMxӐo'97 ;6Y-8$WS9MUut5,F4ǾI)nAcHs~k’N.WAmsm-ERs,l'~BV"C  XAŏØ@DMJԾBƵ5gBp45A+$~ l;rSNu}8CLEז QX0 懡lFwQo1kY@kfsV<j^w"hܰFKA4ytIPs*j}S@Sw1#sB8vDס7v vQbZqν1䌬0:E+)_HХ,YT%KC@.p8JkӘi$Ċdcq5ܻ;q'l ST 9{7u]NEY6ZZ@Dvzd;0Z1Y4chE4y޼uY."7ӄFZ4ZǍȏ!lR'%tt)&eSgO,$&qO{2E&.yF=0G3Eih<1vw#> eTk at̳} A*;Jr^%Y'00t0s4^:o5o:̧ǵ^=Jʼ][ l>dzMcԚxW\_D#/VB\.'=ԓ44~C5qM*L,4 iԠ:&u_B} {k2J]yd=E,%kl哸X3=ޟ5|vmN~|L4`nQ<)?4[9xFܜNK?2Z]3G͔H\-> m14ڻS3ug KtX4v%f+~:(;.E?H,{O4sy읊%swxO`R;Ⱥ_ Pa<֣j ћos=? :1޺c&H(]y:qK}4^Ֆ4 2'oN`84檎Y>N(IaV { Z -/i,Z\5E(*, |}umpKyyON^:PnM0n\!%/3Ÿoݯ/b٨/|׍9l#{ѡ˫w(EO'$SKQCdmTAE"uqHL8:VyyU#@ )ۭR]$Ira]_ ѼoT勑c S134~h vJjܛqb3]eƆSp'D#~mr_Y+*"O'0[h W jB\Y~5Gg|޿^=s=zc^0_Όr M!e22ާsi0ݘ#pp܊8 ^ %1ipr7Jf1hg6nITCr)9sPsL}^SbXs15!Vi#|=עeRY,'F"}5U1Gf6jy֜t"b1F+MxY_L^ _jwrIjXOq]3I,Od]LSO(i<Ⱦ O4GSŠr^d):mŤmB;|-s@Yۂ֮HΏ'sGlV a|tpd+73~ -I5)5  ;'et8 CCk`1il$tx(N1~l )kB'ql WҘ^j#|Ҟ_CZ3ĚA j7TùNG6clo(+Cәa|`-BZDZ=.Oo%>Ê)S=8Ĵz~Y@֊FV-;qjF g,~DAVv yv{s6m>jQo&TZg"vv'HŦCZCs9c s\en&*`YyW5&&{PBUױD~F#> L4AGߢu>cwm=qaA`xэT:Հ@5F~nοzYƦq^u8AhGRIZ q\r"! '> RV[׻& ,Z1N3|ԮSxH%'/^0w+.5}o\quJfeaEMޓCAM, @N#$Ó ]GMkv2绽B{.hhaq)iNh&}5-rVjl[&Nפ`0(>eb%qƮUS` N Ɩ%`*œgj\s3C#;r~sx:'9蒼)1J?1(ZEִwNrQD׸ TmP~0ܮQg\Y`O%KR YϢlL/µb@C:F{1NOd?4e`pܹAsA@ uO,Tt]HRw IDAT=Ow| 8T $[5@18Kj9@xC̈́pO@÷Ec9vqW e]Z 3a XK '9~8-\!}gVZT.L,e|ҭKB4c9˸={٣Y9Rm߹; L h$yK+aĂp ub8,{rTg4K?\? Yґ;Zv9V+9IQhw^-/=a[MV90|0BTd%~;[ Z*=X p`il4D0I=U_b2 c0v4JsTWG170?ؚ:}1o `&~wn @|_ޭ*-c.HeCχ(v\6Mup8'4<8jzMkru͵NdM] dcLR{g~!CϞ-}}0,S=ØI/"nyM)40ʊc'ECn:`-P%o2Z݁a5,ʳFvs'廐ӑvfoPncӵ[Z#/m~E"1DE G ЯO~?~~o[!\YѼgjb*Nq#7jX \g& 9 YCk=R4_9S rL^s-HH&Ê_xglbT76yQΊ ;/a507M& >™PUJn8Ȭ©S~s\1ɡ.8䜬AC˳S܋@YI~lLϫʈIUA7udjb\P,wi|XTd!g6`Ȓ~l[4'SrB6Ve^vZemP.D;DHw`$NA(8>#BTw{{@>siq.e9%u\.pshSf*:s,Ehx2 !M_dgi2Ɋ2\Ifm:K"u+LL fYa|NK`(w8gOAaj..@FVոzqP۝Z>s=|m?:Jg5AfC\ӘIf/T'!#|l3^DE8'A^-vzt9Yug`x5UTCl g 6eB-\^)^6,s7H5) ulQz5Ncj{f$@ pu"ɜَu",f QzO8{iE :XRc7j}Yn3 pg gAl>hdzc}hlaR 2Kp k)sA=l;H,Oz9}Bb&5<_BSCZ8wXPןrgHox `tyt(MqFc](A|:]. (gahL?1 9!&݉-4f Ve#ae#PՑbNkF#6Z%\v 3v'lRdd37b/g:e?C4W֟=4whq:sSTqӁIJW!g\Īf+9؍-Uo$qY7 !60Ȏ$HSS?7t0ǼQSų9[5`nD B ]_ Fs C7 +5C̈C 8 0Cwq@hr`@qBIзkiݬpeS>I5#S4#:YY9:fO3pɢ;9dҬCoؑ2 )v6yeUЙZz*Ixc׋{L7@_.'iN,sZ Dٙt(qt8:iKXWA%mad6(%< Q9p}{͘ZB?qЍg,k0 # ZL#3m_f0ȵg{hdzL\u8i 8w #hױGFu`a5|7uoQG-jx9ˋ4y殍m{z纀)Йɀ4`fvnG]c ĉā!ҀYiHk|1T.R(oLI D>,zmA9d QAJaXW@A~w/? s[Ǥ)fSι{Ԣ>w u`8>r;a`iL,5>Њ9csݺt"RNݞ9NK9ꐐWQ TFۮc; Ps\ VFdU @;c V:cZb;wi5$Y׻a@'zo/+]ZH f=ƚ.ݢhŒ#,)lݞ1sL-b`!5m %I++|5Y&:@ Y*P%* n+Oik}7Mlҟ\#rv# L(KW?I0$Z`q`UDWmAo(#y80k ܨyvUD]QE5YM^2Uq?##&l[007GmsqXdfgRQψvJ;d0nFsNOW ?F ԑTsX/撨 063} ƒ):jꊫ4 +0w\+F@+@J~ex u3 K0(TtzN4ʆ`J\MC-I_;j[4m*q1L/rV.Ms9[Cg%ӾM\!tҩw&Z|?&$l*'|Lce%vZ{Nюk}ha]=s=-UG {PF%ȯKw,qZe.,rUqt?Q\1glh=Ax53M@\hKvm5ۣ\X~TD?]/?˳ќ.{KSZFgndD(9s$` պ& (ͧ#5B:n^[jͪcwvbQn>{F hȢW81ȶ8j41L/8/7j6:;o <U6i4ۅF]S ݮ9BDorU{`hp}1Xn vHL*V5CMqhZl.16Ҽ_2rσdG/1OF9-ߐa:W9{Y~uB:ǹߤlX>C?vœZ"(X_n06X]P̬4UE)2` J#W_ɖu͹%zEF%k](zE*C-A$e.6i-L(tЕ*b, ik ^e h{:X ;zbg3"|lDp'@ 00zzO ~Ps2ܹa m|eB궮yHF9pE){z,n;-|1'㐀ؘ^HyEr ;ǓZcP Aoziޒ#=)* Q@k=q&HՏ|u%F"@Bx5@ɫ57d'Hs*Sz߳$݉såVj,|Cg yb*_ECK&-(==HU!C0&4O|B] uY]:jQ~VA=E&m֖J`FOXk/HFo{jUW}]TYZH-=Ww[;AA* x&%acb@ukc}FR;!x>OZN ,fu \p} ,DЩ\A&v'=]v$I^=s=W:7>DwJuSU +Gpf#w_-AB_4.Jb')ő\⥥|1  W%(@7?J2D!55+DŌwKnoP9mJJZ*-WD*I,B:8Q/v7Ԩ *X99Z4fS %9`u^ߗ6hul.y ۷"E{Pj79V39m7sD戜nmJj LWo@-:jo}ZD.Jl^ P7t#v#mZ_}tɁk^x- 4.*#.E Өd^~()\tTѲn)뗙&G7t-jx8}1iTS34u 5$~$(mRJi&+ k<4yM_Q맺XU)ր D&B(@ eo3<􂽳KgHy[RB^i,h l.} o|tS̆fpUئ&6& ^H`eXtL7Zf#t,*Ε`fԅ)󢑦4GXpvK[lݾ:4Z0t}+a Lmn^IdJm:n^аu'Ӓh$Rakn$(l64@ZE+CXBk[@Gu=!Vђ_9 sQau8 |z_:l 8C +vk-`~uVb{;I?Rm`2Y6ӼUa2YDaYu`a~iE6K$J], XQ$T &۷gŨ1 FW-auFWr Lc9UDQZlTw2?ҭ:f(Y.˽*O~眜\YDϞ0 M%(0EmH o&Ng$ٗZnvAGgcE] *m7ؽn.SN+f"j+eTAT4)]`{K\NU jS(Xka2V0bXC iL<Ǿ#Jp=X f`r=i)(㕀 !WAa:Pk uY]2.^1%&Pem3ƮovVQY}Z\EGn56W%⛒,Τ:5CQU Nz#IQr&EX=]\bz(5K6s!wW* t'܌rS0@WKF.X3@.hbd1\/[OlnQw3$*`ӂ=V2AemJ" 8Ŝ2t#'mI2Te[9eZ"4w`.}OA IDAT{h&)4GЁh6^bʄx+ _5\ZoΫ$4*L tZe7TiN{!1]+ ]p'm~K(B)،ɂNT`5 a8y 1c&q)׺iT唓56#٠jr~N(vl5!LE["6S7KSŖ΢M3Bj9a^9ws#^ , q3CEۅP=}u.\_()"݋R-l. =PVt2+KvV"X(Es}XQ-&+Vq?sthaSф51 l$ki$=voc<#IƼr*4uZcSбxX+E@F;ѺP2Lhúj1x$@`0Y<]muu@u`,{7z€[h`VU9% F6Rgࡂk";WX:vZ[W:I4w) {2f(O[PnQJtG(b/s=sK,‹-M}n:Ul Y,_u+'q Eä8S`]k.^c{OvRcj0BJXiQ7LT9j8*Q:DWs&'D'udvkWg0^(Phe(B )lбeHkXrkV<ɀʅК6k!9"$L%'ĥ}WF2u_LH0YJAnKʕ{fBs!؜+UX WwTm1i=% jR"78)Y}bDiab`kZqODU5ۧ0cz*8LJPQյVb")Dw:Z!!uMrSnMzJx9 mP2is6 r_B_bOpP#:g& W"Zc`Un&UR#M@ c%/!G]R=(A tlU zkEx7z@RTi[blԟ(àS "8Ɨ7*.\Ar쭏l"7T欨t/Y](ӢV:cl.bmuNk@:xj=Pj1J1iGS>ka{S4`ntV[ 3A2)E^4ȡ=b') mUp-P>Ec?WA\un`(* ZSbzJ#Ͷ:_58Q"L NUXOk4\GuҏiKʺlCkĪ1Oq V%Htԓ (:`0DJ׼=|*\hdcŨ-y\sSlP1N5n̈́k6Y[n#:-Ws(/+4Od\ٶӪզX`S/Xz)E*Y$yil<=CBuڨ3 ptYԆr+hܮ(hֶG(h:Rz>l,>>&MQV\%bA5pդ1nŠd"=| 0E<үld*YefbZI;zX- R!H;A0 EW̽HTS^25(Z:L ^㦤GtT C43JOg9 -S01x}=׳ Jҍ u\ 0hPSJv>6, Yn;W\?q`b(sra Hظ4*+k-,sSVjt9(8)Yf_#fQˡk'R-C*/CX9E3VE(dCcӄ=3r0xEUexuhvkhΑ-Z4Lƪl "(SM&a?S@3۔Gr)aD6Q"3cxLs@/֤\qj}+m9 [ouC& tZ5'MA u09s}WZ>6 {J׿H FlǤѡII$w8w4GUUߵXvt|U,pZե Eά^a#NwUdTb¢2@ejا%{r:{kX B-T>2'Ci4@Ib[A3) N(>r/{M:⪣"@RЬ3Vv Vz2ijqIw:HF-V' SXIra,+r1sPh\7XҨfmMՊ Q` ѻV;e\*.8[.VpF ~aI +*6Ѳ~Q?KX`|ڟ빞_ vƉJJI#a;6.U ;{ ˔9@`:"l.sSȎQ2*,k)"*PL[.%ny:k_di7"ǜV:(ִ܍a;SU rUe[`I4E5cIeƟhxdG_~-%)]/ʢ:B!Xe TI.5#izd^̍ n?u9M]1bcum<x#!Č%z{EƧb|tȾ_L]P !@C&8z r%sS|a,y@@-S>ܪ^\Bd/Scd#qnKOxYZ<<6lMT긡 u39/rhAKUuYT,}KF#%PaP­wbՌ%zpDt *q:ܠ(0_b:Y,5! {NŚD,}H7O@J c[ma``3Q1{Ku& <sagACRcZx! N_W\R i mZޢ#0՝-^!AKIqPQh35,9O \l]gHdRr]T ;!>KᒫkUk plF!'PJH74@Mvns =S]\n7: 27nP-w G!%;,˲ZR0%5M<8s=s~A_U/M M bW]MXc"D~i =}աZYt5fHTkOz^9.<6ֆw̭ѵ6hecA"U^{>:FJ cqdaTCR:"KX+ڬHnI^#0IR ml3!Fy IkX%2@2xg7}c`4]b˽=bIwU _`N3-Q\Jjjud+oG1ukAH8zgmY̢`|LênaS,naCωF+GaC]BWY-TP%2Xd.`ϻ$5*B@j2Ko/r%*@-T 8 Ֆ5u 4f9,̐p'=$I[ o,<30-jfmK? [!]9G ,0P1i#*O4X{͚S*0Ef`'ڮ4RP$dӞso AsbhMAC휿[IG@pR&&O1؄L{o"&}Kױ, pn_깞~ _M4ȤPxy+eRs*ĮٕL(=1 T|e6xa[^X,F)VTMmEn.KvQTsOEO `ޘw>Hך@˙2&4y.Mdm_}W*xJ/"mFpk|*5;'4̈j*~ጛb ;v-u27y\eYaz !ud/*ň'ώ6nloDT`9v ,Dp4kWI=*\L͋X2= `6jTOB=-t3рd4`a_?lƿs v3upUK{|SQ^B#(a$/s:M_+K6>a[Q[-AE6[S= d "JM2{OEtJGS8@Q:mM_YrJpw:Bu˵R#]G6^3c{v9oKƾ:N2yw{kB5$Emdm4\\Ī7SvN2u1]и1!8:ɗJMxS}M{}}AjSYJ5ͨwՏ̿xsbdo?4NOwvࡏ릛I Qϡ˷!sa I>?1x~[Ӽy;,w4$`qKA_ОMorQg7w &o'r} fte_|dmXwoGw]߶3o5g~{|zzyݹ.p|Ȃ sJ;~>),ޖaT[Os]}tywLuo>3/|?i<ި9%+;ܤ$+yQ[Qc-O{j;M: E#P}!n9⫼-ϩ(~c&|鈯>A̾ ߶< ~sx|* cr^moψF,n ߱5r _l=HߖZ=s=s,]:0O?807]>-zILQ76qY1-Ӣ֜MpHN 5' <~0/OAkbS5 >ӽ9<9v& wd.7ggkS Gg<>x] ".s"%<&toVe[U2w>N8 ~!g Wn.8`b"?$IoxxA8gbZ7p>cDg[$fn+˙> oϦA7E4̺ͽ5>7@B#?󪗸*5^q0nyM IDAT\\3Xw.0Xm Czd>7?,`>g4*䞊kաTw7N4*Zk%zǫ⍑]o5na̳vԕ"q6Ӵû2 G^~ݙ`wÏi:X$ ~ׂV7?Vv puk5o{-OBkfs֛",<˓PWp;zN3g/b&lMao9FL o ӻ'8G~!3iҞ y.B"pNu%=ꮿ@ظGt O$:Q]Q}z{-gpȳaM)yC>JLśDuԎy}q@ ӘV"5T$S=vpȷCCJGK»23R7hNQG9.Ɲj~yٳHI[]5T\۝L' |n)sPiyw `OΧiɎ47Е/ML)8+-z rb/8Is֩ЈzO&I"һ2ώ '莄LdCr.OPi@\``4 KݰƤ8ujq$r.q>Ix;9-rb$A0[0pt"bwΤyGS>Vܯ5~%NkZMg#g yt+#к7dM,B_WSƩCB^Nc8 X:+bip6W~/wz`K9t5*;wW\o b{Lkqk*"D8rIsyZ,$85:bh8ݺn, "CCΨ 85rߠ(9O)WgM ހC3=< _Y>\ }eX`NdOys>@;ؐK#ne"ItNFA֗/;ufh;@q55mi 4g[ ٩AZIn6~X`/ul āpT ،G:Jy1cih+uVDԁe660އЁ׍`ǀ7&sQ}'mLЎ2-kѷs-aVC-ū4{QN- go 3yXPMԓu/օBٯX;^X" IdvN)빞Ě8\y^XK:C1/:7/s're"=G--򿗾#knάAs4yyLeN0.8c<Lz4AހѐXr⊚5m\2=s\xhx FS`ְ5lrʦU7qV-3j8Hϓ`$Pa7 h;mOE8ھH`c|?f/ZHxZ˃ ??o5Ah: @z>9!{P^#rH8=rg l(q%;40@Hs0OЁ4$X!Aw *21U?!T rQKϚaOuGhBb+zI97 8͗9 l.bhA7Ae ZQxG=4% 7C(@p|G.}~>Ѷs]u@=,{ ~cFpؒ ^ +y 3diY f6fh- % <cQ6~jl;LӹnI xmtO6e|N:3zFSh}aonsv2!:mؙ4R:v}\\ϥ VoԴt,TBrli9rLRHw?;b姌ND)xI#j<Nh]̯&/q6z!:j!0A~91Y fmt 5Z=⣉XS'.V!+Ssh@W @$kES݋]C&m,}$}"dĊr~ZrNNz>YNG8Q%&/xmӾw 3#.,/as5W>EfZ&dלEW&TΪ<R]*_#H0eŲ<}nV]Wz2 T0(F`\ݿfk| .8[뎬BA&}B/H@zX}i\ y3;Ρ24Þ^2$pM.l%".$ Q&Aؠw ][JϟNk@ּ٢?8kΓϒkQh´ DcUIsk T>d1{ȠwYFrߏs=s=X/M+oq^ =s'T>NoU\~7&TB z(7^g)j;H4m 0իluAٜ\|43vέ <`\ull@a,P< tE}лNB?>yBP& 1q5釩`g+cwY6FhDs9Ǟ;`sVsUJl%G?ќaMrܺ+Rk1o)- MVinX$^J.:`fwE Ա\5@AVi͓j41ZSHpbN#tVJ'Lnh%]B`-xԤT_S `eQG빞ĺ(BHtzYy/ eȐN7?vj fjLS@ (t,G Z1ê/;jC~Diz, ͑ǣ$s ٯPmkzb=7nx';qQW݃Ff] Q@AhRAm(iL;lnՖ؀K9{#Xw CXPR Q!EyZ@WԎq!\͂Ev 15CWtp${6;T@iM ή vm pdb' aca[JK.4"&|P#aDwrAqK+R,|_ PzNV܁RW%KF?W|Ӹپ/f}WEtΤ#x/"W3ς2YZLcFmIH` 2_n*OOlXDP;H?Mjil_36\\ kBSNE6!YE*D/0db͂ 'r9vW1#1‘䅛mE;6 (Cv@i{KC,tNNR=eX7f.4@՘{Fl 950+uBg"\Ǖ fӨROJ@yRԌVGɨH'* +? Ük)PpI,ۓB+S&zA" Tqtwcr 2R (:4)Ydz @ZI#Rd\L&ƫ9H\Mv,z^pV3T}aX]6ۙ 6Ž4z\w tŨj:MWL_wݯF)xэ9#H|ઓud+f¹3ykm כm2-&!;p b5 46jt.:_hb*?+(׳B+SI@*ǝt5СEaDf &DXduӆѬ4NxtH_Age1 AEM<mϯ{:>2]4jn nK4L3>̫zz:+9>sD4ʺ`ױY^E'}J:oɹ@1y3Jm'i9rWcJ!M^J z5(V-)IYm&t Mگ>4 NYNkT[vZ'Yw@e:]Hޘv}4 }ƴj.t +?X`f65 S꺹tQWz hV/@3%k"} 6x0MFVwx=}sE3fpA~ o+f'v\@Hں(zow`u9"z3/T!u/VR-l= EU-UW|ZLeUڈCvbiX 9@'1.`a˗ rTiؿn(ZcF;HCEP_Иd; H ւaLON~*I/G(jPd4f8+cܾ^~ܗ=MgK]T) 4̊Gtּ SjAMok A-kkyeRA+viթ%=SsbzǧVc! zz/*۴A M%R*b Agͼ n*b.6#4'^v) @±K`+a˽@Ms89_h6*z)CXxvjmb6~)F =<WcTY _qmbͱ3UfD|Þ}(*OPzU":&-U4PMP(dJ`N#B6)~WA)(]bMJ;["{C|z@i%6?2CTJ HL[0YmNJk5iNpA:c&NPـ;վ^*#8 4 ?-dLH`&{(NDltDGs[ o,Clhfyi-L0}s 8ƃl6vPi!Z0B$ COg*,XĴC4! ' rM{ )쭌ans찭Tg@bs{Pٔi Y|baX\^f$EQ SfuX:E}M`m2YۤGhkmXa{]֪ ^KYL[K)` f (bczP敚%՘{61&x9GOOSä<:6r;]кLȻ=%o$i#hW16-5~9E\Г6!#~-Eú J6cB6m,0dLI9:S HEN'ؚ:Fgd&L &0NjZ5$D0rQa =ޏU >\(]XrNRf]wRyaOTQp+2Osf4掮arKT#"9W [WUIln1*+IʗZH$hbƬqN:@ %a%$Cg+T"A"?x@ ՒKl䖝0zW,,ԭ#hV1[J2`UpkAm%$gҡ(QFĵC81q߫ĝWs{XT I\Xb>\j&PFZE dʬU/kԴ&3 vC;6u_R`r@9D 29 ]O:*\/U!Ia48e$ʺVm}6̓UuAʠf uC5Z$!2>j;~N#HUIP=xt+jx1?Iȟ2踣VKd@]^(Cf#>ut偘VX g+;a7nU{`^DHRN @vwm81Ѝkg"hsȅ)?"x.:/;2`qPґQT\b*SH81۬RUn j2* th{e ˃Z`dthiPN@>|E PΐEUAxq@r0ܩ-vLh5Xj hA5,S`JO5StIauK!CSo4*)&!"7I@vt'D8`jl*ƅ#CdSs|6YӜ!o 0Zyߝ|Z#̝[I&'#jD[-,V,${Xj_6Zi3ciƆӧ9<#d6^55LԏMLA uI',&+V49M݅gS`027p/.̇2,L;=,ݔ"I!Fu1ܰa A%1F1ة j]D^O*TG)Ȕ*EO uX ̽No"0 'f3k+g¢g]o' hEN+>@nyo% ۗ, :S@[9/sZ {'n91qc<<@j8Jw-fyτIWEKk֔fPL`DEnO-F97hZ7>H MP`oG*%c4#)*%m37s$ l!'m?CA hT+Rhl?S&9)Ǽ9ϋ^Uћg΋\oZ1QvKfs!v)-~(`a._3[Y#,,ᆩ)-6.2qŽzsKw\׬Pan9]׼<3{N)S.Xt%1r]}O ^I=VO 8<6]T$?V)V1,U6%Pt<;.hO [e"Yx$#[?RTKHl > pb6!-XB3N bմmȇd`L1oH& 9d~଼d\H+]4抓z y_lX30?piu}6g7F*09!I1}⓶FCۈ7, + C3 ҥn$Qd(i٤i2aڮ,>l3[@kC++3fowgclIv80wV2xsDjUt|c FؗRcFeZO7FmZEbӵEK֝6Q9ݮ h?:禝]Z)!#F!bz-C MK&7Ҫfam -%׮4ކYݗ-Iv왓P>#G?NOf(|ISE!Y6c8u}$51vg #1#X#8Nt@ \q̄֙jkN\;AC!<ßZ13]. &2 dI;gK[\N!yLL"YV\P31}Ol9NXļ,ň`c;%62)F%rє i-y ~I4CjuK &2;pJGedvkwc1mC.6 VՏ߰IgSwe{DfIZc@h߃S~EK[{فyBvl=.U4q[t n@M3 Tr39i&aG6ׂ9vWޒ:Ml\2c^Ġ'ASuA7h ¦9%[ RuIpq;3kHr:)%_}:@ rVe SaBXKa&N9MԒa(`}cUqYZvر+xY[X0m[iJ dGh: |Ox2318W81qc@+=\[Z"&9Di|fUQ"v[|kbDX@lYXY֬llc2fy9-a2eA ƀOƏ'X)i )]ZJaѼ]ʿTsN2)b PotYeb8EM#:3kUV6FO y9TE:! =0YqA:٘M,*YYVr%0 ovѴ9a`kKTEQ  `~U3 PT.(fnwf;; "DϚs9a{*5z%_$2Ϳ9*yW81qǶvUSt9kg/6@%.jd2.n+r 3,utN.,l7mp6~"? rI`QmEkz iN bygHr :K0QxjU8t#4&0ીau7n:<Wқw%e"k+oqF RsEmn.{[qP`w}U'Dfo7[,Zd70i|K2W f; 5i9FW{)5U8O[#jK-ae!Y\3WQ|3qG0hs-Yِx=%@Ofz /o:slŒ}2-@.9&LXtob[[3mjjk9R w(ZNfW?A$hѵ-M+͑u&fJM(vN[u*2ۭ ͞@zHNMH"Gq81nv]sU[ H-@tF=CbuLeacy_ 50lWs/%U!µޟ;NCbr &^,tmAp*$aw2 =ke,,芘3G*knsm?홄 볒-Uə pP% ,E_qiWt%; P,ׁ)ofehO5ikuvAFUmoJ'K9Q}7dv\Lͻ",RKy+Uo ,2~7؋\D@ ZN|2}Q,QGa`D5 %3:7CdD4Q?4B#{v9=-xUuQ&ctSQu6aWfH]MU)\*vɉFJT0,{KepGO[mIӀ.Φ 27.U%JwqDT(X}bbwJDR޿CijE9ɵ *q1qc\mwj|ݶyBgbA-kYqs6D69JjG2PѴJ9:^EbT-*M|j8dJ0 z顖6υ\ pϺnhm3Dz<0di1Dd~Xͳ0KfE[-K-Rk$ *\xIjOaUl`kl]n̓Ɔ,G*],г)7̭"~Һ&1taɒaP?Yc0440HTX ~ؖ^r[2PaCv bD{*<(N[ک[.h,g]2QU my#}MgPW7Zb X+I PSi)ׅ1UMSV%BJD P+h:PMxe,`:|ل$ԠN,6wBǩL7hw{9!|W#n&lPj šҁZR`>cǸ=w"Saq 5㚮FE=شs OEuzJ4 }wQ,-@c)ĥ<2@;XA>-֢,~Ւ?S/ pLo$ْ7W4(MdS#Dh.ͧυ 5`x{ *uXwiuΊ\Uр 0}O( Z s&fCDjNcg@!خɩ8ۍZ;CqvNs<`:X7EC 6dzsIIAJ(vbb;PdcPA! J7Z4v7;4AE]$]l $pS6R VNA3<] ϡib%Po`YtY4[:ںAas<:Ŷ4gMlMFBrHˁ5n|Le!@~z :o-w}h8Qa}kNig3;}"}o6Ӕnq:1q[ ĺ*1ٰm B#Yc܏†/Ub,uzT0/5 BԶhDwWiC;-0ˊdd'?{9B}hzv@ QKUsJptJg¨gO-*Ac؝PILxm*O'xPZV6Q&D.P,%POܚ]K X8Z Ye#2oWU 5Z o:9>X{> >{ u.u&+ERADm/bVTUy>%m\`yRʉ?QdE:-xa-!֌P#3@LLծD&:tls9L)q+ ZPVT;vD>Q+Hu(,\VKs36y>0 iuc?*j[^fѴCZ'hMZ`˅Jl:zlpf 8@XZлf u'B^8ƭ7N>j ] :ID.YftNY]ҍEzܝpc+EJV{#ž`'H#2 % aylZ,]K>dP=^ڻ MƂX0 ʞ )=Cg[<@fF~pق YʥƬ-hǔ+i6F9/aBwq9\yH1) QD&enc(< h{eEԫqmj{# .qE(Yn2I2*Wŗa*NV_X$իfa,X^q')ZhhaW2Ol|vI=ff:O B,m6,0bfhk{v I;OQ{ьu(- Bgj]#jDja XX)b5kig.yfyWg03fdc %uw!1qcVXQN hOhScj AnAb,j7zsєsע (o|(o FͱX F@b.-wC$Ozp2tPrXYZ2)je+jZs\͹晰)3t=kByo M֖C4qe<#fCC6QP#kkDTa; ګl-'j97?fԭt,VdL Ҩ2Ŗ$@A>* ]8.E Ź7J@X[䤓 Ж) D2lʀLtStȈǕHsáAX#84׍j6e 8E}`ˍ@?+me a ZA)@U5tI 6xo;A۹R_a2M|MCC2F]} \`a蕃%R1qcܺ=wx@ɩZϬn6f$f|w爕Y3Q#38 M8r~Ѫ}'EX464Fi4y +x hx?B'е\,6Lw;WSZ@ykaCgPykΛ.ⅱ޽ks]3l`ogL [a<rF˱(AEaj $ &.*ENg!Zq 6D?wT `vKFOoOu.KSs͒M k}gp?6kb񌐰e.qjIz]F+΀}$BBtav DҢԫ,Ze3۾c@Z=$E9+bYXWmg6b0O>+X{l }ac)l+шpC{͆:*uՕFh6]Tl2!˜*,š(bO_ 8"/l{X"B쩾Iz`F#"8'MTdSpQX]+["uNr|6[߄VjSfT%LvtR*C$?C&rݻrߘv =B\GdD< 1U .+.i*֔ IDATp8-ڵP$ YtѸC(jjH+՞(OEB98f׎b'*0tьxHBƪ9U3 :Qs$lbq>// Ujfq)Br[@nA )(YjO{dqHh?YyV @N5鞠ZjzރyucI ]m*4ќjP_"C7jD6KB8<'YKPf,)'͞nͧ:tX̱ҨI- l}8F&@JԬK m5@hϴcy<†No~j{m]BYũ;M˲]z@{ri 9j$8WY9!Z4ODkY%-"v1Aq=xJ^Lٙsx_rAaMe=j:f27-ӑ`:U'@+}JPgŠB]ȯf <=4Uk^G!b$(*V׷.t>P.:0#sX0hcULq21V mb~`s[0!rCT7mB!mCOqLm[Q*| ":-o!F(m&>aB= ؈LBGȌ;\72zA @?0'R)/g撺h\}4C>qc=qQ愖#ϧ?H.×6@661ȅ? y\ޏXF96MY1ӌrs>Ռ$z)1M-$װx.n隽nZ\C2P<ګhI"͂==z zY $Elc QDW`=+ŜJ`Ol7'!Q6TsxlFFs⬕S{+!M}:"YE浸9k3f՘}i%Id$=r{nr/?-?O$ۘ`tb`]6+j/Vp4SĈSLF~Y|F^1#iVRjK<. Xlf(4 ^cU%B[I.t!1w5  7m4XHm'uf2PRMbcɜ ȺfDI Y!$kP $6 0FsHZer~ڤ"jKr(@]Afi"}l\ <V܇:+ιK>~#"~zDXĿf[{GҌ {a6ښI/5GeXTa&@raH2tfjE"Cˑ8<>It9[ʡ,F2A+0g2cxO2e5R dY|(qL4B,?Np4% Fx"] K;xQNB 6z$ovh_VV$E}(81-FN.۠( NL`6w<UF*A;6[1[)1ʔXF6"[@ (xT` %FS0(O`Jq/I$99v+]#P[&;oZ&h@έ-) oEm3DC:6Ƨ9 k6vn*JSnfsDZ <-,*NB@EYzDBmݧP6)fDzOV0EF;2pDԔQWTͪf0]-3D!Ilpe!}0*I3u|!ܻ#tW a~fT^uXfw=`Ls)AgB2(; N1eJ!-慸9M-t?8Wvl,@&7x$ީ Q3ĖkIrlH'\ ܁2WUlܙpHi@'a)G"`2X$q0[ն\Dm`;8i겁%#NǀdZ}UׅhZVMQX ` D;0(L'iH0u}c3 c{biulQ8F:]Af͉m~jFc4]a8eJgi$uEίDТ΃3.OEW9LW8% Qp JŤ$úRhu@k>6SRYٷvyd4PXe!OjۙLW2̭,e>-}œ+,E+ɒ81q(S8\UN.o̬H]M>Y@IOՓ-00iGȬ i;4^p\-i^ Y4Bvp$U_\uRL exQgI6*`{YOƔYZ 2 \ +ہRn+sFW"[;w3CQ`g'] 1'o8+bճ3yVZ^̵T r~9S_ +d;0֛ҦAjd4roMnys3g!]g\1S1D!b9DҏTJG蛱Z9oK4-oI5UWޗzҹB4Mc?QC )ngr20{sWԖ\{ݍdpV 1]ϭn F`Fqk\ŖQG?O~"xP3W7̩ZSV_cGeuA6D-6go 8Ý{ "_gHnmBu#kw81px[nie9<԰+rjlْ]o$R|As蓳XqyCdŦMlUb`y@t9]gb6ѷkkDYZ,]/ƩO{3C?Gc>QxHzyS(~w?~_Jo5o7?yyZ|F Y׋yFԽn*ܜ6\˛UVbރS Y%bVX{8bϙ=sg}4f3;؂IHɤȇPn& |'F`/Z剂[s-5fe``8wS󠤏~&x >~?clR6冷 G/]Bn9g?>gsrc?/wQ.S[jo1m~  pv+fZfqpzY΃81nL?S*zhA]M)xyɹg✮ƽ(֢"?wKr5O{:klճ&As)3Ʒ E^rJ6kOx'~t^F3_[s=waߛPq} o̜W5?ܮ/b8'Lc[FE+:bL+7#Z#}&T""`cr]KFg*XBebsF\V)[Kk~gbk.!k쳋& 胶8qfnz|ryPsÙg`ww~Y^8#qB% > ꄚ-e;8 ]LbO,ٻ8W[Q1ּ(<c"v cHGn|lݗl\R(Hv84х[j7.!J*R{}֧sބZ.;L]9#gR*-351eQU۪t}PC0D\xA `mzyYb Y^ -w"퓵Ͼ3/`ޢjoϊ.0ݑ\&.yn݋Bb+WCq|v".=J/gt2?se\;AC?;S+z3?% ^_o|Ϳ:^^Lt@s%ns6Źx\˃[h5`rKNn&+\'ph[6Y6wndpr\8p~B!3ٝh\oKW9.ANA7*tL8&؛zl.gNL);?sk1,CkTtO}ׂ3mMU]\Ro@gq!#πRBGڈSHkw ϒP1qc<GjY\7\;``|x9;΂"*9 w]H]q ~beC8vt@tvmvND\eucd-`XE3icD 8tXFGӒ>49($H%|u*[i>|+P|l."۞ /a`_81fH(WbΗ0ic\VqErTNL{'|7+\?2SZ(Ts],u|/{<ȏ,L2zpb]qͮ_;#_7]:.j[BR,b]Auq~Djs)lDǞJa=#}vai˦i,,U6rXK"rbU2s~ 9>mM81,'Cca o glwQ$1>'_O؏8iȏ&qVcb f`wͭ7m|+2eVxͣ: kcFɵ}8^!F7VĽe\q-t\qJB~@7$Ԉс\}8-,d~EJWJ[Y\=@n\M"hbe|d`j&>urq :{Јo?1J|,'( r[) sڝ;cfi!kyV6Z׳];l6RK-5އݷ"s3ޞϴs\@z+RaܹX+m(֠H3:f Kث?c8FpߓJ.2MœQ 3)surb9e`N] \( X]NҀvMU꼩0* CT3:bYDGT(JOW?]vOxƷ3?ڵyx>)??ϼvB=rN ]s̼&/@%"JoPϠmR"Nex2X ltq\ Ҭ$:=t*}>,,0u֚4AdrB2 lbnbZ0DR&t3?5MV@а-Lʗg%{xR'2 T0ڢ d=`."PFYHnV5u|=tͷƚzyL1"@~ f N7?{ Cf@^1ab%jB~b>n 㘻4ھ@ 5ȑk*τW&]iߩ4`lr؁k0a<; WuZd ܨOnՃCF-?q81|\NeMU>Lp̂swToߧŕ D+MP=Go ;xV3!伟is|$IKHcĂ[ϊ̵>/f(1ڪ~wxc;/>>󳞛Vd#ǟ ޓ]n=EzEsQ׃)YLX[[nd3.tCt}_陁Bn@݋{H^R NOclṡ)SRϚ7}j<4PA1 ;*!L:%OL"8KѷA`<1#VA{XsFȜ( EfLhE*U#吃,ISpm|LC^N[E)ޑlG8a,/RпO[`F vX2F!Ua 2' oa4ԢyVH "l`cZWCA jӷ- QEzӺBt{E -YXƬ"3,n1qc=b V ìs?Xn&,N,`G>?g-H|d=I|f#΃)y36R&SC%'@S?1`Tވ !F:BzM%׾!IF3a<hy6sߍrir UºMwv]Gr6;)ᔫ)0{"L\Nz37trsn&lݰDXϸ dPgIND Om^j! !ÍlrHNJ̟ӊK5 ' zՆ' 0d}Ϻ41Z(l:FZMϛх% SY`κ!9+&#t*hV92h1V:E?@ySF{֢.5:ګ"z h:WnomxgWR,;o ; Nb!?BF)5P̓}ucXkw U;3Cb.1vYšBv:,Q/kPiqJI/ؙb7U%&fL>!? #)OgibNioU`@'rNC+jآm?/x~O|3z,9?3{w'<6Y,r=Q&Fѝ BaE7`UR]ȬL:Gs?}FYAz,{NJtc, ›0nUI,QsHTArV7*hbbC<9' V?2070ׁ;TZ6d! xTFED=nQ ;"Z%8X GzE{=Y}hz>ccq۬uD8@K=& }0YȏX15A'oj*OE#&[eP$ KtGȦZp8MF9ZkK`OV ez&1X81qcPB)tMyվYt Bh-r)I.DCs6;6Q#'{nFJ:s)!Pη6F6F&htS IHxf9ñQ0oGC1>O!k\@#8EgBe bZmq,/#BO(QI#Tcrk-3AS"/(awQсrv'Z@KJa mz1Pg ]~\TWD AF_ 9WI?81qv\,EF;kdEf2 &Lu Xz_4k;g'<1O[b]oog淾->|${_eϏ'KW"hsh}YDyMb7Zma57)G84,49a+%,7CsgKo|.pà2*aFID3sF4d`h@;DaШd<7ᶒʣ,S7w,-R 7zH}90pN.m* -Hr>u':}Wټ͗smƄ;6aa'-6DuX}F kE %3ɢ]4=_\@6V]qU#=W81q`QsEly#̫X6UzָU|%F) ci|bU'*4ۜ 5/p3ooXx~c5?{xҵ}?5 ?_򼈈?4ϊ'}zG?q7^?&]cn>zX3Ыm'G~ܓ sX^&Gޢ.QnwAZl6 Vz~u pc;XЮ^(@ =UWwOځ&h -u Ć 3[K#Kݡ={I ?+ :jGcO Jt.c)wn3*MpSvicW)R.OhϢ?S3hA5vuk`ShV)Ы&P,+3:MeΫ!:d wt ֳ@c8'7ՊսpU #vi *5n;Kl͡$kpa(1b)~w]w_m4ؾ놰x'Sea`ªQB|ً_Og>nzr|7|k-rT]3LIĘb6@.~wMkkdoe'DJݬ`7O#VjyŠj7=lg"DC5Yj"=D|eYame$kTWo:8k$40IZi̐-0=r/+&Y\XYbV; "R*UMt Lj{MMh3:k!ڢ$J(Ѥndɫ{,RaYvź|U iMSӋTTHHR!riQMd9Z-_>繟_sݜWO&A+v}.^Gk3/~A|~a|ć}uyf{_g/zYG N֤G[i-j*jGӐ#ܱYrH#Yj_)t9iU9罯`!;S3T. [lK0"LRg43 Xj c6'FEClQo<:)Z9Ks͈{P.Ca$[lI<6">W fY HoT.WH\d6ZDOET`LuketYn,-Xm0V\h@cѷhZ; IDAT]p?:1qc<dl%tz,=uo&iPC6+HђVRjſRܴQ]t9ۗ+ xJ˴w7] M]??Zr-ذ<עU73u YlH|0+5_jy}iT9=73b'$k;wl=*=b`qhw8dv2TrVt]ou }DOa~󐇤O1@XW "J_ O8_ XIG^ E UY,,<ЉYUC{Tlb{H^੺@8QhsBTH Ob&O PlSi^z9c s`Sۘ5 \͏ujgAǬsNndL@1o z9:Цp-~gj'lsfrxk}7w81qwc{hr&D= :eǬE+(cAQUTudRT2Ƅ@V o0м $o!%7k o > xu9S3Hroz~;xY|ɋ!~43|ɰ8_#$HEXf?" Q2>Dy¶|O^*~y̧||۷Œ7Rڑi 9[롅)')8#3XvO By, IkgQ|p˄B?'r2Μz8_aOFҭx& M*G\@,u1jzIl*גUkO M ,Fb!׏`76Qhsk WK% <,`&KG0ƼhQOp :] M@2hs5 @<ߋNTXZd}z}bZ弶Ow~W54,斳ʼpc8C+|'ԋG EZŲ%\;ŌX:)FAs@&&"F3T$/M&}Y"Y6yT ԖEļ|ɍ" ~sK|bwQ5쬕ǀ{?}?_g|SOxXO}Guox;>Y)KD+q>geC!2F;g}1*c:zx)s%_r=ό*:{_:ߜ),$6NH7ASxV9Ds݇\׬)4g1mANtϾXh.l࣡kGbD(XamՅS`)ge~TĴ`ַΣ̺^ YSIL6 RƦ$@}JI0!u*7b? (AuN .clvtl)mDfF ͯAY71˶=E]aal@f9c8C) eD6̄K2iS_( \ h5ghAZ)hHm f Ȍd} XP$)!ھd; x=y_c:@J [qh&b͢O2e@Fuf|SNtI%+:DOɡTtbB-ǧ? m\ Z7F hGh"ϲ"=Yс0){~Mk0Ӄ OGqo Nn) ,N wĵ \UGgFý $<.Q LFΰHR5BS>k qc *zgfzދ}]1su`9}o;3Q1ڭ/xR4t… <6dATbOɽG1qc{gYxr"p*P D '+j:SN8u<;⾻c;cs֝go pۻKO-璤aM/?koz߇{G<<1%d 'p [/RFXc3Zvd\Ͼ?^ 9 &9 ҝdU-)7ܴHYy #npV^1՞AVJ1V=nv@$UϣmTuD\[7E ) ohYԚXYbp[12y#Mྑl:~hQfn8& 4QͿ%OK%J`309i__g B")VxpDsPPʄem) #$F"#6B$4?>T@ %G:x=ŏ_׼Xo(<QVl_~eyb'ęG?!v!>[Xš/uHp0L/z2T}ο8t7u?+*5>T{-WKk:x~_OAu@qnVrۣ[e.@STs;9L3HM"F>nZplF4 M)?tH$B+*CKH@F la`v;_1%gXތ"7rE;hOU(%[*OtMA\KۉP䎰 u@gϊUf9qDZayGCPN ASt*g;E+jXLAlb0R)Ry%4 4pz`~?ocǎޯ>o\+YGی"/.R\ ɧ X1 )OmR "8:4vͅsہG {δA^\ء`1,gR$7JNt9EP@cNhDPaٌ7!yFh՞M{=RJ36 9℞H(1fDo`#ita*Յp1pmt~RVnp0RR7#SELem S ?"$Sϰ6;g lg{x{ނ03)힩:WOi MX^eOc`{,NiL۪ܩ@ٜK2e,W?% X2= 2=ral O0$M%82s.VtNGV5$`<3=pO&Z\.׿G^t.=9Lo'Vf#BfoR\I5Օ? `xbhK D=BB{/J:ҥ&qH燶0A }XgUĽ OlPsBsQ265NB=_ȗz$:2!ROlPj[!h !> Qm$G$ GuC2LTCa–;n%ܪ5̉K y$hLNU?XoŲC7|VI`- _N"hyHLL!H/U 5恹 M1~x?;JlC~w(⚁#mdw]LHW&V]+GʮAu%XSe,cX;l?/ Yb%4.MO;4[0D!9'fhoG!ڡҦɵ2:;UY 0 /8{EAz,MR3MLu!v%Ee [V7x?ϼ*^o1Ã!;qk=xqq/{S_qyH}hxa?y. G%M/`VM) ݐB)n &$_d@L9J䫉y2؛[N:g%]жܙyĐvVYw!J[IizQ($%"/&{1a`KG$^\kwGʢpIt*א^2 h4H6ӁE19(+tԜB&>tKS!a}1}@ F:56$ [9.iCm}Q\zM{fgtTnL tF>p֓5&nV P=cIZbRd"#s"ZSv_ [hѤ[hOsQ޽-{ 0@X8.cX2qD/|;AQL @|W ղ2 )Y c"agsE;A򅑌!wHTlj |J0_)TrZE~ ύo|W߯9/?xF}49* h =2NƉG0w9吙8@y|}7<۠JѥkDM J "#@9m@&duS2iZN@y߯кZD&@ICr#PR̭s&1ձuL ~vTgXSB%3SFL @,ZS)B;"QJ{bLPE"iOIO(b%i :43dtP7G[l j^s[ .LWԃ+QFLw4PAu:dv3ǒx:I96'̄).0wCu:g:@B4 ֻ4mP/'n @T:@Y1OHb@FO`' w+ ^bvw eנ)lK.ZAbj24?eR]uW Z]Ji6 Z%S9#e,cX2 vuqVi /E%MJ9ZE^g;Û1M <``k{eh"J5VY[cD/鄲w4wH1=chRqn٣~yfڇ?򉝖5y1-QQv^ w,d8giq_ؾFYhs]<x7}_%(~P<טNއA(bSqzʳ #lIw+BY g#3t{~ ZI>7_ &tD`V7-]*Z:OcVAd}uזvg08"xLn3"*hEJh2!_6{ZQ{r*N?X,e&yC7mG6L.-%tB$чJL*{`x~7$}o=196 :ɅZ)?PDÐH@ a91fgPv}/wfgi>oͤmÁ[W`z;4D3ܑ4ms08*' euT#;}e,cxǎ{nDIĐ`OUHJ\B0LS mC$1(R#=` ϞW/^"pi-$;7h !M/Y'J pVO|c=>ygEwn.aq^[fl_Bj"&y`og/? h`#P{IMЅCo/ôYӽS-#=H"TYt 5=$G$Rf0oudYs(c5W_us^BB;jmAq4=>(GfУV,&txF{B0i%#FFt߭=qsdh VK>N"ε ¦76XKCwIis ug:AL+gY*hY.AHnHNc cNĉ\-Ww.Q4D[ qrRMpp:xbBVkU IBZ;Ŗ:*PK,d+Ck te,cx H9Yo^]?q:TH/NKx.6Znie@*cD,A܈4W!:4O[;iuтDôs IDATZjԡ0$^uK>?\Z"ȨbGoؾ)I`<;a)(̙}]ÇۗJWC!t_i"U}3-h:hb Rm`[<,C E;=k1(\ӝrf^Db1R|Jaұ8kx8a֭qMܒ8ln pՖĪ`EhV;|<֒`O)Wv" >v*8&hEDb!2=0^| ,@ӂ M 7':ټ>r.ӷ:dHM:lnqX*/սR0&G?PKՐŴ?ZuMCwqp4h`F8/N@AtLϻ]t6!ݜG¤FNO"@Kxୡhe04a!tl, X2it+츙vK7:b8'eQhAa d.==Uy{A p.Ԏ䴊{D-pR[Ȥ s9W SD6`L@lͬC}ͭ'N?uo~ ]JΜb_ ;>[L󟉭{3F=<|^KG]g.2x .qtl9&t!5TD ;O7~'>6;u_xr|ϊV ?S.Z[DE{ZY2wHMu Qs6s'(Z!0v q)3y5W٘LKV¼l&D )+uЍWHVzOm=X2ʀ2AHVpKad + u'CldUJY`Pql/'%( T>ցsڻfk8إe)RwKMva =ؠ 5Q[W5key6|H;X*ΐ^}3mZ9j&6:uyAs;ЦAEb aÀL6(t% awo!Xn+ {f#dk!}^!Fy|ii\2e<ÊZo،J!,yY?3´2{E[4ff#}^qt63k Dj6 sKr>(?=7ZiD&H*5 ЊzDH W}ϫS׿-4~sV` f3WooġOn9nDȐ"pdĩS{;ohğ/|D~5qD<=G>&N>[ n(`O/ }ڞ/Сjk(;V)$ Oh.x^ "3EGitN=x< тssMJ>0E`F7-֒g&7\}R倎 %= c! esbi̅d/sY$1+^m3ˬ(r`\6 oXy%#!9Yy1pmWa#yaza%NY SjlΡyFz7 e,c8CZB E4-NzxX56R#8d##qXeq%)ɐd/r,HR}!,2#&7Uwx.3=7^]tf]zmVD `?y<O-CPl>>gJ<{?G8rӛ<=N>["sK7;nhZ'sex}]U_g;v^Bt<{DbNM'|Is#.#it1/CctwɝIMQ2΢{f<4g^bIz21Z?#rK'Į~zw+%jv) ۪OŘp7Kib? }4ȱRa# c^n}HTb2[('0ө8{;?sU) A HNH0Q@w':bÌfWŮ;u. M8~hw! / R)]@vt퀂?T7:7i!9:OABe,cX2qy%X"uŋd'~vEv-{fYwƏ*d IεJ&Z:3 %&%kQ\qАLτi5nSNjVUfu^FT5ڧ9q~5.8 d"}5|@л79oչT={rz~&8k9th+e$i(°6&];00̺|6.kU|79\Y?vMkl’gqZn8cCɑ4S#vALʇ h(e5VRv 7VK,3_,R@R15m|4[<ѡ,g~'bUV h73'-ݟ< 0![D(uC%FF$\]Ri@-0 :҃4'GN@&>Md}TWkM+md "W2BưAHwCDTu{3h'Nlq&=]sn[0^'k8ue,cp 3UPKx 1 RI,b_f~R@' \%^I"BbH-yZ\,6]Gy?q*ɿPe햨YM#o{M\qclql%rklYq+#Gn'_C|Ǟgă)"s]un1~W^=y_q8#Pp/ fubk+yELn =z ͌(/QC:SYE7ÖQzeX!g):$ƫ6W:GjaDV3ѷ N2LI#ڑL,ej3zzIÝզ#&(͝5\~%(T IT^Wfp o5ƍs%+J GP(BVSDce,cָW"ɃU|K$ݗtZ N"G0s45N~_c?+>s]ɲ00!w{(C"5#/s5~U?.kW:w~:~]B2\w3X1" C/~*UcbnvF<׽}trȑ{J,5` FfH0ʟGe:f4LZIekGۄ Kf;$ň+]^b:r:2 >KY~Kۢ˷R32`9aL.xykXo,#/6e,c8(,D5G ‡*Vf-8c6&LsjxAHEn5\ ܆(;:@`6gMjGq3:%Wy|[`|}KlWGFP%fan˥,O>^u՗Ael9͏ه~5qĩ=ox5 Ӄ漕eSn+,0: Ӯ)&YrV5f^z?(`%aOuz; cZ- ĺOZ*xn?k [7 εP[jBN1&4]0*h }f`ZAr'󽦱b+y#g Ej*iXT2f<Ǡ 3.fvдlE}X2qXY"ĮqFul_tyܴկ,Av̗YBWe}'gN]C^9sv˟ze\G,d3cjxQd0ƚqP@Xgm/{[kę|\<׽!^7=^w9.Ff~aujc׌e<ZWl[p$!D٣`,(kgDwWTdOLW -}ncq6j0яW)o06i/wxLS`S~*>s/lXVQDnҘZS*{Ѯ6^"3߳@a jX2qlHfXd6?,q]GpØhf}ꞟ\c\G^&yv {Dl9%xjo"gs՛EQǻ2T|];^<E5LčΰM &Ұ `i 0Jוg;7KVq]򾿿ڼ 2fߟʋ Ң•kr_94#s lp0v2=6<7aςd$6Q[{b甇"c^Wd2p_e,cX5vnA^\qڭ:a߻({_o~x ~aj>"ۧ}ɣfhI_=Ϝg^nԘ[Kɱ5:7ʫ Xw&gkӼ]7IĞ~ u5h˦k~Wk<mc_QG@9ֹ]wg,6 ְI}Y\Ě5..|sQb5.7 ϵ-cX22lfRun@%L]p7d^uh:`S(U"랹g{]@|ld7 ptRP~֛ۏxTmp?ဈ_ի؞ Ώ66`IZs:ižyp`^^Run>^YN21dOmѵa?Kdn>k 9 b&ƚs+;o3k;b6raכ\2HЋ[CpxXCتНE+>Hl<9wj!k"B]nyfoCzK2e,\ FC]Od[2cMlIf0{y&{F̈sw-A}Wp]@`=lnb_, {@;ka1xGo>$ {$N 7~L=^ham,V9H73jyׇ1sцHV5G&Xf~\cZhLT:e,cxPn]%ij$d @(b1!_s=cO fL`61s X I$4 uk{膛vOGB>Š˝r&n n:)ۅ͇?5vh']yq{fa=__ϟ`R~]b$5Cu݄K4`iC>u8naW~Kuy׽@`MfNIRQ9MGZܽXٺE)JКs7]aO,[Z{L3վlL0 +d4e?64G˵ "՟ܳٔrP+8S ;ְA"Gڸ.`ݕpOaz3T5ЅbҪELe,cXCڽMo71úBQp+>*RQko^څaEAs 2 fhaW/x{&w"{b>_㠸lVY',b]+ t=C3 ښ\r<cbW~Ot%ɓfAKͩb|hnsut礬5lٽ];Y;6ےW<=7&-H49G4ЈF"/XQO~h}G!*jm@9ʼp,`,Ta2GMH$)du7M2J0hڭ׼҉jy>^ jx10">NȾ8|(笎d/X2s}t+:k&6T,MIwcp/fr& }udp< mS"9p!=]l!? y7qnMaz26,2f5L^J$0Cܞ3Gtg}*3s'-=NOqok㓷͑k峠@VZX30jglY^u(KCXWQqxDgʄR9 kJ>{Y.l YxB0zi?@q .;A,$6g`:(+́¯f\M+Ykm{O۷ ?S7HJ`9׉;+̘;LqCV""qac(X^lTmg vF3ҡ ;? xN2ԱF9Ե%sAB,(@ Hc*hL-cA!WtD@Pad&{"Fٻfө@`&3NX2e @X1a8HcA& 1 B&kg;gA(Dx"rOt,T.?/<{8LP+FOx~9o|SlxjQs*rJHAt`5]$kLk>|to {X J@0v:ZPP׿uO{/!zץ5d+(wY/=ߝ0?K$@Ֆ׶(*O] l/k Is㞵oW j ]mؘ둙>79HJ Iڊ鱚W zzoU+ױ֊XC糚4v #z72{x&: ћ1GZ%fyU^]>VP0PRP:'GpgxSoouƇ'`kyr% 8i7L*'FAZXHR,pfSk2ћ! #b@g:b)j; &^DY Y[wxtez2e,c> P gs `EA"gc1g&U~"mx5]*= ,VYAu IDAT θR tQ@A8ϊm|#ZXP*N"(j}ƚY _`MZ p"v; ߛX9HS$FV(LIN'~ĉz yCkڤ;p]AƨLF\(&I9$386XnXJ#$dR1ad[V` ΅u "dET@P>3GQO ع̺M QD uò~ ݦ&hZ0>1{5'vRvT#Ivu eO8/+lǪPO1j)юjL9'&`*"kBbdeTT8@خ9 sl4iw49Ѐ#2Cn~*M쉕gA{_SodZ]C>e,cx茛5hlZ7ڕ;9sc4vPRضB.hq)<6O|sQˣ0aTr39>N&@ # !Uǁɯ:Ƴ=͏׾mQ I24nZӒwaG<ˢLa덱w&J`YfeQB.ŏӳ˞čɓ+6JgC -nf [!v41xWNi_w) AfTl?_H<檽hh`xﰘtN;izLp㞮[^HȤ ZJ6BC,fBIb;JЙ_4ݲDˏdz\ڷs$2XG1f\I^J6 kӉuh;HS<^mֵb!H33B(ԟ*HӦ܈7 $LL+7rhiA-r>suΠF*] C=*P1rN fb,97FLiF=mߔ:-DK%P4 ʈ֥Zg`>[= 6N"=qeN l9i&UE;EX4ۡc\jsG0Th0]tH:^rPVde,cx( 4Ꝥ^[VR}Er06LxGFgU&C#(X)'@ P|:=,,MmT aX?ŠLl(ܫ=7U!ch~ah;'Yb  q'Ykdϣ } zkvğXLzDTº˜/*=_ޅG mz90h1ZƜSŤ u,WI ֑u{>BF;Pt"+{lʯU )=JGŶN>`SBvNl(8T9xi:*vEKV)-ԐE1'q B,DKANz'{N\D"{͞Kpl! sjOF6A}Ch[Әs0e- hXf?@!0Ę[Ud2F&ڐvw#Em P@Զ9$ǝ)P#]?bjms'3RˣεjZ8'*2PE[`fmfZU4zp ɰn"ez+.*ĪcX2i}iOR/ʑ15MCx $֜=A$FF?ڱևJ`pn): YT{ M\kץTV!o-RL-?߃;-ZOG_x(αcZiՊ1e ^\@r0r7a, DzA*Q@|]LL3W>9?˭Oi:yk&kS1M\xW>?:N:)Ygh.? ud8(aaXNZ}<-ҹ`Ja־ ! iki1xc47<3e@o,[@+ `=9/"2ގDH ukz'Fa>kn%=گE:,0ZΩZO-@rM &&" sL~^JlfE+W;%dBvPd: o#;{*(~3qG(%jh3o 5@i8! _+(GhaJ,L_k_DAiT>14FQAw9TocAHP~Spv'2 (LY5H |e1zts02̦F3mm&v LcX2 lI`VjcAdg9)aqY$])NxNaIpeOͭ x :)=k)(D.h9 carN֜"ZZ˘f<*z v㑗^lpvŔ.V3U"9dT LN9QW TX_A6f-g;:J~۞ipʻ&.t;޷=WJzF+vI͜'5Y^ .! i@%pz;"Gd%]$⣛ JGb&*$ZXLn*IO0-f83:ԉEul­9gtdɝ 79 bԛ9v?Gnmؤ$зU}`.LGS23jOkLlHmG9$3&0NҪ6#SۦNp <&:ӶTTJBOdLH UVt[L"Ë:jV &pVmMT Iۋ LJȽKOD0 ?Zg ]3ދciĸO4 @}Ew( oEj\9 PlTw>]$ VŅȺ5e,cX2HLhC]{ٽ:h!.fZϜ&1;xJ֡kl u*i]$<ݽX aCu(rsn]Vlj@^օ)T\ D?154'>g_|-7ů:) ެW z(Ծ%,M4.a"djx8nq3W mqSܙ 4Wo%jPѴ?3g7G^|Q|7~Y@=*.-~W~nPZ;9G"h04'PS+r+)R tl);ɍPGb hkS9 `@6mEC~hsrEPg@$l )aU]8H="$Hj>2iOQP+7Mxҳ*0dJ(0–s6 $=β+2~]ʀg|f_ʨư_$'VR-L1Չ2z6WlFR,]}yª0 v(႕r]ӆDbe,cxw] "ijڨZ\PcMTCp"=EXH3]!^vd{L/%w(t혤FLƤH C| ֩#CD7>>ħ> Ւ d^+!v"J0#\Lщ-ZmO5Wt FzS/9r{;wƅRLhr/TH-n;Gpw'oFyޱquo3#Ӣ@Ik bt#u=+BDy( i3QeTTfa Lxv;c&3=ގ89`iK쐡 w$14I%P$Ic5_T{Szk$}:S:EեBr7S')*(dI2]ạŀ{@f۠lSMZî\fQnW9^h`(jk7y/J^!%Oe<l@P)W KkwSitk;UV#c7QBgpmbHM֣j ʘ FsqDd{)Q>!RE#T^T\2e,9LHR&]d$jLԞg*,.a-;CMg &'-A(9@aQ+)ƌ=:Bx#"C!Lw=X7O~wӴrW2Đp`x6RǍilEX+*U 1c"ͺie"S_8:bkt;[w.,4!tu:vYoF A{{6֫yH T7>[˓5'4g^b6Ő KY;AK29'aFFp_ ǔi&gKQ4RBDOA×!aH=K{SAtT)RaZ*$M[mhhJm_n9>&ȑAJ v + F?̉ZdB)]A9'qJNlHt$aCWڣޅʑЈ %۪ ى>?MX9|Y!f +kk?hr ~t.hʼnF>{д&bb;z7 H¥C~͇j +6:ؽ>F9e,cX?ZRE/PGt= 1a{dPX؟bSBxki@TABlϴOM:T%* fZ(3sݳ {" K48sf;~^WhbȘx =J {W ۩7#9ґYT0~ "ۗ\ǟ󗃗?nOПG,AazE!Ot?F)5_;6\~wI5Mw zg,FSb@PdJ0uVG ง]) Sa `8)ΐ2,]qMQs: ==xɒw!$@_$nr~"@ p*Mv6Rki e#3Mț*0٩lQ$~dњ]YQ f@ B]~)]h!{">I˥:EΤeQTs?OlBP:\Trz Qh4%:2eV4Tp$,Y5*[,5H4 +s}mNimgic|s@9lyXt%L^ݘF%T/Ya!yA@E47 ?Z2w.:`!a-cX2_MU՚ ]#HA CNqɍq SL4rT 8K'<>2K٢M}ZݮEtyITXQܛ : @<n4nƖȑ$ѮEM!a wnOk6nq A)IUO{o[{>|cwoĖq{h'0l4։8mٹfw+IqkV׆ns0 Z4.Gtp6YN ^(ZoكE4z@hbDžI%wWo(X"Y(26&埆0FM|"̰moE͎"f5ֶ hwtw8m4=hA7 AcI)gRI]mBsev"}nH˼ T+Ѡ"%.hT*r}rfPA z:i+\Sb+ gFf=Yp>7 gi\Y@g&6+&=AP*]HP 2𠨿UU}rBr V`mKJ007d@q뢆{MV ]׽be,c9Gw($v?DRP&h֋mP,-x!-FYOUG=ˠ2 ݬ}[z^xfr0QAҦ0Ӄ]nnb3ƞIE_v &]W ^!@Y؃-O >qXl9ؾ8sٕ}"?0oo"pM+pG+s`2*֦wO?v,>:QHv=AbaXjMӘ^|*qg2[Xǖ&eT*'CA^s+C^>9_l:cB:QBؒG ΂L3lIys#[6ʬI=mV׀.3 2Nz}mE\Hл]cZX Pqׁd[> gsL WK9BDj+#6V&lhvI )1U 3~ ؜tdE(²iS0Ý1&&h+VDNN̈́@Y·h\*Z*4 ʙ|p9]w7}rBg؇-BZ2e< %"͐v0 CwbhL6w&7\(s t&9(F908Z2 O_=(r  @Y ,pDTJe9ŕ\2)#!mw y>EbclU}NЏϬ88(Z ;0W# d ˼(GFj E!kGo <6q~pv 4p,tCd&e.Tf+ " P+L[{J֓,I>d 4zQ˭5Fw+yT(zR+ИcلBLdwUk!LбfS&NT1 G;] IDAT`Z ݈t&O$}44@CF`~&1kLE> [T0svU B"y͑``н oGZwj3Qi6@"ྌe,cx~8WjHL*סgr.6 lx HZLjPvZQֺh#-Ћ\ ܌g9shD.}f"@%d W5K ˝b]GFp=P8{{)"oLH0+&YISU!T0&esYn؈;rš#JFc{`s4Q-?CG$`t8e8Ԝ.gz.Uߪ5̜ 9L(YqV^3^3IB~MZ#uD8G*9cyg0W t"Q*~#ti.cX2peaƴTMTz8,ŽE,Ƹ[@ Cڪ'%˫8UW62"E_p'7z]zq9Qר `q~OzA'l <?8Oil:si\]Hks4jϣso3ܘߕzgq|nkĐ56}8lXJs6~PM(ڗjoǘ*b` ʸ{rFYM9՛/3,$_;#(ZID+cզ3%0{U(IM$7~~f( X#JF)r^U1*hlmwYA3Q=x8jhY0pl6ƂVm7+%|/~1]@pGya@69ۘ2F`6ߧyеe,cX2΍"V3RLJ/skZNGŬQLEl z~:ihmds+/֡, 0;x<3gkžț3{T~|*_x/FgooCwXW31X/5wQv. ;)m=@3hX?~s d[YB2.~1f޲ f11;󽔲G8XQ M;A#[*ɁgҒѶKBC3T3zJk+{v.W5 MEe,cXmTLd12"'1~s ׈6@os/ |=Vg'( -ftA܇~ Qbx 'N _xdAhƟU)ߴfsQ{  kW\W\G]qo$ *u-&_iELHW{C;?ѽM = cվs!g"] p3X^^9RdVml2 5)뭃<>$ .tQNjB])TG)fӀNpW  pLXEa/0I#zVfᩄ )j^~xs2 xGeKH,^5saODP 3_caџGڟ uP8X衑39 PL78d`jԞ hSmyU,q6{bZ2i}@[Ul.e,cXeWzu8 l<&?}4L1| CK4Cn&ChX.u=ICGeSm w, /SO}~'q3b(Xe+aRNgsMg{9yt{#N8ZƠa>qĒssav ?ߛYtCT?ʒ=$;h6v^0ִc\%CJ$#9Y03 skVP1|&g&HQ9JS梑vH;s"F`$&PQаY,9=0`ԭo114Z.8;ScruJ c&η1oB+)q+'cwЅ1*kLh0 4()Mp y@ZѼH-Lp,@ 7] e,cx g}*b @mI5ǜw_Aghiz9oʑy58}Ly]w{%3mcE28;)f0똅;Gw@XJ:# )7Đ݈mS U,pacV~`&dyݡ.@=(]SAC3LPpH}Sh1jCn 4~ U},+l &dT͋o@wAԾE>Q~c`h )W‘aDI՚` =BoJAiDc ө^Wx,u-'tYbz7s ?Xbgt>_2e,beM趟H5l9^K*s D(]XeLN[U`Tè V~w}{e+ ӣJ0s>5r5v('H&a^ \kebHWӺpޗϺD1tϺV:,='{A頪6!uf:/BY^0C[H{1 cOpEi~Lw,#ieIP"f#? e,cX2ȡ&ZiHs\o "6>8+B;+G#[NMv bb~BcTJ=tp}nN.xE$CqoE3jU n/T`~S1vw;3δSA<0y$fxh; . 8Pv38ߌ8ujokȱ/kb&zJV8=Lrwe5.]=CUB`mei/n <LaɖEi|/Bh~a"ShhO.I߇"QCosǸ9ô.HBr" Jҋiq ;$qL RȭJߛrYƱAmجd:X:0ǻQoW4X7hjJIa95@l}ӧKo:Qy @v8vʴ˷Ţ\" ;8AKĻ* qf~K}5L7;4d&*uo+l&]qLЁ<=cU(g9@TiӀej9 u$')֎ Ds`#Rc q$XS贶Da<&ȇo_3ܵtqk}SC(|i|P>N.ic쒋wnl29OxK`V YISNQ ѹ-GE[t ud;V`fbZېw@)jͫ9Z=4)39i}0akXb-yNm'sy`O=*+;GAٙ[]R'DdzTA}ʇT>:Q$K'IbIv;q-^b$ # z@"r銆#`o-D#@79NN|"ͲiDW1:rN_CZ-NaK3|.{s1Nώ+lalb:s"!AaCxOv{v; 0v0jS`".cX2p5c=.( PV60QB`*{n$"Uk FH `{\%XLZg ;} >Ռ;\\pAb W2U*2..MXUC;C#I whAgb}L l*[w3uIOS{gЦ6e1LFa, ˒1ȜkEq]e6&4 0A87 F۠r c/em5ad&yBV#duiE{PaDLiYq^O 3Ns0 $3U'1ӢFG{oYUUU 0!<S `v@h868G 4jt pȐ  d`F }~Z{y߯DT}>=kuDJ%Ne`K.3用On` >}u"|cd#̰` >T٩R@zǦCUhV=l*6uY^Uw\(ȢRQg&`c?you5T%)G"s TtC,sv H;f&P fƊ$XsctЬ.FL8dPO"譀bU 2!omRZAiR ;"X9\2e,8Wa@V@o9sA~r'ARǮEkL l"3'Z: :FZ` -fĴ:B#lz !L/Ϸyؼ{7B\6`$ BqQ{Ez VGdy:wX+nGUf{NxɧINg@d@Eug5|ǭ}5KJYL\"8ަGOX3AgWpRp.@L..oXF7mS҉k.@5m/JY`93'׍A(H$Q$UW} r]CҼ!H!PinG,ˈE'սMBM<SC"cfO {xF ZTIhw#'"K?ӮL?vN][@ -^uc=7}]ZZ nu & @C/]XeQ ̐)`T!lBC!ZpQ٥Ҩb rEoZʠO]RbQ]Bu{e,cXa04o1;hɿb+"E 8hWd.-m8MH]ά` p( =5Z\(}}:8f=r<`y nI)lEFT0$-1ÆL#H s~k'ؾ,^C[X FT@؁9p^^W^: T|=npJ`RA;77]eo/{kSڊokdI׹wvBX1H^{Q)ρ s"+2k z3@%};=J@$e:N&۔lhpvN@ 9]L-kDc*tx鶠xR=-Iu~.Ao.~tW,H)3<zEE lp %1{p{Bmhfi*瞞+ h!1oKg@O&T]bPA D&7(dy =]~cSzp T.XuTA(Dᕼ͂)XKE])f^qѾwHpEhȱ]|Ih [.cX2o"`!:Ya #9/RH(8.F-fZr듆H)14%5 ¸ץ"uk ěw#A/ lغo_OGESHq,\a"9۸YVxD^Eny.7|"ԓpd ŏvŴCBX+⃪Lp#qsv^|}۽ea܆`i$@'di~;ͨ*'FJ 4:XKv eyZln2J& ;w6 hzf@ P>\#\Bf3g`JY`MMiCp;\b"# l,h :O24QQ߫##s(8E_AUB@"]Rg83%횰  `P ] VP# ~s,-X-cLisgwQ46hWy:A:Z d LBw:"?E:'C#|jCdM8܂%Pۉ-e,cXƿyJ5],{$]e^CY? u"Ԓ=aʏ`,V㚯{/{\hˀ ߜ;K(Xpn]$L#iO~aGѵ>Nv(Y%qxVUZɓcvnrN~b >&)&I &<:WZ]lz>t}PתWu3unɍA  c)iϹ-bmQv32[K$cl.ݐx:hlYy #Wp-. u(mh`{xL$eld:#ΦDelxd+Gt#_Fc ʴ-5F3%Q>w- 'JA0=f JemVͅ-Z"OZGE( n=-\߳#N$P6 bEE_@fy| vjkKvO((iSTQvӃ׿Bދ#Tk;`Ac3{܀XpznTe MfF&28$ZI`iVgrCtGHo򣌇}B|ե[EO#=n !ލ9#6DqԲ;mWCLjШiEVݸ06""v%/`0u@1dL%j{†隚!:Dń}*݋XMgq%YVVs9yd-cX2Ea9k\EbfsU]MtcBOUV>q$g .8e bJI;18 .^QҺ `\Yn;۷ouq?=J@]Bo2 h7[x AA R(f;~Ӎ j6jC]-wmf/_`oxV~.,缧?4?h-1Yizb֤;`8tŲJ.) yE'p.b aQ;:G,R]VGoybm n]lp.Mq^ʹw;܃_8xPT3abʼn/j<3hI#}UA8xHYrt| U DlW j~j[NUPvL³вhY*AcsG}N-}as/ZЪ;lx;.4WϝIc*T.vBI;[qpvQbj(7ޜe,c8@,4l}$Ao!1C>G)E+ăOh["K얙/Q1XAʇsG(R&Xbʼn T1xSWRtxy=!Ww|[ZJIpWCj4{-'>'{5̳aZX Z 8-}KUB0C4cyW45D'G^({lE8Pn%Sl"ƆJ=1{xsP=bTzbKy)\ (@X^g֮]G$_v(UƊ 1h(2^-Dk^Y>Q!Ew*xbNzZ7^nBϬsC(P P`" jX2q̀Zg4N`ֲ%hDW²8IS\y^ֈK|U5/׼(߿!硈r<|߫|&7A/5B؍>U캫82w`<1ʱI^p; .s9Oz?5kXX΄:|Q(:d}yQ9^+p hڿ!X~I5\2C ڂ0~$3ߕz`~C1?@TCn29g줘K73F!W2֊ =˂+T 6 \>dc\P h葹5< dxAmҦ{Nl9WZר ya\]=̭hB*s_2e,pրCQ+emkmNqŔ6S4{5X9q;[|̒ⴎ|mwmwcIO"oQ ( Ђk{lq= MGv쑏|}e۫^¡}M;bG#bi^99K9W:e,l5:_F nUضdZ}sVk?obCƊvݘY00geZ\9]Ƹꅈѳk'6(VsTB:Sf }pP ,WGT P=Ϲu2&ݏuAՒT2⑃a:d-cX2skO&V31$6-U !F$ƉQ4$@*z4Hc~4t+ K sտ}٧?O}w#Z6d>נ;(w@0š\o4?Xٹski=y0B[|G?3Lsr{57x?d[@&k6&8ҺG|0'Icv(Q=&Tp7繿[lmsv-zX@;8'S>[YIH$;G*g4bȭ 0 =#߶U`_h+!G_`~SG|55/7]dXY=9ƥc>Be̖E;fI3 V"(!-cX2qs|53qx6k7.AC6Im&AB@Z%)2˾Z3N.<tt<8緟\Us9ਥѪ$}MzTH$]̲.y=[FcG5`blU."kطofQ1yd<A9rA{X@ԣ~8c5>,e\ 7 ͠ ?ab̀eC˚Ʊ6qQ&r`A+z r>`MG;+ـŋ-^W#^RV"#TzUXpD-&3"PVV՗Gm'.]>If%qF0^+GL?L@e,cX2Łd *Gӥ2ˍ{'/(J^S#i1g+oqb՗/ꫯ⇜r5o^[ > R$ٰ/Q莠p, ׎noqL ֠x{|ESd'p1(U]V?KD) >1|.Q@vKs1v_m$z_j o,n)PqSg2m8aGfWh Zb$scbGzK>pV", !]b 3a_u h@(O1,ªR*Jk8Zx,7T'zNH^e?\4@Q#d9p=As쬥@~0#">(>>$RNo&e,c8lx& PE}M|@^m-*yh{`mb(hdVo 9gr=f9?h7V-JB|*A,)Y jn2sح->=K,`þ7oyFQ!Os_9'+ВGpmWG tҼVtfQ&L?p k'qn?&0ۂc2%403# o33%?ـ1'/bd8#WIpt#[Tt́iա$.@&h%h럽5\HhNUqA}n`8P!]ja/'4XʍO& 8Zg}"8}*G.iaR%i-m.QdK ,xbU%Fb8T^chbnt=Nm^0Hqq?e,c8<[ç8#ULCyPϱs-.SgL)@AђcW<9GuWb+'`ů|ӬP+$YŒycNfp ZW9઒EIrHH?Or-oymx@m=Ŀ5P:e\z]+uaPݯx|)aN6T/cE>9u =2n o`+`)AAuE @-n( f"NJIvO=%L"a:/"P0d[!;I_@_wYj]pp4O@|[MϮUu[ ~v*z.@l`v(^/ @ԴLJG >%8kPɹ+s20I L|5JAAb:\ g $=,X2efwhbĆ"FoL/":3Uq>t𐰀cw y˝.)tT^ &vy99״mˬTWʅVyeZ(m cpe^ؕ#xJ`](&G>v1w7e@r\DɃd4cV/ۗ(懇ܐ̭>=OϪ0+_1 B!׏O~`CT _*Dnb+QjB{N*4>~<^4|VӞ {!^AI,?Cf߱=m'iyL[B}3"5ֽjIx ;yiS23:Pa: 'N괙ahZږ \tPoA$8<$\Hl\cu+0snn(ʏGp늇h%t.cX2Q0Ugj|'L{MY@ʧ_]2 RJ[|꾨?Pbb4Z! |7I(|Tģ_q)F q r'$8g{ж@OGބOGD*˜)l11J1 IDAT=z叁U/C] ~~{{6x뉉pe,c35`!4RDŽ~6 .'w{TT^V(Á3p\1cY?#8`}9/"CpyX) 0E J]ݥsL1B:[[F\e;.x&ƍy'5t5{}xΞ2۠L"C6-L<bjGP s DB  eQBC&9;N< \[b2RfÙR`-I-$ݙzna&| e=fzGܷ΁Qt_٨-$CQ_aȦ>_WPnLһΚ 4,uY?g7˄\YZoYje,c8|g RxCH?Wb%vapBǹ ‚Jhi53rAH㎪DXlPޗ "X vMrϰCN0&JvoF' gw!Z#KFG4;  E lkN}aR?Wba euYnw3Gؾ;4v9 %n MFX1\QceV.j[)ZhDTQĜW}7 t"P\Iv87ˊtvg%iVE2R=)+}i`$AŘib) oV)t *nɞ(VV{dm0&pxE=W R(28KOH{ĝ+TAdXVVt<-L:Trv(8i#!ρ 0-cX2qx " 92#$HT=\EqZR0C<%@uu)#稝%Hϻ4RATU*ݞ t19м"R!%C ٢żw CQu9[[>W^f⽎Rw6/S#v_}ɥsOSSV,0|){eU;l&ot3Ҳx\5HV@J!|kZ^-`-wDU{|x'wL>vE*0H`bS ՀJ!23>ܨ\g/~T㡤@9@wٙHfٕ` Ȫrw$gZ5*P;QA@,h^ qa>bp5-9 kX2qIGU1b\hE9ᖒ;-vH086.s@Ukhid6uco#~fP@bDI-= վ;~t,?[<| с;hoz %P9w#P/ܮ)߱sG30̴e`,#~mC?p$?T ]%<Ŭ3Y%mD>QvgU<T/}ۃ7iGJh~LYIr9@6F̠ ހ%Sr/iz%% ݽDQT 6qa+*F&«sX6@2 Ig#B!0*M}n׏ Et( =j)3$h sUMUug][OU,b)E-n7]oohfA-9 j*@k+vf~Me,cX2mXRdҴuS=&c vY~?E~k>]^L`^k5d#0 X./uƼrTRb{b ?]6%HwXnk" p6MFtzqfc+J~ɡ+!%f@Y[_; Ց<u]E)Q ۩+BhuUKb/8CXhT~ՄXvq@DUSZB! P N^nQ.Hv!B> ‘ ̈́:v#UVa:yWI9B]!"{]qPvյHTypX2 7(Rj"~0m%@ -IQ* `9/_ƿ-pJ+eg(;+yPCyvCW~5^g×'fJ_=O3T0,-@=`)Q,9f0JmHq+,p_V 3bxQd{\& $gAqmw#oӌتFE. 䀘j^ b;9*Z[Vpmf90ub'wEOjKA~0F/?A#eYw}Dt7qa;wKT=8 Ѓ5¯Tq s)Nr53cu aQ5FwjS7!JGx3AQcɜY'*3/ J? ph4𯖱e,cN8ުw*?)Y 45C $ΧӿM9Ūn Vx=e֥<@H9BEb&6՛!dբ%/{}OS[~ɏ{Xˋ@~^"]nUQGNBn 1&;\Ć߬}7]s?ăZ6;?w3_M"z:VZf/O~+_c}xF0bSˣ{мn/\^hٕ8co;SqoI: N!դw'ŊT3A#ڎ"9xȆA%!VN)F .QVnu;.Ӷ/َK.0gC 9 ាw8lV)KS }1y>w>`~4=k`Í`3wjAtTQl"7g-'s'!8Er`P!E*g:$T" oX)>b|OA~C2vOo|vy ).TQ&0op*ELQ#N`c *#s-v tp32u&UG@|"^U, tMG\h Dt`O/`J/83q:do}ߘ8/ ziJʐ?X9h isgܩ8ٺF ᖝ@qZ_;© 4v3:ȭ pK>>(j+V'V2e,cD{[Ybl~1l-ZVGX `zV-@&ȭ``V2"OqVLGϸ> cL xg`fO|—O`z;wS?A}3CL<H5,0?vv;{ڎ.b7.W]iv7lǞk;whQ71?ff7?Db{ޫ.f{H^2N*ιPz@,Ny?pu͵^V;}9#ϢFV@żo7E,&\**ASp-mDɋ 2 ,l8GD4B$y@*g& :_ ݧD=X0pE:g楏YǛ6P+iU~x(9uQD A{1?au.ܽ%464x"S5 E.̳Xზ:'"ړ+$HLrnR?CWOk 9 @"dT6zmLj0U8 HF rg6JH3iu<%Twׅt~D`[u&T(iKR[݋":Aȵ%7OR]:,cX2q*gXgG>rgډ!8u0 ײ &Erx? I$~3ԭ?~7nVu t/*]̏=7qv;v\uPq |L~}X`;N|x01+u*_ s,n.<p82 $6cNti!‡S=w+jH:a?zt;,ڪe={8$hϖFf".Z7z4(K |R{ 7KPiaa`-cX2CpZ^H4hlHڗZcn^xIcfz+E #ibxOX !j!"sS<(0c~~_SN>~מ&JEtҊ΀%k v{_o;\kp%/`>=Y|;W^W^eػx_!δᨯ@ּ9; (Z5 tĤCG]3&V@ϋ*<Zwt/hňt=X^1*WHEI,CF 'G2O8X)rM6(` P(]s`!U Lq7͏`YbyV t P^Oj@I TFGZurܖIxdĪJ(H( B"B11#qrʭ 胂'$wjX2e,^ܭad_ X 8f 2˾h|:hf Y0Fsp[Qs<s^E>0/r1 @R_VIwƓY!>F/=& nE5J6J#$. C7&9dX7!Bv 4@ڝÄ^|Pɣ"'EjOg'z . [4TqG`(FBPf ๩bsf} dW E\)*4+_[֋Spx9{Z:Yw!/+`]lωw}~@mW`qŏَ={4Ęm^߱~^􊿵?W9 :j0f$$AWd]y\!@$RȨ 02WDhvsswO*-n3Kv$h3aoMkڹTlA3w5 &E{OH/\*6[,*rEhRrR,` pYil6a}yW:w;{Nǝ`8.v^%y˟{!r{MsL9*y澛=w~e^/fo~{mjT@ڔqrXxt}'AptB&7S-Dnksw>ߧ\H @/y+0G(9zQ;biP*^*̤IzH*:Dh,#ŐUyHZ74' p=e`:Pūk:|T06 s ,3#vwڑ=TN|vl!# Zq2!J5*2XF@WzXamDfkQ#GaCzJvӚDw\.Sn {`gݦ\7KmSpYB 3S"c@/.vй͍;b/Qe\=ʤ4( @}e,cX2-&O:SPppaqCw`9[z+='RT~38O?9űp T)x T'@(ř (ޯwwO>ſe'?lbU,cH03qU/G&7Mof~f;4;ۿH#L}{ k;+mWv\~KlǾ0w/~k / *P@G+ u=>tkMew_ 䔾eYu`oy^AdXTA+[C 󉻚hjb΍a_= &%W+fv+`=u.- 4܆}}bI$ݧ݂ZS4Y/uŀj@j/gM{9ldII_Zh`/zԎ"?Y܂L@;oXMyy+t׍҂Zyjo*í6|r66\z+V[d'v>::h[h it;vk1^tFç @*M.VCsY KZx@lB"e׋.,ЂT1lUCIkHzБ- \E5Z6PըC5JLH| Nώ3vn9urKH=B_ e,c?0Ch-J)%n`E.:H![b5%?>$Qb5>aOg؇t9WSw{Fќ]ZH*N1!mb"]ćh6tS!g @N֡g>N=۷ߞuD2}Hgi~3ZV)os<9-\6e`ρnL{w}7BQ=6DӁ hap Hmc(:SP;š4Dǂكʦ+ؾ `ozdvZOMHol4Q4}Do3i lEP]Hߴb,m`EKs p.MI)+ԒmF-Do3ڔ Ph"~V+x#S{,6{Noռrǻ nU ih{ QXf-3%dAbmw(+ m $e`=1t~/"Z+>xn덑`PPǨnfaAea^-cX2c). w8ǂ ,ZI֘" c$A4вwp6E,;8I75YfLHhc 1A؟=}}`70"yyLܘ$}c?l{[,|U#@=>b;<! nm,1Œ> t`SP&_6C=1V IdVc/5v7,\4tm%dнpւ7H( `ܩX+*7#COy=:b5oFI^Ll qq6ҁB"83Uؑ &8/#swS 2RVi#X %!D͇iB$@b b@!Y*RNdzș{X^. /TZ-_pN[\* si[['c.@Kp;б r HD!p{@Eհbr2d2H,`,=*EiMj;`L=WОGza[m_rD%wNȚeΩ*%&QB` +B4`B#:,cX2v$;&E{ICH%]$&U+(M&9zM2S.unh!)4Ɵ+ㄞ1g '$>n Աq9ǔ6@U^RLqy>/l}i6B!p*V_̤7i:z( (,֞*p/-R1ř=*8ےf5ޮEZߍ 8Hm^GNZi'TMNO)VQGYu3SQPkX2e*VivԍLsŞϲWoN^QT w0͑-YPn+5)LtvuxWRWTdsBcWT4g0{|",0i߹5q{Ă8$/7#DPK@UNU й UjPOi{Lt[Kҹs-(e,cX2ב &"<ͺ@L 9F4i3s{\ZB8ݸA2隠/#P,S6aIT']3; yk$G hCЃIз.{>>WܹɍwbZ>[w;ÏVuk .f"xv;c@*r1ُsRj[irO)BϹhf Uo~۸E$i^%I &ї4vwr gv"#}oKK/KkٯO .KP$>"0<*f9ދ7źF,=Nn/O~F|3s~~ۿ_ѹ4k YN4o4 "B9ʤ 軶ٰӡ]&P:xn+@Xy0)K0M:5E9 1E2fD}[D3N~ŮMnE }XF  .O{y=-] 8-ĎԲ+ Ase薁3T'ԻbXE\BV(P8=@8IS_ʼni>wDmDq.-}ճN"J.`uKn.ν~ߤB/ՉΊ oydKxyT0NJjn(.z+h[lsa!.#3(zYϊyyEbVSQy_,}X2~'y=8Y]*"MiЬw`i).H7(1j-'\ezckO r *"wcC1vvUai*gǜvܙW^uN蕥0N]A|e"V0*ߊ?E~Qz)-LM`Oz9\}—^o뮽6aQ *V屣=(LyR*;u'p5Js#g OV8)~ q^-vw;WRm=,0SPzyK͊ȕ 1L Z kiE{XEbVz#//8gK|-b IDAT<ܔ)`Y\T pJImzbyf`!I18Hf՝ꯡc]^ZDt7SuXEx*mΛ&Λ**V9X qxm8W-2e,cDD8lxp] glM(l1ߩژps2]hQ.LEJ#}\KsEABmMN9=nqv;?bwm˻KMo?^WPPY*f̌XXzzK?ᶻ`\s Y7kUnN(49@M'r she,aya|IAY\uu>B02}i{D9記%µ] صX%c+ d0l=:\b5aX`TLL2e,ch&MNވك<%wT| żæF6/YէV 3+;>csˡJZ'ѧb7G\l/7Nۻw 5fclsV Jט*S?$.^?W/gUX~2է(gq!;~OuΏӪg/)k`zw~GD$x܋m5Z^ k"TX*ȉsSkTw>_s ]>!+ncasph[|j\6Gpˆ=0f hϷ=fOKل]J Q-cdF&OkxOۨ إpX2 Imp>K,xc&o2٬/rr903Q݌flȦp|^#Vfi?Dztŗ[3?l||8ommn[ņ[uaSK+3 /vƇo=>_1І\asi]nh)?i277O~`7YLeWz0UKC <>9kxu̪!́L/Yay`g̵ipUA>=#|P3֚Z2e,ccb;EC:q<*jADs}t/MƅLO=iG}T{s?y{nx{6LjA- |:~?av~xm\x=gKeZ 0/er66qm;ٺ7X܌j1V}3~,`*v3u߇=1~$DX + 6VϞ m[Cm^. 1z+ܡ7g6`7tO>|O1߫`] ܴ leNוuױ٪ 7 H*X e,cX~ PjOۂ.x7bV| dO}-u+ ~}{O{Co-U?e駟ynn-ؽ{=k=v9~?bxw(e#Rf9lVTgyv+f̗s;\7}XDKΛco?On+hNv{}nwmg_\kpΧ^f?3?CPbl];3vo۵Rk_ü%C4>@y7N7 ,ێzvl[/AUlcX؛zf? - Fq i3bK+n-o-. 5M/6|i^n n~e,c $_%X#`.8NC.\|̓q+}qkW_s= ~N?aW.|}?2..wߝXqn~ kv'ʾcng|}ۇ?|j넎 6mCssvcd14W8!ͦ{0lkg.q``}$o5a i-\~ ֚_=: &Fjak@jnz L|sMέMXbg+[Vt e,cX٘ kCyIv7o9B|mi =sw;nwmכ^v]tlQG5\gGu]}uvo=_7nm;juQnm$s[y\ Dy)?02Y 1! ').WUk}oﳎ^G'^{s֪UU?oߨ~4*̝!5o>kT%5}LIp,ow}&9vk9-Ytro͆ܠH}] !ϯ9EɯG& \uWYg8;o7uw{˗Dp_tg<xPp{;mbUxK~zNq>xurIz ?W_? ?~%N7ۿW}OAU |NJIqo >gч}8o?O|=@<և zκ6z2gw}"=#xPl;վR\E@~Yo vޔlfxpx nX(?<ބRH Tfy88w9:S$ޯ CnOೖg:=x3?5~8X\sXɳ-{&~d1cL͍ QY[uԶ7#fM{ oGo[oW_7+~_OO?YUUU??\ۿS~GUU؏X?*VnC1?2'Os{P&Ð -%A`}g~*g2 <3%c5m <1j=_N Di117 mp^+@܈ï6@nP!ks.d~4bm7<->Lӥ >CNљ=O`bP0o#D3XXP$Y7xހ\x8T&:u5 nd%V}ǎrSHI-F{(jkةWGquyxn|MoVoV?/X{GB3HWaO/_OI~g~Oqq{dqI˒9skDIF(A5przkPob'壠&wZsݚQ X1~@x_ Iqåy[x>`t$!*.5Un:`{p鋝YB8xrɸ 8;Xf9 &HPb8|GalώÝlih[ڡENt`=HB;ޏi:S2xO|M F88yx3`VrMB-&]MВXt\Ґ b" xu<0L`p8%4ޖ;d"Ê>-~RH+j#T;x_Bo^w// 4;8 BAor_j4̥Ix"SteNP8A4l|'@?H(~P4rWHI8N"8)+3e-}||ﳟ y($„ZymwmF xI^&~} 0t5DNޓ;σ B'/_`C~K+3X0U Ů !>ڟ`~9wO!4vb,{⫓^'AZH!iCL,+0`9@N41Áonw}*~fxx0M^@ݼW w>x3A4fa H- j7nk46pj}$_L:+$''Qd KaϘA﵎b)o@Nĺ_Rgͬzו^fU wNdKS'qaW[_vd>VًqL(2N9d;>1¯8ϑrfz`.uX3~#GO,lXK#cq1NYSNTy`a_8wn(.egEe?1G"@@'vJi@D#mH* 0x)W6jU&%X` Yz> d";|".tBaabҮu9T1 8'ʮk2A!ohЕAgr8 ڡfq>A. u_ |nqέH+9h9wMRSgAg<x3vbbhҭgIb )+8%S0ɧK> pHxssgZDbk%jPMXC4) ;zP2G(Dq͋W8X{ Odc䡨!_O/< Ikܑ5AfҬsp7 SΉ0|J!_Z@txsU|/<^ vHʩg7>5}X< ,y ^X:=߁zdaj"(6:@ڜl`$)um‰dR&l=/dC*yÁ_c60! B~g'p]0 ; Hu}(c6m@PajW[_c2D9T^4׿s]+=Pu>{40TYjbE1%Wө^\;Q P0a[a}rv12!1 ց)l?rӟg<BPl>u}oG[ "b p(@'\5l-ƮpYհ󌞣TIWR1ŘD?7/x}%eX(ZbY Vh;ҙ,++]/ "gc 2'9딜P(TRAexqx]v(W}GBTعM5 +dsFD)c?N6V׵a 'Hsw,$%*qLئ~S}Z 7PޛLRd7@Q!=S+۩s($1_)GSu'4d3c` 0lŐ${es.G.ɩ<hW_Ô$%8= E]D Q0F_mD%^ Ѐ2gOa"Jx?ᛕy =hvmJA9w%5mڗq]C*dD,vi Yk=ؗWs?]d.K.u97Ad}Xx3gl* Ap}V##H8&w\^0 c{n.TkP^0,,CN#5n0q_S&D"FFО 0@9v>j{j9 ^QEcN Kroc"ھH*.h2Υ`4ýXrqT!vC(g`-^zq^>A914-l1hH7sOB2ia[s\C'jd ! wXVj8*t2`W3֩b%r?Jʽ־?Ou^IdE[ܶ HO򥅼I۽YDYڧ egjb ߑfPSyFUWl$ (Bh/fi4>CG}g<r+Okq=n } a)]._KW)ظs`xk>$?- a ù`qBfsCB\ ٔq4OCRn)1 ].=ˌx+ SD?FDTCny?.M$չTo8(샀30t \፷%W!pծ蒸˜%ɑ{X0Lb\|D 4F/9fv|ƨ `̪ypU7褂]. avq!³C'ڀX@ %r!Ѡ~Ra`[nJ8`l%peÊdl41pP+pP1v@+3,4 aqg{Ѱ :KjbHr}ߪDpkU`n^SpɆ\T5g+h H8V~aѦٺڤa:Sgf|E6nH [})cS**8M=\=JKj_kHGfn0g<_>Wi޶.bs(I;hEWxe0FOb3q1_,KtK%h[Wb?ʆ ?{fBR 0UuX+riIqŒU;*+i-2ӹ^Ɩ)lj3$="ѵCv1zא)ҚVTI4Rƒh)) .)_bDF&kDJ}cK8`Y 7oc#M<-69x16]6UѢv,)Ʊ]Km*޶򋲎eCcJOf ޸K-4!eo7 `'%Tfd@vꋢI[ '*h8chVa`la֘I&rVp;Ti_h&ez9:6uCť^H+/疔F.pf{jU{0M5-%}@GL_}0 n IDATcFC)GzTU͂i̲mZmc73FLJCDBh>K[a.)&jlQB|-O3g<ůYh/ҵRš{)?,r9UzY\xe;`?Mc$AST]R+HFhӡxR}&lLce?HX-TpKؔ3 ܄m;х2TwSƇacºue)ݔf~][I X*'PHvvAfPIN[VܝJo6K17/Ņw&7=b'F Bk&Q&YܬXa.{M .c4:j{vZ9b(mۥb4ݚeG|jQQԕ뫴Iڷ.*k𶘗V 샇nH[蜢V5Ei^sm0Y5Wĺ7]FZ-tRǙp}+~EK>! d#, xJDk ~YQDqSXJW,|d9q›.Z.jۏH̅L$WNlj@m*8!1^*Ɇ Q騡탴0ZEw=̣b'\KRv; Sl&juaաwVJLiAi$TC h"a{-$v x| V(Ǯ6wXUs:cyL/-k/F T <қI Zw-6yôt&a9UJ?kdQ!b,|M /{ϱ~ E\ ,YV4DJ4SA(A .ud"ڕA氱nkz/{&;kko]9\tfh(#@y_.0J1 ( c Vqb~=Ct4NNq.?; \k}`9*һbxUQQt^ۋ)"e;e2A2;@#!"[NʨzB@ʘT?][ OBD嫊k+Og<2/rHfF9j`3jn]Zla[I*Y-;FǾn~9Nc"^IK H\ݮi음6N~oI}ĆKbHM1ϧy1[ѕQZ]kFV! 1T0Bcjۮ}wìҍw|ʬaslQ{fYR}a5;O8fAc3.nS+淹mySI+;p`Ur( S[jhѴQɝ\vI"|c6dx#ɲ]EEcb8QOlZYttPSGhX߻q~/ۥ:Wd~ /gE^U'c6A`BАS1+Q?( *!N),CFʍOAY E3S&r2=iї+u5,d0B}Xձ=4sW0BŊ'تwӁ%[ 4'*ʅ% Fd 8ʚhzOT Df`A7F&+Kpxbi &a88@>ZJQ+jK]VMuźh2ADy^ʘQ{bGc,6`xyzF"1{ Q-ʻkq_evݶ:f"l&Vq\PgxqwŠl* F󯥥34fh犴N/[\|*V7XY/W5ط 2-Jm$L<$+ɪ- `MեP!9dk_1 #qn:]?~k.'G;ϼKG.ف* \Nܒ&Zx9hB=$' v}׮ \-7>gvU 5wEB 鹤-6K蚇FM w(]4 e&ڙj$S̎cޟ*ਪ]DL$Ď)/_e)f&wFy.AS!kfW+cCl4wh]51/O}${ :^kirjrS2[>2m Lؚz,.壝&Mzu/Mܠ5s J)Y0Z*N:^UA^\=d> $T}EȆ[M誂HDV2]  D s1UQAܕ<-#krS隰SC1٢^aQXQ`,r2#~%A ӶF:2b1{l5x`=x3 ]e|(_5[x%M 6l 3G$0){{Oks$؎j~; fԊaeavel&ؙʋm.^a ^Y RlS~x'])¬cw `4M)8hb`7Wc%mk['pJykD-&K#5we93WA26CWC20O|?[5vF{j  ߀,̘ ~tu6Jߧy 1P2%N$˓Zhe㐥fg队il]s3Qmpv 󜆳be֎ZqŌnПZ|vȸH;=[&V7E9[*Cܻbz@Q6?`e? sϻ ƀu`ۏwf#*GUԒD+`Ꞥb@sw1]BFVV#4Y*cgV^jQdѸ_cǕ'P{a)m 5* ?=vУ+aiX0Gy',|_ș&O,&3x.vR4尿Bd7oU[vekȡrgҺo9mMv(Tх7~WӆW0*7j4 ~j= N^0M!h-cAL ҀG$j7[ԤY&B:l }R_vݣ-M;5Nqưi9L_\hxp}Hc:QwK;vPe؞iAa>,T( 2!FmMO}B0'vj]xZU;Hh 7PolsL60:Zlg# Ptg<x3lj19,v: w$ȳ~e{ L%Ž.Uf+Rz;eW]'(,S3Vrg cAbԴ5v [ʉC/ F'땾,Zuj 0S^ \eѹJ) g<"5ׂg,:I>"0QnQژd;"<&DQJIw_\)FpHN jXԌ=A-4s!XќhA&A $}o\v@[ybG59}ߘŽ[E~ n H-P6.#  N^3$(ԡ!`>m AMƧo3` Uf)X}i)& ƗqĚ`̹v|51 ü9eiX751W#:E.S'y3g|iA1Ly!^4cꌙ6O)C8 [ccnQ:5 Ix_{?Xa2փ7z 5 p30#A9מчtҮ7[cwVAͨ?|jyP<$D/7ٴ13ݔd8_ý}Dk @|]~8-@ӊIghߋ9OVXMC?TkpV}w611-íM`tjle& Ʀ7 s3tfk`wg<x3C7i54ED 8xY]k9Y' M(-Sz[I{MO /Ҏdq!Cs> qM\߱{J|;晔$ܱqeM64|gd 3_yP<瘼)L;&/vм+ޝ˘(q}'Ϊ? y]:NǠ< B_ 4`lxpldFQ䜀<"3@=3״fٲkz>FSG݁ gɛP{ri0Ww4O5(iqw1V#q<9zYmǻ'jz O)`΃<+3g<hg$DŽ#Mp0x ƚ}C=Ť8t;^qh؋@4f:?Ĉo QMq=an Fs"U]X5b'%|nl}pX*-@z& Q;h,8''y%j39Oenppަ{/9b }rUVB9z㼓?m9"]侁G`<01|p=LF@$8.>K֛&3˫oE'@Ёȁ=G0 #|d>.'Qv<=ڒhB ,<`Լ.oڼ[LlD;egn3+}; zz/( ؘ)2x'y g<_(ab)j)=k ޝvE?V(9^1X|ZcCuH[6ۑ{)Muv[c9[+?|ѡ/FՃMpZns 5M= lCЂG=g<Z1'n'Me)s*3c Zr; f^1O6`٢^bpeW}TκQ=*wqq8ߺd(8-59!D n@=h9CգRAM i=~H@o1}y\u-t esǹ _=x3_%6!zC }*<$iqU)eLv( ܁j[7P)DF&?ǫϩ^N Ηv#+dTwa"4M1\ \T ^]=Ė ) 8<Okݲ  QXWf>r#wo,,4G0SPr碰ZǓ 1D0 ĺ$ZF&docd:F޿c4DC<֋5I { L"*&"әP8] '`:?QKVaI3KJQ\@l`J5joFH|W(T EJ, }7EFU#R)87H_׼9*C(`> ,Hl~_sjv<π~y%[Z6cO*Y 'j ۮAh$Bb@p6gFs.46g<W Rwxon#vcrgS"6EnW3 ̦8<} QA1g8x@-*Nڌ<֥^x#dleBp;A*.TC6deÒ{.I:DB cgb_W"Z 5Z /ڔ#zyltV^^:Eh\='r,V){o<A"=6dQ} 3Ӡ}mK-4m?ON<*n6Cn}j^0qר;8ȃ5]flVixh=tAׅHja;`)( aF/1XUGw1JQtl 7̡2Sw{/hpi=#b-uh .pJӣp9(isA٧} lt bW w@RFۇе_ 4YQЫMfԵJ@oX&&w-RtU <*| v'X|3g!U{8kC+,`2j]G=;+T &)uy<|7yV=Rb))V"%pjjU Cps}F;v#(֨g=Q= W'zy!L.iSj@7g/V`+|^ZH7dT8Z8SVvNSmݍ$ܢ#)m\'5x3g|g)Z3A Ah)L@+}@ TPk樻r cf]*asP3ZL^,v !]Z%y`k%]!-~Ҫio4!\K̫EzZ*Y""NvQ,?X>^`8d UQt,)hoSkK_2A4] ĸ\B^ؿpE:#ą 1U@&3$0l`/= *NKJ. %}tu$Kf'n0f%~*"K, M ٠|^)g/D-YPh|Ig gaSH{MC6f\F]ҡV)MQNmX @im(`jw}Ƹa &߯,7XpС9yILKYLZAA7#--ܓ blA#"&em,d})~YWzy=V/-G/XT(:@g.{kƁ!N&TF-P 8Z+;Iq`L Fu8QA=x3ly>>'`/h@\4Q.C o*:8[͖X&' o0#lP>kH}Eup`7".WSbWx-|h}qE{6 |=(!~6k-:L}ß1ˊyh"1U4X饰Dz*3Z'*&@ 7dIO5 %l暿u݇x%C|\Z/ydH" {[4 (?|YglL|[7ބs&K ߔ3kjhk q/ŰLK ey.fKjw \ڔV /^uB|x1Dքl|4xQ~r.ka2 zU3"(^e,c] $YwCwZ3"ڏ8Z[L5ȆZ6A]~ xe0f+Ài@fePD+ WxZy VoL@sهMt"|3g|Ɲe&Tb("ςFl.kK4ŶWV^(53"ACY4/E¥uw/Jtmf/:7+VLvq#79Ľ 3qxBھN|}})=%-;tqnK,ȥ*RAQ9CՃGh!3_߫.Y[ +':]۠q#A&~a ,1C'\O)C[$kLn|1PG *r0gUK0c>x@8n$pwh*tb \dC_Ƅ # qԪW=HQ0pvι+a9`l/ ؼjf夞ksV>젂?Q`l@vur{YbNˇ$>#`=x3K |4|^lmF77!yKmj@o/Xbyv*%1YtǶ{]O2WZJAf#CcF})^@Z < j_2C-"lk ⍫K y=sitb;(2J=W1bff򣽋Q_PL7@uB$ѧjOQihΈMPٝE5,;۰Tb}bO=vaW( =Y[Н :Ě09VX^-ӜfX6Xw~U d:ݚ99Y&)3K$rZKV;^HuDwy$ ^ Hfh ˈ'oudEPmB"ךlScYFZCr?0JJ[R]_Ra,#|Nѹ2턺$R* (dVAWF`An|( cEw4`8/ڼ6!?;y!U)Ä{ ׀B "0KIi}6cCS 6 v[TZ(=avdRo<3g< bN 4,DCTI3Yj]<Z8U`e$+CYHCJ%,!bc)i ֮ma-RLV vӵ"\pV'VԖ,|}ϼ$F(pPNzRb %, D.& L]ohw&T,yB)7cvz\H6j Ш0mb{[uC"&sFWU&TWai8azwdinf}K 1MV\]{C]~è mMB'|nxa=rXL>4j!l5yKZÜc}{uAӊdD~dZm*R <\iص=I\̾Z s#**YW]T>Hqfx)&ՄD[setm+zQIcro:F-KRѪ߯ +¾@.]bZc2HeԘi# T{ Uu5q%obbNZFӰBgT2C F!43_VpTeF)b=Z;z3g|1$^b;F黒U10S,a ^83[\:qƠ@;sjA`lҐJp;z/$gjR&-A$^4V&ڴ ab#B2ѶԕwJEuh;j-JwV6Brٹ}"hK!#V(4֕o:fj+9 5͇пPMDEE*eP]%u@!iqS|V:cFNqphQtF5F CsB&ʤ tBN`/8r՗]Y>|h7{$MMyl^)f@y R٠:M5hѡ›1ٍ,h< 0Y.0C;r,p}_шExkD#2Z3eYYD"7[LKym^yt¥M0֎|oF:";pwuyt"V Fģ |3g|2 `` $zɤd}i gio"eãW N1ĻˌKAĊe#gt0)'5vK`!fR8r-`mqdv p EUH.QHHvĎ;fm,u |ͧX`5 LTH<-gb9s YM&4D (0QômK2!E$ G Hyh&t^U?r«"~.x~!:$@u V[:-c4C.?hv;ɺzb&mxZi~Yq{le=},S^((,"ʼ"~4?`(E*!IM&|{|u:l1_,rxwDXkzc]2漅#( ܑgF9 0t?/Y7b܀CQv܀jrN5`sBR;`|o6n]:$L[%:W,8idŝLkذN϶O fn@zsf wAt> Fqs?wfw.5xif wN ;w}%v7c:怫g<x3Cl]K%z=ps~Azg=p 1d~ȣp݁T0H9&d5Eχx㗚)ヘgő)&L<|y?ߞ"s@1#8Na}7h=5qʋ ?wt74[A7>2vi7Hw3D8%w,ɌwWysȜU7yGrl ]fc9uwUӜmU 7{84ю胀m09^w݆{7M4&~2;g<.fs 2ƺ1ĹX57qt`,&D71]&Py&G oFL` `]\}sɄM^+U]7CXB䷧rN)k&v>>7q<$\'v\k&sfIwJ1 `Nf/XFwοv5xg<xwp0yC2:aY h8ظRF3cX A=ps;Oc7zSὝ,-]Qu_y#ufT*cM(Gcab9Jπ7c!q4>Cy!gnkvĔ4Ly<~=?Y4P-w7cXw~E;5'qgvSvlFŭ{8c(6lTMI>vD/ճ*<W/ע=X*!a<2 -A`unꤔ k->@|I8}\C&j-3oo=yN(S/)}ƻdDız!@ji} Uq WqbsGރ Yu|lϑVZ3:3t xBH6w5#gXsA?<5g*~qlˆ6W{atPt*d,01d.|$f@Zബ03U`V\" \K@ vng<xwc|168qΨpUȣR62@usӊsC|K!?ɺ~WnދZ-Ch+#}@t6@pGXOg9GY;t/!R _'4fBI<9s8%h(w,筏CE5Se94 =rZ8<Ϛ;ެo)%8)nLT͖ZQ. 'MMwDD?}q/~ dcZ2:ӌnC"F8]@JPEJad}La^)+.s{G H8M aKiQӧn:oLgN-2ٛ%j%l{Yp^k͸%d&4B땥GnKE $c̪(o4g<xƟA7cdo="R+WA +BĆgw mļY>8⼞8P f7i7F-8LlJ ަ<f&\)viP8jUqcBath a r;ᠩ4F[3 4qxsrKLD:%J#}dLpwkJ%V0lE&ɀnP@5&0&9%T =1`foL;2 H|Ĉ B@dvqE=Va'LImÜAe ;@6OqLoL66!3\FG. ՞b=x3[;H EV3E ǃ5yNˌg 'CbNyFN!#"`M@yMgk~ ='+;䡤ɣ'%PF5 H~WHfbmRϘDfㄹy"AJY{GP5s_ E]\W~y TsM͊;-M]2/Bt~6`&͉y5i /+%5媟{|fâKqS! 堙ISK{9䜊{؉| ^ `c:IreҐ{6uNq Iyl0‽O@-NOҴyjmKak"[7Ƙ#oz,$7y `T`쫒Ùu-t`5N6G;nlӻjd/xI1j|' g<xwd+`Atba[V Q*I5P1̈r.ocL'8ՔC LM7;WOB;16TA#"A 0%DׁBJynɪl/S~Hͦe<1.sA~ό>FqvLD gC>J@U-\;mV:l  7%P17-V?lDuZ#?(7/F$h " *=eTQN|a aꉳg@}818@?E`R)"LV(kJQ=ѷgbE30R\ژ .=WjFUA=î 6WI0(m䧊6674H{!3\? p8~a8x`=x3CS1HWn-P57eIFRPxN@9 8> -*i.g"R9fhnhSLΡ՜/ǬBXfs cLSCL:@6Nکem.rp PgƎ}9>=/GSLԡ8^֐653dmXڀ*X8ဌ$^ +3=g hqd~#6) {y8]ૌwXXL +2` q j61*Shod-Zx6 E13IE2Xv$[Bɗxl?yD(Ea=! *΍j7,cDd&YmdC12K}c Nߘ%P&ܥk?WSҞ$FX5<5fkkc3L4elb`~Ôbx=&~GKMU퉨NNΡ:0њs%&bɉ~cύ|D1x'H t5`U[?FUswvm7~;hΆo:1jhDW9ŝԃOZo ,^i n#9"(=Q A(' !!}3g<ТS㪱QDXzʚK8H{_'(RGsϖ "_f/fy ҉,33"6d(q!yQ~+8&H4C5<ڙCi_d%83*|8RNnm$8dw|m_8e9Mc< \fu}Ϝ}|GqI_*;Y&8|xڴxB +ttzR['MV; a7OW-Nzsu)StU. GpꗵJX,Zu22l$Z])TJ dmWUĪfuW׊O`2l:,2 >x3goQfÜ /Dl=NZh W,XWڀ@SYE@j"]9y1' b>Yҁ-24ДD6#-"Np rƓ]/GTrw )֤sS؏.MW^w]]&sfp ۇ6G"ȕ銼 \bYsN#Ѳ uwеN{eؑl= ;A:+"z!uWߥpR^b0p [T }so8zY#C$'šFe7ܮ39J9 7 ^5 ܉6'[+Bs;pwj1ǘBkl_kBfnmfԭ޶9ð(hU_\x9o9҈kʽq^'x'zEX BѳWZ T&% 1{}[ˈTW)Τ&-,?}3g< 0&F&Lx,gTda"6b͎?O.v e:fUP<#hYxr_+ci" ;9Wr[mC%HJ׸+/䐎SU3 h ^"ATҝj NFBUs%}35 t3dUP LXnSC!?13H *.< ' MA1@3-{idm,Cأ]# j#֋\Grs#?6gYfK˩S"*EEn &py@Mw.tvzBaC K΀g+UDMu>&ߊМwq@6[6,eI3~-hjҞVF] g:x.y'.jL za3Dlr \@E(֜Back$Ǒ3}DuZHhYS=gحn*Ì&|`.g(M/װڥ4_脵]`uF:Vb RqXk W:7Ha^[,] &֚C~5??(3g<_~378;3PW3)UWLOr&^58TIc8I Uob7\13取z5ib #c{(0nR3evg`K@@TvՎkٲ]lX˧fYDuwzEDW&1^odXaBhl C%-,N)yN-_ {hl6Y]v#(JzOSkkw6 f&컁Ba?-ɲm ~1ZGKJ٣vK)ʹ.ҍ_?oJ,.H)hQ 2̔ T 6QIHoeԟecnO锈 ^r0A?S[lUx2Gxm@9dewN(}Jf\ t]00`^W\{ՇzرYO{̱l=B=ګ9Y%jj jט )`gHH0]9Kk)T&E8gV\?/( EW-5\E &@sB1zYט@AQ=QEemѺ6'T=XJU5i1褻n M^A\˵F\(-?Eiwȡ.ˁ=XeϷ _ʳ?,D2x om ѾXmrB[.2p+DG18s> PhEZA0^i6NքHA}fYv6%.ZpY!XH~nd),5LlDIle*4-מW J!רRsSIor=jhx@>w`qWkҹ^S_tDqW1CsJ~e},Vx3vb.(i2 .ƂyضKhz4-"*,:wvK ]LxJh"̳Q YXS!wN}6ڼ;H~W%`LO뙘FtҐR͈.fcى) btZd. 15r*f",wIV)&zyu Iq#5g5窌Dt=2@$>D7Et[o 1zv<[}e\MQln8!R[4zX%,Yd&[DaU@ל`k]7WzTp\(bi%`wM=Qܱә& A+G. E;_Yr:WY%3 YoB^\v\[9,`$zTδLQh`,`ؤժî4oRVha\7nS&Up';Xkж('fX=R ޺:"w$?2,f./L;R*ۼv{[HJ3n?y.ozV8򸮫ZsXl|LxT] sgJܬeoI )`߁h>mg[f<4 802̮$/u% hßi[Y^B()W?4=bh[缌T[_stm̯lk)JD*'8/vB{ueeqm0Gį6w,nB* M$|i]|j*Rն5 J 5jR$m3N8GL/PdF/.67bAExjA[%Z(Iq|YA3P`A7bE*ipwa3!ř˽z^-&͟ q\sB(7vmyl7U#ĮvO4>t3U Ů봧W " m/enaAg<?ذGy:21)+f4K+ihVW)&b\c3[1P'ZzX-gS%;\unUp+DR,O=ovk ӜJVcϟ\mmb̞";br354ІʦN+@CW`+L0ĕz#6`ət%\V[3Q3芉Ե,ҿKK`[PcoY6aKh-:(ɖU(0]2?t._ ͋/a]&NWp!Zt;%]M8cO(se%"9I)+^,knaংx( 5pَd۵u₧v*ޡG*uBq5{\j7>t"AM:@d\كZ?QW=u%VV Q ;Gi#|3g|˟LA 3L5PU NcK!줊&$Y h`5 Xa7PZ4濘*1ѥ8:ā۠6 eNG;!U+[, oA `i'G V53"Wi@*KdiCŇ^dvL]\3 \]U VԞ*Zs؍7As[|YŨ&W̑D BpPF>FI׫܌:dqt/25z>$`ޡV0bYo 6&Q'JG)UMA*l-^j5U-ri_9Cџ#$T 2N6s lҞ vKlJN'PD=j t a9 [CP'e-$+ 98wKQXGn džP5kC wtb~&{nhԷKyVɞoC `06qDnF8p#Оײ>Zu1)-ߏLVjZ,ۂg<Ǖyi>c$xAB"[j׽x6`Z-@ h+D7Zakq f`tX\"n7)&=D ڴ.ƃZΘG`MPh5bB>mbi&@\Nn8EXhh )VlbxJ`$D@ͭC3M?o9zD5%-P.d(` Т jضu!0hqDjۢ´j\9Uz@AUtSM |I+ZRx֧?5^EU3sE ,E-Ck;n.Y} -Un83P٬XPβL 2"KE,^Ϡ:>K'/|sB3 )~ a^}i#|3g|˟LYylIhv0`Jb1$eLF0BsNeXHf 4M5F@x=2!B0gI8yg%GR(b1W7>> ¼ܛ=zږw :!$ )S6[;`E6FN!"u rveyṿ#p`.+v}JU' |ގ`!LU0(&z_d j{W]dͫ xtevD/<3MEK.`ֵյC=Ϻk`vͮ }׾o=Sb kWx{G; q=g]?؇U됁GJfZk)kSr6u ַ9S{,S$f~= W&@}/ezm?ò$R= o\+-v @~ZF5!8; XΓb|ѿWЊh7;Ag< znʃ@Ҙ=6K{Ґ., U>]`tYKB$Ctƶj`8 (@]ө"nib"a&hefHm>&UR"2 (41M̽fƾ'0ʵ!W,/"˘Z[ }2*Z?%?,`>U `4ɏ #wE#sbBTQ8Ņ0€6! ؗ[iE_pڻkk! H rk !ʄZɦ%<% $@?EiiK.!٭NV50KgjU;n*[q~C2~NZ(chm纶^Tn3A2kww C +Á&~փSs {pt &zUڡM =bw;'_X\emE-Xy) R#v ԫ= ؗ`'-/uL'P!g<xw5dX!t%"L&0Ek cB 7hg*AŢ˫C`4iGaQ-9NEPMbd_D _bXic jC:pR=>X;lA"$#ƛ%<7]:]Lli~4'rielaٞQ͜"` )k{5 KVȻ:wN/W.45D޼$7;asw4rBvLcC{k`}uCcu^g2-˾vW7S^s.މ7G : XPJ_TmzԜɔ2(IP׫y$N R؛Sq$%.E[j @cYzs;HbX\`6bCc!sjqhV6SnQ]!= /?B+HmQ oH lH2 n4% ƯsC̦*`326fcrqR$%pРqiE.plBU+7DY/%FBvR26~T!ف d]i00^ab v.v] Zߦ܎ Gx3} l bkH{^vjelgud *z&Z\Z-gq@3[h8 (㐎{'݈dYd>b}匍Q+e""ZrI)CQݤJhΓҁP~%[F,D -#fdť|if\"n!bAיnH^|UWT/Ə"9/ͨ#cyD[crov-s#\=B1` Pތ-Sr<5lQhyBJ!Iҵ'$'ڌrP9N'Uͭ ={X(Gya%isY!JGG+5G1|Sp[%sc9nE_=4nH'uY ZPCiRڰ9k C@WfyO烯d2$踠^u l6_Zn0tTm9l"jOj1(kSvM>t@|欣 2F`T$í6Ux~g<XE+ziwtـru 챂|K+x"x%ņL ] JBh^1O#XLA G%/4F'KYUѺ @TD4ǐ0Ͳi!=V:6-0>WsŊ\vۋͭ]r,:C+27-)"aȢ eU-y/Q&GރBM IDAT^d7BVU5߷u뉶ʓlAM#rоLhR: \T L%Ѥ &ȿס`}5隥ehv84ݖ 8.Ɗt.h|  |FBfTrJ !%wS͹-Zvo!?[#vAe[k7j'F4(hau2šьczlTdz=7J k nRBiASg "׶c¤SvEM fo4w8DUE9@Ei_Fp˫K`]@lMP?/Ki םq ZzK3g<.Ȟ[WiqTƂg'/D\'H(A\=G^ k.c1F!K4a$`yMޕt6H|3[1;e`+j%p1aXA4.L hfbk:eΨ j{_m ϟ-(t\ 5vt~@]Hw* v>I!IބPSX'\M 61T?-% 6b1w׋ZL&Bińiqhl-9۩hTӦJ ṚUg<xƿrHvPm8HOZlC1q1 knTUYid3wc&iA4gm+!cN#p'X)tpFLq^%&~z3g +ChEn2 @ui",t8 )"KLbh,BK EI(aL Z~91D-ݶ;4 +ĕM} F'ySsG0.Zv]ƃ"nb34gfC;(9!+*YjXS?Z/crXmU]XV琷QgѦY U5%Y7qkHla5P)v1|6P%T7_Q6f۟kȸ $ʩ [ok aE 99RkxؒhB~L*6@0Z)jj[̫*}0_mqM[yv/H-D XJt_€LkQ8t1+ :ϧS|p| Y,KZ ' {~l2pK@l#R -~8i8%-t4`7N]ZR5+7NQ_Mxx3wO kԡO+BrxBaEpg5@-.kFMtd~%?@թ~XU5YxN%82[oi_q(E8隭@u}(YPI2#DiEU lɿ nqr^^lVky#s) ֏R*ՍeӜbm]zUشM XyZ"N؜q#w:SfFH܄ 1ayANs6k2o7+Ĵ;((q"i' c~چ(}Sڵxlǃ)4ǝ ҉~03550q BXhhb?Z2*ɨэ4hjC<]viZ;獴1n0='T}]L^zq~;oD8Wc#[(\ea{߀u͈ ^G72nMCxS*m.:,;֟g<5C7dp(blJ75hNIeBBsglx\`_c캹T&1_˘rf^TbL-p PS%o X5y3KK!%R-6_T},#tV,{& 3(ٴgZElKuӦt8ᘛ* Pcזo8qfSQz2WmNhV:ma=FpO~\f,*&9̘{vT(U0{P5W?qQ̚ZeVd alA kTw4!cr_9fT]a?0J<0Ղay/?`Zx3o: 'E |OpgIaR{ׅ+NČ;T^N6]^}tqIo$gU!˓u*c%m d@}>/< @4Lg9HfVY/e#:wh,iPs ,kVYPB ݜ#Z%4 7Wnva)AJ10p_oC՘eW0 |ПRn? ` U|C!Tg"4ǃEǴt@L ɍ5pXmv$wCwZ #۫nuNTna@Qc4|.qëT8{}6H@o8e&AC 9+Z`7;49ye6W':mg{ `s{3g%w]|f^S_&wqNh>Ǹ6c׳oed3Q(@T)9/ WNLcӏW:j6-HxY)3J-@Ȁ&Zdt]el@ *n hyq8&80eSqht"q'QuN ?(_ŽhL6 Dd`j%Cj@k<5aGind^9Xe9S:,ͧq+3]Hm]G3P Ұ Vv@)ήp>SY8;3g<[3uh4 w Ux?'}U<8:H$p/rzp=rs\)8udg^  q4>Zi7ܶ澒z[ݥJ9 yvxn{a oweX۫p:\:N=AQo +Ӝ|ܟg< 8:Ԥ|A˩\ Enb:8`rӝ0kynZ:5N}hG%l:C̘A #+;Mu(a,ZNY-ޞ:!(6v墽-qA< HT/7+S'*q&p-e]̿,Ɵ4MOH/_9}W>qjf#Wԏ9 z: xY={M׀5e]lPs/3Luq8zP=Nr݇vAI{M2'8(\>% rflb=7 M8b^gbEM==[1<^mD54KD o.}<8=MjΒå,^ٟյfҜ򰰞g<_{O&3%N<ՙ$5~Ý|Yo3?Yh8(p8 5'N$tѝ 1/HADz^CjIWWiAk)zEܞ T-OZq k!R=0:a2!84x*LLu~񹳚(>`u} p<~W)@u;W >9vn$μ[Mq- }9$>yDWtdCEz3D+:VϷn8L4;srxjdZǭ$[__GEyYS[ǘkLF2 ´^x! *Ata֒z]+}9k;y=Dg<x3:r h?*{(gNَ[6~2 E]%Gs;pqh onmY4gtԈל7_Lt~_ 8rl$vNrQ o%#g.v7Ή< 1ቷ]iQ0?^K 6aXKa _|ty}$u4VZow|M+ezvbSUOI t$hLh:[uu:P5fCbN(Q9|Eq޴Jx :vv %̵2'Lsz3g|mev9{:. n i)9ֹO6Sһ]~#1oVC#ބYWȖ:0޽!=X w*ޗ|}^]8k=ݶֹ[<$>>q"в?I y|d9IĜo6ϙKgy|`[48l3p l"69'gZͧ6up+s28nxyz%ϴa:;+!8t/Ģ x~0>߽iNk!pȻ5 x9}|/'&X\'ú7D;=7sWx33Zz[26Pp`zkx|R7S!Ѭ޻,9|9ON`\XkCq yK@).!G%-ƿu`z>/ȼqt/6$5LR7y?f 9X8!!==\~"9ϗ_Pmr2y8>^b>&70w6wI]v#w 'r4uϘXU7zQ^|'g+ywͺgm 6Q P9.<׬߃AOyPg<xMŲAh xQΠpw(~2XU'c\5SҌDN"h (["aŧb:~W5EA<&'䜋~S)7MO؉qǪ ]ܛr;7_j3x#X1w$ 1!üȼ2{?I;%zqqi3abfº'Z+E;3uރgGw5V: 7F(Tx`X?H\NJ8 z>P-M`^a8tW^hg"EGЀ~| Iv=(!mf<|";~#%``/-rPdzj<&c#_L^n @⤳7ݳCaKۻ0c|rQxش1C>V*h, M!:h1PoQr'qO>F 5la*YI3eg>քHO'*K,'.e`uL?`栵.5Ҡo2P1؛57Wid`0U|ܟg<_i`uQL:*`OI#EJKT-5y9Z6<$\8&.NFer) ВIA%N  3);콾SCH >78}ywZ5|bANDk;dݴ"Aݓ`݁)E2@3zND R j~@3u]XA7@"&ER3ssq؜g;JMa*d%;  ܮZ9jNb t>@L\dvg!yAhpgx?~ʂkv^,X%V|C 8wFarن {`W|Za_3Z+p,skmeKM]Q_!?zk0k<:rЍ;2W :rL?i/РYW2O{@z,k :!Xg<r#]W-=Tu1΂:C=#_"Ua7B9imHŔ0=B() |1,<_/ꌈZ+B{X<:5V /B&Ll^Ԭ:^l瑒Hn+_/؇k{mP+4gD(]~@lx;R]# &@4 NUS&1+^Yu]@XֺMHFSa'8Iq]2> lcMk~_[X-W;p(6-4 2rm|!lȃ,2\mnz**~]M1'kr]yXq]PDQX /i{ lDNE+ⅲv(/>q'uD l]Us{vFMYZmN3avuep8^l=7w{6 e&nb<>Zpv$^bWÀDO'z 0\l9i0QxhB^PֳPS_iaREURVG r$@b"$(0u^Z77`ҞXiؤT5PPI@7it붍ŏ[DMn9.Bw|LVʲF(ɼ-fݶho$|k=5B]Q C+d0ŗn@gɄ_SKhЁZinqH~LqQq(S);͹R9ܘJ~Xjrx_+1 `!w|b~׆dU4v{IGUCC!c(\!m3X\q@W뮷*5yݽgj opUjiIBL)XT$$pzNږD \Eht1 SェQ!\ameLYMbJg<?Sߊ_8lb=zi-`0xʛ,v mb+e^DB+bȖWD&ž($Jŝkl^q'$:E 411cܓ XpH/Z70yY_5Q2Z%u6B\3Bc@Sw3Tb)m*=AWAcEJq9#(+K#rK!`] >%Vo*lX!r^O"d nCQDӹZ? 񪠼 @a(|}wOVOUľ"e ءgl s;Jz_rV ֓b)iQ(lM:t!.'Oz*OwiUvAEO ENGFCG ğ#=GIC碖8| j${5; ad `o*7QAVx՝qf€+(HeA>aCnʞ ^u0pkAFg<x3~ح lݪ tgX &`2tVuĻjЈO9j;+ړ<2|Byt@]'^Q4wk"R;'N`ӈ`)dOi`ڍF\ρ1i@Zt"%!#yS VXȗV3:i0驶qg8L͛t)p&$N 0[Hrym I9nq)xw.[wʵ71DjBrZ9[>dEkkq,U^9.ƒ@D_z`p6\2w=lgE+A})s6Q6F/ {cTpdJp]&-AfF\-J^S\#Y┊7V݋)1n2wXT3.RUY pT!ڮg8 F[RYR72vN"JQUy ׻1Q}˯CnJ=5 - ڃ a !JF{YY~^j}=_14hNZ u}m۝~Xԣ.DI3@s="61o] ?(5x3g|n_pرYCS[v8lt%"Er'#i:47̀ޙ58ba e 8dEݚ)hLC %qc"Js;X Ĝl6fR0PWZ,v+vøTj'J%BVfIT;Nx7y1cҬ0#fj-\ԻjAƘgWknuifn %"Th3vXr7:A׫TK^pіɅ@l-v# 3GFZd"b}+D1pmJhuF&Ƹ}dX4:  Dhg:^Iה*poB"YvW&(PPu.Xt.Da1Њ |r(X7.̹;hNlj4E+"ZyŨ^ipM X&G x3 Fl^L1lҴRk`HwW Gh &H,lv"Vz&KԜEjEq'K] @~KN۳\"a\1KZE?U" cxJJ/s bMgWxxR6NԶ=^.V^%qMJLsYR8w̸ 9:=9Tl,ňuFK}cN='y BfI1("Xc]QZ% /Ҫ~}v٣}j iRTOV#(.w  GٱS1eU&8+#KjPw X+|FW, *';BBr ~(;!pU ¶!d[BwWaܛZ UuxQ@`!1sHFKk)hX*/G؁lk]*)qI{esEIpmd`qBox 4#:[Q([? B+O3pFB0.^({{幌hڋOV@:C_ Q<v!CҜ(5ox3Î?.c+{KǠ_mJ!^cmMzIQk)`T7gN(* O|$[\#It(W %c\EaAs *UDQnH#j'ݓ {1֔D!OboWM"[Si4i9+;z[*@|k3Lg_ϵͳQ% 3!mF~ (IZ͌\i iP@KimF'c]y_Ev^LAoB#il@}կ*NJ7FM ʌn&#FXXmf e6GH7{Sg\2(xFܮw . /wVil`PP9E8Hu%ĠkEf]5*\smSJ[D ̀ utZ)QKEmҨ~+4s kļM<7PmMVt#)1b. zsDPAlJ6/R"2&® ;h`? dQB)M*.:4ⲆX[;5 t5uT2BЂl}z3g~GѴ!%4]\Xw.VdcEK7Ѡk+hlg1߰Jüuzg߸IT6!%Woژ4]EJWɃ(_2%A=O$[|44^%Gbn][#6Z2W_耙hq l%m=`qS'Y eiK"O;$vBK 6 Mte+L{n-˕qȕXVK"4ӷZYX+jC\N71Xdͩ<̽REw,sh&[ WDΦu=.[`n (R>0JӢOPvQ_m)DZCխO$lM!FͷŵӢ2Q) QH9V-wFqvx]X,7[ #VMi[.&qC0 ܗ=k碝8AVC*Tbjg}{Q!O3]d[Zy*`.")=i 8頻(<˻>3Lُ bpjjEQiWtͪ~W7g<xƻtz"q)j,Bu'98 `tmʲ91_v7zܡqUh]m?6cF24n*r +f4F" յhjc[Y [U4g:|<&GmmHj6հtrDG@ܳn3Չ^X_V8_/ QLݨJfҶBKjK ^k>EIr1kH5͘@M>@2)Xkcf|wV09K8[A5 mYe"IWAq ψe:ITABSr[$wgPq Å%F~WEd4~o CbP^Ơ׮F)4ͥ# CmbPyE4Z]#>ea,1a2r(wTDm0%Ѐ U%!0L]+:a4˫VɃ!%VYfA݂8ykƘBcH-BYog6h:1~mpPÅ_!ؾce=*`S1/UE, X!_g_;uPУ8 چ;L\{IyK𫂹L8jӍB8>x3O!YϤƪQ1(ƋUt 2]⠧YJh1F|Z|ڹ N;VˬBbrWrZe9m#4o(+xK$gy,֙2"qGEePt7jLU"S&)7}bz)# V6g#&*(y`5"G)ͬB~u)^vw?1 ufȝ_O ޵QʻW2~ d2a,gq5 *׊EY*38$AVva 8APCqW.zunؖR'ZUKV {*)mȆDfjŁH؋ E8CZvMB6,sFۉ tHkQހJh"mI.ݼaFjV7_ ;Jv幐S M2'ld@%RG‡T2hT69:xQNuR&_?]ͪp[EPd {'eEB?(!6sKZ )Yt:"'aʏZXO6m؃~U8@S y* <mpdl>x3aL݂)%sb:9@i i{T$x%zH)A| Y^ TiKy BT+)kTӠ;o>xDE/ MM?O-~ -D1.~Sj3'g<tԴOдڢ2s.v 3 ϨcDĚ|#E,m,-z*mALJy5l*M17Eö9iv"͌tlwX`A2&QtFC_VJ +.Ki_vuDKt3ɲ 5jff7 ctV%$wRrNP@OAs lkQTܝ; *ib襎@}-[;&VN"4Dn:kO7 :B@&Ϡ,}w1*FZWgG8BY(Jr6d%tۆcp,Ln-5%c'rm+c%C Pj|L'*ǖ*擣 tp\Q)L=^8i3@mןm\*i*h!(LlAa&2Z o ͪIPtN+\:˙VibbFeD IDAT&XKTC&3ce-S M4Kg<-*CV^[b([ ;Cb2|YiϐE;.ɲE<47Rf6TQA~aȽ7FH#Z5'l; (4[)5qb[!)-i'C T%s.uu,qNSuohVDo(EDk11S86)he:2ca.\b*7h*xS;ΣA ] 1b6Ƒ%bݳ0̊JT H] VIfb!>>nPBjv`Ivµ]"Ό@XZңj˙53VOYMߵMȥLzC@@D,d}E\m-jnA; `f@?T#l|药\C+.r FՅ7рWC1A,-Gy΀ cLyvpg<xƿ`CKU"ezRݪ* ׾,!{b(F"l"$Z`7t:$uIU\' A ³Taeȡ^-frQI "L)9k*hn];h~&[K kKLa/9`ySj,eB]lL!\w` drscU[_q -5IXyrFqѧf*cq)S;h鑜Iw0G.C3پ "﫷6wtD4~د/R =`Dwmp9C[J9v]ڝjsx 87 \ArZv`j,BRq7ทjMU r590cQaϿ<,g<7_^UK+{֔S}o@ BPf9A^,U*9y[_;o"FLLr!W 80#sWHStwl:y[1Q#5h}Q_aP>l;Tc{q)7\f $h޺?TZ%ݓ:G`7`MZ(ק]l`5 i,U@ m!t@o4ۧ`/#[sp:8±=&6N!&.c%7&>ͭ,nbE- 1}Nǹ&3TGw]Y  ̓=xƿ:fjV_wخkx3bj܀j<&)fR9jހ)1]͟ѭoN;S]k q2&p^{/|ΜK 0=]sw`]޳P{ݜarw89[-oD!pAd/,i plüPC8x8mEi6AM糗(7W-bN#J<#q):XW]IO ]gŹBƳx7- 3Noj-3yіpP 74{hTUvkv*2x3-pU)xq{<1듊Ri2b}<xIJ'v>Zhvǜ˜&@sN\sVo=c ; =PV0| 5<Ǽcͷsu>o`eһ{'-ђ+yը°WQ6XBQӃV3šbdw!(> j(ricw%iw GR^ӁI=Pic87F`r]i?,%ק9#]c|&&:mW!B$R}qfms;aJ `ݩ2E91D^?UFH1eF>C֗DzC. * ؃`uS@izxI8\jh3g<:aBϘD]r,>J]p$"ĉ#2;N2C.TŠ͙VE4 &`Ag%<̞ 6R rֻHTc..]|ǩEdd(9y h-w"-SPA.$]p2_~1.lɃ D GF5ketgAے7*Nf%֋ɲQoaa0eV|Oo%\؆-t79gHy謦R@\#! ;9-gaH1f$e:8{ݲ+Khx墄QJ Ѷh Tz RO]cFv\bn9P^b=gx2Ҿײ/{=g׏0\`>Ӥ] 17Vz#@G8@lX g聧>L͸ܷ/PC3ݽSR' xZHE&xZSihQ)>>LP ?$]?bk00{y\OF?{KI)奧GC-b/ GY2G:-B+x<DwP}&nýG,jxxoº뺮-qJjI7>TB$K] C'~հ:FA{rO)PRGi̬/?'m:#|J1}d(YY侠T@nwq']j%&P6J6{ڪ&_1 tdHC {7Xa fySR",#kغ 6H Vk X@=U3N"it6%{x2t@{ä( RZt:'ov'\Z΄rlC*?c`n)A:tƯ Av mheNAIX)]A,"pw;X@%boUЂkߡO~kǔWgt9abB^R뺮뺮f?h7>9fh꺱հ_JtUy8WD d3Fl\=tǬȶ`TC k35|v8g2euٻ;rnT7/oPR4͑)a#4J|l &?Mw_?I-*-ΑIeRT=iZb׆bm zL 6`,Sm8doz/}ILH9kɘtzfM_ma0tۛfZA9TP+R>uE&KZEx{ q)!(Š"~7Fǒ 3+Tr>82#`J&H{X:T7kMB!$Rki1Ϳ =y6½ՎzӄSwk>XQϳ, yEҭ زDlhE/ 5/^=i߽̖pռ4oIl`|Kk LkӁyP'ҍ޻ǁsJ,f"^ =`-|-emcHl4ma?'Th=p SE~{T;[s a9^!ň <$e1P\QJMRdqtg+yM.S:oq96PN # @O{&RTi!aއP0z*VO$ns%Arz5` ݊DgQ{fUy^4s,AJJ- {Ʊ=RGLЯ[F! D* 2;V'±~hP`Rj{}u]u]_ WrU&rn)-74#}A}#^XG!*) IDATԁ9eDJr~Mhth?-ݻZ`Xe:w`S:c_T̫- # 7 z}V9#݂V1ƤH}0bbIR0 #u.@:&F0%ZL7)W5롃 :vXZ=֍tYrq38xY`*2B#{kyjB5la𱂴-XćHץ%*/4U$HWġ_ş5 lpNz5b&,bWzNkbm\I4ɻ[c\OY)nY@'P1\dR Q?*k|e:-"!-+䏞d) ,@* 6;nOׁ }YnJ+PPjF{(='[n{ LiZٛ$3[IbZAV_jAD|Ί~"_4up%ў^@?'SArI9w"TCC"w `_L7R{N]q HEc'a8) ~3iH;vMFKf4sy{ tf-)~eEw[MۇT:[wS0oE e`DC uQ,"DŽ"WB $@$~Nv,(q ww%^ BfR8&h<"4j}Ctt~`)c{m4i"{Z1xCkI%r:gG@=4K&#Nٚ i*ryiyj2[C%#(T.꺮뺮v-xkY,5VR:kBJjq#`CeCϚ[ԚD 3@#!p^l0]nH)|Sޝ5lr}P#Jq 8F3CEKGBR`ra?DƯ_u]u] :dz:tպ1 ]OS)ul[01݈<.Z5: ZD>@*)z.1$ Zʼ\8uV! _"z::"TaV/H3P Z,krM]N jU-YKO0&jz4 ^CD^2ڤe5\g 9f5KgZ҆଄p /D"M¬ͻ'ьš@9jLFsfg"FFzY5|fXk{6P{(DjfFCyʱĴO3]O-w%h@Zy[pv:*j8`dȏ0˃Cc褺O8^8!EwV*v-Zhua_ͰCQQfbvW3D:2Mz=:xUn4Xғpf*KSH|tȞNg@مy/D_q8;n}gHIXWR 9Ki60,9P#Op:1̲oPa ;h.t >PՆJ l3c[YraE%>f,(gua]u]u}?  Xg7=}0 cv}|Y3ʉsxגDz8c%AY6ʞ#7a1нWZAv鷩CgA&3y lǻ diB>maŊ`!-`.rh %^Ā{ (/>ݞd약z*TU( $zެ(6iA#!l\A3lE~Մ?EsqLYv_ofr=Xu #o&+J ^_e\5ٷrRŨTpޅXz|Վ |фrG@B MяzkYB/NWz:<`'TA(w>y r$b P2Lm,8.&U*G@l* 9Ά~'JQ,FcGÂ@s* k(Vj߅YHyGO4-dZ tU2_c5x:1aBfczwd뺮뺮El욣oف. Dlkw6֣׃\5Ql2\[yd(FKްk)/}W]$բ \9WIZXE5|PFb$qU͓Oi#^Gr! w9Q[{DzaS`o-V ?7IJΙ ZD()*$t tO _'_ i'ZaC鶤DMS OMd:0 ]i`UN9 }X.g؟;8CSf}UJoZHC#4 nظUmަkt{E4Lemɪyu~@ߞ'}FgD5{cuoSJsxKbIpm AmbL8vm(VhӢ82`S]]w6;LC>,8gŒ&NcŻL:W-c>[,|%#m#Zkʅ( 꺮뺮ï~BŖ#V9ɓZi1ͳidҹld` 93(?b$TLg0ᩈQ.S>`ŏ)g4%}0H=2ڎ[gLр #w5I#L N5EZc*g%ʱF.i RrvkH]e  U7=DAx;} Tbxj;rrwCBjRNXfr(o; 65iKdIQ,<4d:\d|$ty#WpPpag/6WP`,%uϹ޸sqQؖ!rE+R4)p9T-3^x#Jkrs07D#L/o6yCP^DN+O4Xg̱8`l\f J$&;AsC+:cso1|ؼ7گŕJx]u]NĖ̗8|Y5p;9p߂23|g&/N=܆ 9Κkj첱l@Tթ 7'z0plc1u14yA;}C u ( Z@F9@i6jGd:UKfoSүJ0@jp!i54m~vg_ᅵd2"Dz`k/Qe*?lD>E|"Z|X$T@EM_@Gu Fl4N5R3 lDV{2-dL½M'2ܰ>O%y(jမ= =8{$aO |)[XVYcyoy39-`ʓ-Ord8Al}F0|8YQyWN&)*bY'{ɬs&Y"ź] b]u]uSJܝ"ywxd~~M <|4yױe>^A%6,|up6r?C*su,1yy N(&1{]g]~o[}}uv|  pwmjz^2'ZnUq?y}}3C<;lx13s7/Xz{gkg5g#{`yg`#N3^NY&'N ;U*8J>#fiN*37.2{Nq[Owgdixs_oޓ>\x|o5=7'*O 뺮zـwfsp[>8‰N!P &7) )~@ݷPKAIR]ܝIqٳ[#>Mg qcjLp)׳w3uTU7xKIL`cӾxw_Y'{`:/2F;*%>|f]ziۍ6~dA76ix9_Yv{@`?£t+gك~p2-9 0 uz&`PǓGN{߰ 0 ͟.sp$L7il`P4=,! BWooeƦWupǔsMsκ3z\%OxO>G<>Txl'ˋdbzXY&u]u]w^:Wy"Zc%ێ3ؒ0|^ u9/g)"ܣl mC;KgLo޳KC{2e(i&\'Umu,qee0PQaCWݡ0m?Oeu'7#]NNoCG/|t;Mhh;ur⪯d|C >\N{s-F;D#W ^>iޤOJ.=yTPROD|i`1W-xT'ubjAK}+&c@ݎj"χCmjS o'_n\JRib|aB:cFHrFCΤ~&߸ѿ\ u]u],x{:idDZ NvfHNP'IBוS3; ֌,/`}jTƻP@ÂTӬ*-y}6r`%asa)JM6 JuCj5g7}R8ܓxp4\XG߄3~ax*=J~ӤlşHc'5,Ӟzxq G)"]qϙr16vuf!65HA:?٘0M{rP1gxd(VFC&b1q2{c>[Gs8k@dU`8꙯ v;a{ h7n1u(wnသY/5}NShCchnOLz007&j$ pR:@ZsxNG1yH*P_z>`;?qv n ʥyzV]e7 l qa{mBmD|{c^K;9B|de.|Pm<=Ťǝߔ~stG[ 98;bcxjȩ7o]yy`ڠξ<fqrt XEd[0}-83לۄvodzQɓ}-wd s~.n2!?@뺮뺮q?i`{ G`NMuA89iR4(w7NB(a*=~_x^E9Z7|꯬n'XW>y L%<^&}MSV`7j C;5jvops~9mp`hdo9O{9OlCx~xP?N5(P10USWlYx#DV EE"֝VHS_0s $07m2|hOx9 N ij͇'̬MbU9 IDATג5s8lKf0]4Yx4Rʘ]L)m~38OH'w0 2ŝ4T@_޵뺮뺮_YR C{UܠUxx =^N> ;kҮYWc^6Z~q@?8NYDZc0X#D9zyiv?e}>xgug>ىM]CA͑zo܅osIG{e1i8x(1 \d 8ԗ${ˬ}7R[~_g CZ3Ɓq(dn:g aΔT Xw5 ؤ&.qoQuƙړ ,C; FT03JDNy8F?r8O}շ0VMέ:Dm@  !je\a( vhW}w] ܜd 81Uc8 {5l.x_uMOSǐ Hq~mre+w' J\P *IOts,{M_R뺮뺮Z>}NR퉏'3F9۷]8S0Li,|p?JZr\y}D)psw̜1|*>a> ΨCEIUҮgXj_gzX'72c'C!̡崄ρm3du 4}.7 @glYB#⌍&hM+NMࡋ6@|&-EuՔGuv!CKJfa}enrSt@~(0" J'sH!!B/xMHpjXѧXndɄsH_d}FNi0N yc}36W|DY _ u]u]_׵٬9kaTuX]V2!ާ$&I:ntrqe=ﬕR&C^ap0@) jG 3j#υusx=M iϷ"mP:' p1x$O]VłwN1>foU::F+hrSRTQTԏJ[1Y?|]ѢO xJcd|NyQ5+$D)63\7s|_C>s,t7yh_֌B63g ԫ)2J$XIfHy48ɲ8_y7jKE^"՘Ivn(6 *6=¨}İy}5}3ݷ+Hph(yy{AP~,uӼ/+;fZԠۓbRDsE1onܞy'5ؠ<&A)D1Īf!{B9rxd4#w|5`l5v: :hf#^}}1뺮~_[tU03vR&5dW}XXNmBc=5_ML>{JeqcIz>Ʉٜ5CVoW*9+bdiq^) a++Cvxl $&t*RN(`M*1ِ]0mleҪ 2PRen<0@ ];0C0IO1gʛ\>d"jcsn VU,ދQ !7; ʨw[,~aGMy)nKfTs:EpbE2ks}Pҧ6$d:mQFAWVNTstOċ]lO`*Ù<%"a?2iQp9`-gBAP~t).ƆΝnJ?Vk(oĎftL92u؀Y 9"R(s 1l:pfYսd>/ BKrk@]ބmzXS"E(|r(fIV%\WU}p뺮뺮7vꃒԸyYv(0kqmh$S(|S}`3V 6*P@llI0WĨt0|UC*_z)^iO3)Ct B~Ĝfh>'YC@ͬ:z5"Yl.TF~?o)R?AA5ЃXI[?`D5Q j@e z&I0^Qju0)lVi{ǥ 󏛑I0Ȁݵjff0ĚF7w=1ed?R Ƶ4)Bq$}Ji!"mM:T)-1ݬѳU*E;/Q=pZ6\~jӈr_|TJ&W N@K8%K!U?w*N;886zp nl:vNT{])=aKAJFYjPJs e>Cڔr{SPfލnվ:twq 2 Q8!Tn.ja RYH큽3kntơBgG3a|{PYM=[r]u]u]^3ɬ F"C`L!@.5Hzpqz`1J)1iZ#eg:k1Y2r/) z ?2Rv4>r%JUmfͬ4@y p4ìxc$T4lF{}`ԋfW=wKYP*p}Mz801%i$]nvaCퟭ` &`o=N@Rﵽ-l˅` Lcߠ쩽L+ AK@%6,Zɛw: gPfm=^2lD60EP[RF> "+ "[΀Am6(eL *x!,AXV)?M( O6,V@ lM+-Ŗ2az< G,V̞8b v:6MoA4FJ-v8iȁ`R:\W{ڢmʕQ$SJ#[u6`z:䠀_NO= H7MiR #}Hp(@؛2XK  le{ lrt.&u]u]כ7"6ǧԙ~̜{@cQB,|КiY7,EAm-<b3WMBm:l] 3dZϽVP3ģI5 ڸd^G.T^e ԜBq+' 'o ,00\c5*dx᢬^B\Ev6Uҥ dCˇβuCTmCt`1S:~-018P[z  1J *[6N儂Z;ڵ5d&>>p6 !Ն4f5Lku .ٸr%AkM Te+*4{;4t88MAMIiMy}pB[iW#awc[f+ hΦ$R&a\`A鿺otJYH<4Ck1dpڰ5. F`@ZmּpTl?FFq` nfOgj*ή DpQ5t?&|XA SK мKWf퐀CqpPIY%u% O ×`PXש :ؓI㰦Tʺ/H sGN'Tw?9B䜼5du]u]u5!9l۱@gلl^['R@Dlt!ҙl'U\j5/Zz|X~ZBUoV?(ٶ :1C5jPf1_OPqYz^W–ЩZ ʼnORiA2-ӮYG<'*ԜFD~jZeyD$%V KzTzhRW mMQUlm}QΞbA.KHULGܸ^ lԽxm.9u]u]׃",݆HH*ZĐ`!tH* E CEv٤Р 0`'I/id#rڮ5h0BE\5]tzVn[ OP?'>l =li֤yY9u U tp*hFXdds.MUj"B`LJH (Nh}4Ķ`)(fK>iatcek0Mƹz6|p2Dνx˜`̙vBzG0]6NpFt<3V*0o[2(a:,1Ekh9M~Us:y4VQlje˞_7Vt NUr>iC4Q#ʘ4 a"QƑP%܇i=AQڢBj,nguNYj!vE J1-ES-P-vm 52${ ٍQT^ }̙N e3=h]؄t5$'2\L&Zr(LQōi@'J\A[5F&u ]{h "E|yb]u]u]?:LmpG-Vw2b@R0L0U9;Yp~F`H>3:Z60ctЪc3HRD/uh o@Bpdh k0=Ax0*߂[o <0rݲF~-?r(?ju-[qא'rxǀr3d,s+tHR2ZYbrÄx5o-c`H&6I}W R6K5YRPO+(&esf助dNk};؅4SLY$ JDI@ ti7P?w"|Xh|+SsAeURdqgi ,Im{<\Υ(D٢`<"Y@C-zi6,: u#lqXmR2ǻM'Hp!:`vjTys p u@b p{.U+b]i:M6; aZa 5fՀr>پ/X"5ȭ CP/:'D̀PR*`Db }UvPݻl05 [2MV%^rm`(л<뺮:5`FP=X6Sڱ)T%CJv~xxHQ@ 0RR #K !r + _HM< k AibM-EONy {dž|xhB`h ֨[&6&9\C vaðԷig1•K. cL ?M^kc1|KYҞcQS逫NNު`@| m!y{yWB?TPR(טkP aJM :Yn J]ziaIst2hR尛 <dyTLe Vt#%Q;w#>闾`"716Pr{ܫ1e=;"MC1jQZ!=&osmEB_AeU7s!M4K2F j OT8 F9 # '0KY5zlBT|plڒv CL<=iz$z45(dsbz'ZQ3Uu}/ŵtpNV3Ż%R!+ȍ nD7ߴ|&HA4_*Bb"#9H`E:L1}eY˰_p]-*06cĺ뺮:ڱӨ!NbI=Z3bK2$""DIC}ʣmv!SA", jZu?*gS?Lu)d.4)*3ԂY&HhR5%68p3*lF?k,S1=zO?FDJp7 9Z4{S*@q39S/[+O}M^&塇M޾lɓerKo~2MYJ{Va:ņ pf> 0GH zeQ TR"oߡ#d&_(B-B,ГYK\vyÝ 7(O)(/hlD+z 08v%X'dc_+׽.]`LTT)uC6D{/J(YMTbKKR6M$Ӟkز<GϦNis3 `%vVU<;F1? *[L-[ˏ(m5.3tXA5@ a2Ӊ)lz=pY߅^Mk` :[iל^u]u.W?)-Y,LB%ggU6te6: Z5H`3=$o >YbTw 41 9PFzh27"\ t">֤3 :%@kL_k߽a@O{;iXxEc@BzʰNOdf bTQxغԟӫK {[]hoHUJTnkXj weyj)j@_S;nVW57T.H Yc]l(X29O/ea |xE,ra*W`uYtPFcZrҕJQήVkJw`}^]֗69 TXLn0(Q)*`).3KC'{ߖWi0z !PKCAީ>.|9Xz!|y6_勳‡ۻt|֧L~ԔZAF{[/.cSu#FkEAr62 B"KL\YA q(\¿6{piQMR2 V$Ae:~[>1#2?꺮뺮wɩ5_N9>̹Zh²xz50-<#WR(Slv6- *F19αLl۟~?dhjep IDAT\ʐ5^k(A!2 ö"9Cks b$IO"4~PI9+e:(6xdh 1M6%׎Z&r?$]V;)X+O?CC n%=SJzI//7z@xZd맏Cv;T5k%=ty9@/wul#ջ/}&|!#H,SY M:C lel@hs؝&8/*" tea,Zmr"H71R[ҹ ɢBD06ڭP-.W-S3fI0P lr r VnOAAԟO&YLI`uG3][E߇׿R/ŗz~yO?}ԧO>}u}7>~ͯ7ԧO_קozyy>˞.lCB0MpqEM-&hψ~JD>hj7f` t=HOƝ:ԓ>i,\Vfຮ뺮wя!16AʱkMnF Xb5M32VA+l>uR?(AR~TLKC*A3pݧِ+GHlicn_MS9vb,)~?-#}+NLϨMaMl9Kw[ؘul}OհѓNuy*vK'r~*O6[gYئS/QND|3!SpSVJ0F?c 4 6\YhL}op` XI#m+=da3fuYT X8}-bRlDiUR|~g>?󧏯_^/7K >|E}a^e@IWp fANY1Y z'aWkqd>e5g?jg3+m7'u'&yJVhv|_^ u]u_?OY40 mفy5|>+6e\%h;_ap441 >!Y^)@9 S^zL%Iqςu&+5WcVLzHg 0꜓da=7Ӏr؟XPE|l=n.tbJg]/FAqT@As{>xK^H oN1$r</!:5`F?Nk}?}tVmC}z{ŗ/^_ n^X/Lq2ѓ nhڤo(89Ɯ7^* |OAq4eP=}beӴljƸ+ (׿{4vu]u]UfZ33 f$ކ%X]λ` 5E |\25D*#{DD=ڙ)@ _tI6C:H z)M5&Aq ^hka>M Z֑Ղsݷ[E |s LEx;{<7|G DP -5dM bth`M#iޏ.{ɹg3(hG'apsmDj4H>w~=ɤ̸ C37vP 1P':;8a}PTʑ"7_o@璙V^];UBH.͠^+,&S25D7x5Zɖ&2VhCR-*677ҵ ,4f V|=W𧻓7㫿ǯUY뿪_U}ۿ^_oӧi^"w;ay<'4sMbف7ԟ .ߡVL|hH_@ 6c> pAMc,F{Emu]u]=N ՃcR3j1fymgt5hn+h5A!@)T h(fQmaןӃ1d80,*2^0w6Y++8ji9# &JamU'4k{'?lh 4|N$[vs5hn,l(ax)Q?s??R6,C ؠR#&L=;l=̒3A ܇q"63{>3pB%%c&VA2lOZ{|7񓘵zM~ZX_֧>>|q ~߯/~o?_>|*'|''Z Wpf:2'(71Ō1&DZ1!/ 'yrK6@RV,ҥ Q"}>^0+~t,H~뺮뺾aqgUmYX>hB=`d)h18w[S0iJ7Ξ *}?3`C;~ CQ?fvW"c 9TJ{:Q @SkH!6Ve5x'<蓚J{fYe_zt^Θ$!+|`^b:QwyJBk$}J+*iPT }?1F0E'S4֎Ӂص4UiHM*P0ans{/b N*$v}G hځ]hBK@&Yω=? n U/69Ze^JPnCd^}?UUl F3˧eun dxG~ͶO! c6A< XNo|K: "@tۜHՃb6<.@E#[ׁ YR9BMzyyOc|UFx?q#xo窿_[7_ ,&c2XoO\@o8q5vD$Ha;|cCsG.`.J DA:h,F0 gZF#QxvvmF/4{YwY#Ű9de30hY~`טiqv-aI"Qۼn,ErzVְTS )3ՖA-:]d voo7>,XF‰ 3F}cRyD\Eݖ?m9I"g’?iZ x0K'aA4)F?_pէ[[y/??z~~M.|\|ye|O2C Y/}ũIuC#hzOtVDP yA e-A{GpH7M'_4*)oSs A->zGa4fo-0i,ζѱS"&9(F}5BjۯՊZS_Փ˜42|Xw 263Uy!U" IqjzSkB${m;S zbن~uڌak x[{hVBuwX:qP2{{?OߗCa"NI$-_-]:C >~3V ^*268&=Ж"gY(K!V7g+wf)XLZp/! ml8_s}٣Jma(H^??o_ 7@ze^qB:B iOg fE><:F[`粣HI 7ϭ; URE'fb؜Լ޳afS(y;lһGNT FTeriR*RHzĤX@cz'Xݼ'ëVschGzJ %wԚQ%|ԛ\g_iQoS ظ/Z{hy_vGpPL*!hM<\M4K/-0ipDqƍS_ϩAw' {J`tP|yٷ`o՗?X|k+٬%5/<ƞb 9puv >H҈D¹v4JAj3OI/c)j6qigXoI٪ ĺ뺮 ^*ƭO`HN$dU39HFA= 6Xߣ"įGyaf!zaw,e톳{{viV4IJVx y?Y}!wY AV8i9KE$:v:@3ˡ:tq[$|s%prVaʠ^~*TC}*uc"ՙjHnE2?66XmgDL㬪Rw38cBL8=HNF5.ʀXtR. ?f(~X,ևM{s Z/^nV8s2\e,}@ v&k({v זڄ&C!hSh}i, !<:Xf ӿ殿͆^O$n%'뺮^XKhPA @֬TH=7SCInU/N` 6@;g M*VT O IDATjd:s6ԼZ1Qk <3UN}%9jVrٵ_/6ć3:Z=Vcj1bxKB1ز.f"4 OMfA0l+Cays s@cmIwYY \= '?>%` 5ޯ^ICGW!V4ȶ鼝3BrNA~<`KP@N +ض&@%e1N }?i1ŀ&;S $ύvUt2'"{s뚞]׻ϙi;mi i )E DH:g sZS&ƈMH  h"PJ)m%@ZJ v3}Z}sN{jwΞֻy纯O]'0ҥITF {۸IϿi>a5iLyuM ;q*+5~$f,\LEdw:^Dl0j4S\: NrSkr룝`* choJ=~ |zU CiTrcʄX g.X3k˥)b%BAyP)@vܬu?(:7]ϻ?:Xxğ}rLꨨ5r(*k@>?88ՊD͌P`%4vRLO&((,Ii{L0+5U ӓLéֳ{ 'wG8#!cdULqaYe K<ᐑx^/ke#{+[7Uer+$A51Ha' p>i>u%GЁ^BTbݒUEIJjdSim&P(1@4̴Tu"{X' w*kO+h-M{Uc]_I^((2dy`TBmw&VMX[z Ȉ#-3 Se_vTqR>{q9jURaf2ݢL7(Sk +YHԱTtRc]&ahLԪ:8"O2’mDHW[:j1!H/?CihE7Vn+EQV{m吪8.BŪ_2FGiK՞LkbA _p {|p!8 ~cD83ߴ"%@f:vl=LRWڰ-7N~1@Gnb2Wʲ w80_oYRVxÞV`,фjb+#A WAOnMӄ>}_7fxsp9p ݙ:tǾ{34q:/B\=wqgxX{Z rk7&rȎUY)O7lk}x(M&7՜U*:Rl:cYFeЉ"!צ&DU5CXΚ zTx39ʀ OT؆XfW%u}]_TUcE*O8PÞebN`lXzRkoÆДY&H["|KT^}RIqj6V01LXTZj OWCj{"ޡ+ON+Ԩ낦86NVu@|+[0Xh~LZLE>P"b6H$2!%]_[3(EAY5v*CSvz<8j (UͮE qqXrӹr9fdV>"*,i69=Gw#QMcD&q)פu^YP 74ӵ+Fp N/QHRS:Oڿ r)T,"4iKtӺQac^uk8ͯԱW, t Hںi!a4K>Ri 3߽w_;ǻwu<>L`V%oD,G7RNu+tDE.Q O@PZsآP|H8Z*V^֫ 45d!*ɐ?8w'x>(g' =iƏ|Lז~ȫ7?&_0ajhI&6Z)i`1*}T@D̜;Jb`9Cas,+Uq׾_Hϯ;ԟC]\KgvsƀK|41O}uifZro+@VԙQgMG)-jH;92vDXo` LL*p@j6FRcV 3 "r=0{z8@e+`!7lu}]_UTuJBBODĹWJ/*d1Yّ3"zeP$0#&+ dLWL)Ƣ8U?_~ItީPqCoSCx5pB.smi\l}4;Ma- IvI\A+4pn+dIg W&l7i/DL_IUQ+l˾&)qzjv|q ,.>)Lɍ yQh3dq9g_>+#§>f[B*(LW \*>,(bFie*G"IϮ+V|۠3c7U/OןHhXU' Yxb Zz0\I:73&pjZx߉?x#_ .ΧO|/wgi- m}:ͭ<4ck v_ٟMԏc7y<. = LT( tB JiZpHX X׃<*y("fcbLd'7h@U ' A89GEo+u}]_{$1hax1I_IKX}*n/xk HꇐDX[.:k\ 6*|8C4f;uƪxX4Kw,*6A6(b+~ԥd֘?ՐwsdT&Fr b-M(X TI'tu^/:GchKT(W^f :q:=t?{T=,Sp?̟w+L;qXg>xz̟m޻Xax)Ff&gri>.$jpL |?O<'ֿ5Hj{'̋|:bEw=jSbz aۧ8ܾ 'g_vg5٪V$//UE[j4tho-P1Ďl% W__XRj+a|,{Yţ7*D`p%\l*D E=k|.qťRnKL?"1y,fy0ҋe]s/E a=&g޲Yu 1qR5iG#oï^W9lyŅU\ttR@~O\[ߍ#jRnk3kp%Gpz pKm}3w[ YSfKsJe~U7i:0 }y:n|7h}'pOτVv |i<z|_c~A8_Y'H,*zN^NJkMdYr\wr7XJ(j#Fʵ_cylJguc?&kq/R{R".s_~߫ZZ8;AYQ1eË/e*A@L#f X,.d`(Rɷ7E|m"/k{j 1W>8wzqyR|\ a)Z$Dt|bjƺ7?͘(\TL *G#<f<"zιު٠G-~ڗ#ly(&(9{SnS/*|V߀wDg7qORfsU+O&]!6h$@#&[q Qg~ViN2ފCƺ >f1epS4qU Pϳ̰ic7 gh@E0U+#,^`aoBظ5Zm[8Sv}J S@8 }Q]#}|Xޗ@~Ba: JR g ueyj I*_E$n p18PVړC}H&ղE b&l8M|´;+SW_{k>i'ӱo׿wS?tZȫy hVShŠ!Hp2dZkx~c1D!|4cbgYQB[d rҹlY) l^~2FaYۃGdZErҟ!~\\XZ.`*U!] SuiqPf-X9e60C>bc9pV[sP~?1>_EW''?4|F/|h,uw6Lgj;v{vv7owoΊs [`O~?~-%_)΍B^܎V->:(KtŒ;}\?'3$cR KG dXOVFK޲B=PJQwci_n)+ T2t<Q@pZBoyUc]_y1ɐy;n Th=Yg$}\Kࢂw 8KpEa\ȱX aV0'qMb\9rQ7,UU)3G > y1w,U)I3eB=oIm7vy93 gA;xl4+↭\_eZ/˵Ij/ݨs`TL4fP!&`4feVحJE4{9 ;ףzϊ /7sT9SGMw2.#N||+r+\\[bJ*;P j΂EmF _ѰJPzC5 / b)+\͖l&b?UFVuZC:-vds UQ> p[ Y5JU6Mw'԰'s D^*;އTwr))ܓNE5ɐ ˚ ;`:a bM30 h%$B_Z?t0nO\rG5!L=z,_3.65m5.ꥶ*yf(>Kj}c6JLF@feuʦ ge ޻eM*k{nablK1݂AֲW#7>1'jz+ff% }/U鉮QYPTMX)l UbCaV7 kyjW*@y)<}}˂œQe*Bo,€HR#'1HpxJ7X9y*+Ka<1К N'_\#\чX QWy'%#{p9%/$BD&^'$+j(;b#6k®8aڪЫ3 KQVba,T2 +=?r8d>?V6/b@|օcpNeHwn ),`j\MF:{A4lXdw*O#;ʃ\jR0u'έnU1mo0qs\ [I؜'ͪjͨ{Z8zJ7d.< KZekҌM=|lIR]!EտU.9{gɂCDdZJ$`F .ZH29{\i8Ԫh *kJnS }Gf ,T-5(.녤\yƺWB{. XTkC6AMpgL-aT >URULJsE.C#h)Y SZ{Kk|@$` hR(/m@ik'/?mz,~^BjLpdո?c}B/存8wBh Rԋ$[IG`ؕE, xϕf}7Ñd]+=.1vح3^Ł_1zlzB!]<惕1kj> go{_E2r˟anxk%~{= ƒHd7 KcVV%T8,985܀%Si@jA 'wrvds<V_%'Wbd&=񕱥J]}Pѳ;W[^ ͏&L$u? ߳R2i9bS,R `e?Ҥλ%C3 xd))- N K69B tZ{I$laVnS0Ъ2gs8*$ ʩ\{Ҵʜq4Eivbyʶxo| %#iL $I۟+y2h'g">y|2Q@OvS%u\ ?n<{-۱jV6IsF߈)˪DMI&+2Y2ށ66*R:7 YUBrQCd{'UАKӰm1\@>Xq}N%FJ)~`aծ(]V8\iVz4y9d#Cn' VnQDG&`ueUoFjd _O-F֠%`CP!+r&qdZ+UcA4AqÛtK-T-dA*f[W3c>fUTNgBj>a>=t:t|||;8=t|t[?}"OrOrr6^Qj~ ZMFY <I/Up_jGJnH2*4~>"{(hRqeF')fu2)6;ʘn*YRJ]fu}]_/=y S ▉,3vIP ,UTϱ4W {Qx($}Fb#li[oAP@bQ 'zfѸ9I^[?.["b+]?2#m}Ҥ1 8,<;"T&2ē}rFԍN\U+eX 1 [+gAcncX%y庘as1vQ_}Dz:i~ɼgW& CŅoyӋm ^Q ʌ`(_M-jbd_㲾!YXCb⴬/a˘BylpaD>&%}_~a{uJq٨l?S+(l˜MU=W0_ۉ$AQcBՄX$Ҧ;v~Uo~V'T3zHrIK-vt["[LO<. %o8S`GSԘY`[#v&v2Win۳W.6F|1h=&ucdjbyҴ *L*|MuV='CVpIu6Vvͷ$o]!>얒/l=%Et@6Ż >2TV.C ;Z &KVFlU2 Da:MT(Dnf^HPlUbxe L0tifҫjX"=6 t^g (zwN{{ B(}^h]ܰ# {齇e_YE_w!b.1X]B[w|>M 26J*š3߭V_}'ϦHș}74~VqwUʍ,6ʂ۶UsFir"S#4ckgzŚ*5WnjT8UXݽįW4EybۢS;C \x|%poV>\<hɦvkXe4pӛޚM`GV7[Nm1`4vۥZLMϼ \a*.u{"Ml$#Q0౦v56caG@ZSWUǥEBx(VLJ{ͯ'w97pnpy -v7bjSkw[31ĵ%-su"MoU.)Q1g R'^|s>fq8(HO.alFT|Xm&>ݯ5O׽72oJ͔&6 PH0Ya -6G'dW`P%17nݠq+ڨ1G G; C:_9[\tT1CUɧQ:;O6LHs_3z`8柫5!;V5ZR_Qr^4".ى>:R6` yP/sTw%?e}P}:Luޟ,?KlUj 9{r_~9@drjbmb`eeZɜ ajFvȒq>0p3ӏmqB"愖Skf⠜`]ZŴ& `ژ78P*@zd SyYsɦI"?[jiL 1L:nx3x5wwAKY5u:Ow8>t&I4lel!dèoD`*zHLkeè2_4O*hiY0!DNݱmUUӼoMl̀nk w2% -ag*_Mq+Od<[/hl'0^-bq@Ö-?PjFCL ~0؛CFa[> Lŵ'V0;v&WD/U١bSD== BU:睬k`scY磏CݒG9a,mlv>ITZp*ttfo݀.Bssnvi*eAaQ_`{/ڿ _"?qA\t2PzmC/7ɰ* X- 5 D@7ζ!Q [YJ\L) ARw^s=a:؋A0;PAҵExGZ&Snֲȥe~lmcJT=Ƞ@D2)8`VS}W$pm1N(/Y~P-zL'ev5~GObbecR<`RT}:I_TM, ۏm=wj)z=KkaXo,:GGh#|©[?/=j|L+{9R:Ť~JH[6`C1Dѵ|- )8FǀQ D%I:MDBQo:Т&y:H/:s60`M4f.hi<=<`>LJ;Ӫ:B}1az! GpOb^-inܷ૾_8jN< -OqsOqsv[n0M;pTFgw?fB~?JNwVp®3'(K  q-q{Վ)>8`2GQn4m L*sLmυ2۬y zY53_h!~_o1X #v%@}; }@{7Vpsfs\auM"͂@Im/ m—fr3H_hLK>r->)DoJ3]ў]f6(]iv$$"CIax']sV%aUNȄp(X>(b nP׹K~+ 񹚿4PSaDcmyyۆH.;W9oG FA!-溔yQA(r΄dIDE^6;5j#3E7B8U_<{}G5,ؒb7mHW$oJc0>W qOV0/'&,|7"7]T'Qr ~=U@C4Ndag)ziћ)# i>xφ#xx?><q5z_bQ\1 `_i9DVPpblEJeWy񅰜6$BO"{;PY}gX.N)y.Ƈx(]G ۟?޹9 s@6GӭXPP^2֭=@xf< xY$;TJ` (D&1Z( w,R[Tdҕ?^V8 )QXlLCzpT6& rsk k5T[墉z z% <2eDN`P$WASќZGq"FȨx`~@0'7-cC$, TTi0d'_%XnHj GUL$?mM]1 88UaEdlX;Q(*!lT,pa^Qnτ!5$1C0mR-9C(k<`&ZTYk5BAhVpvaWSZ]]/U\ Saepc'%)^9{d*?sHBlmp*M*eQN>3HM}iazd5&_9o8+^XtwHm+P6}_ZetV^Ϫggswp|?C_Bg; OHq@ֶ?N;L\<v7n֓m%*i}CUR/.%Kڈ{ (w% -"Z!qDP$X}%{Xl9NdJR 3G8h^,=#=YzyD]'U҈Zt–ƆJwxnGx7'a|^9xy=Tx5XF'P1y]uC cEb8%7K:ҏQGr:HeC0$V ]*Gq&1ش,諠G+&EC}[ljA]N{GUyz$+*H%Ǡ6糯W%Q0 9YTRTSꔧkV :|K唛9we9PN!QjFvscZh*Y{ "gX??wDR}jKCYkTL2-~( fg,͐q$x&'K?ya _+ÿz wgjô/3?BvE1q Rizpkʰ݈[zz;ҠEJ⒆]\JàUjp{EUncTEKC:fο?+Exm+}=Ӟ*q0%Dx Md{Ȅq.,̱UUC= @UXLvĂR>V* TH}} !󈍳7#"s&F[O 62yCn!\W. rǰUxEG5+!6쀢]QuEzj=~#!tZ鮜)k1.䈎ly(xF\r7RnUrSdxR?64GYͫxر?N̼#U5 plזUh`qH> Euh%KNu9 BŠ6Swp3|w?/?ᙬ-vp[gv{LϬnɮՃi>j˪Z\W+Gc[=8}sD`X}BIj`almhXVtu[JX ^yaeGX~Jd]_׋WSD,֭vBAuT m@r'hYZ1JU2LrΕϏΎϱ$s*Ǒʭn^ރ|>fBl΁3bwu~fWGLGd4.@ NIV JV V+XdxZTiƟE-vD\9af߃aU#,4zf6 mW5 P;ر;;&t`XJ"߷ sVNU&Q ^c`JB "`nZwW߂k2R()V/4TGCTDQ$U՟`\"b(?/eA0Rs*fJe& [M#~lN ^X}J I Y5o??|{{gMolD-s+nwpw{ӆGL J -QT$Xi=J[=VugXxET-QD1`P&:N^$w\ު^e}#q \-NeMDu}=eʎkn8L~p[j_g#R鰒iȴҦ( Te,"1.rP}B%U9KQ8^*gU6CGT䝱] ՙ_g,(] ?s5= 嶓} HVcR[LHAXؼ(Ƒ6)/ش v'KY6q/Ypܟ{!XIcg@j|=ی/X>fH#?*CׯWrۅiu?7b|կ+G`E޴ :=tFtdzͿfm) Ks̆:m\xXT/Sy=$ڴ׸D<<+j{ :7zʒL;P uy+(tU*ZkCA*O2nMږZI! a^t#41'aX ,jR}EP <,*jaRăوy1Fnqbpd~5+_OJUVA,fmĞ"VfbŽ^Uic$H<`KqR+]pnK}T9[0jP}Ʌ_2Yb$OصByU/pss7oOJa=qίX㵝 @y.c[(!-;[X:]qLŬQE<֚g9C^QZU"EdJ#|*U[Vރ9`.s՛7L/ pc_nqTVbUA_t5wT'NZT,[Ld}p&Eeɀ:߷=z9{UaQb`ZUX&2USv%\vm;/PQ؏ kȦWѫ#1N9[k. VHɄ2jX[Ix DUЊ%ĸD IĊ+@ۛ@HŲ-[T_UYiѷ [%ku5a$I[+r<qbD1Ru[yX)A=ohDuE0Lõ}x"pE*~+ב|Y|V*9Ǖ3\c ]#K< {,)a^$[hXF6qCYR&B1q5}mec5 #N3D d_U:ɜDU5X^h IDĤu+x [vk'|,f74ʍ>Hi3kL{[r`m^50VGE%"|M^%saŮz(|ك,+P~=uew~orw_8M2pJ鬶W8Ɍ-R zMQyY)JZ|c}E3A7[ ?95?$B0~㈈ YlqZϏ%ı1=M T VDHw2ʺ^&c1^u,m `ʞH(H6U[OU R)?+b/ -F1)73&b~. #^f,($hYM#^GJ;HDexǼp-Dӓ )fx>k [K ?2bs3VPr #VtS~ᎌY\AÆ05V L)c,{%BI _(HGT7 OXuq!Q̏RԼ'@Ev=WK?hvPҳT͉W`@W2,!& Z ”隀gR {Ȣ~+Z49D;Hm6 P)cUb ֠N^EZ[X %Oڑ-61d, >o_ڑg)~[zN޽h:431UqV07K  dC8el XT ї醀 "umiP$FgA\`Q˒e'w9MV6*,I00szY+CLtH5 X)eC5ܪ'YG-,ϕUl〜i ZyU ,.Uv6Za#yrtb ͪpeGi6S#y?SK㢝d5V2KD6~cNP:DF+}+X>, '@LA;OI OH걖ړQ >By|#?!ḓe&b4 ̆x"prkc8nlh6|U],4 KKa$2AVzk5ۖ`S(pB |M1KRW/1B[g@\q(HgXhXO|w e/>/*))PT3eG"Y -QWYG],`hpC@ˆǞNZeW 6 *HqXqKp @뿑2`,yUR2STήv8-=u?|hș48Fm rJz&;(DY)[\MMe O 0c,MSD~WCucf48$;{lE5f~:\JۋͣTv2EV=?+o{J'̜+oQٍ|3t \a qVǪSg;_^_,՛o+T IDAT ^w d'E{LLRh$@ngׂcI0ep @K`h%4=>Z3)tWzn&VB׶գ] tω-@tx &'j8a.ؖ)#`.A?!H rA5oHؘfB5A'h6j*^댿"of ZK(am'3<{}G#2"Xf;b3:e'+(Ԝѧ\-;X`JfĊ6F+M)@1T0 6isTGdFVVuaKjѼzopΆLJxwq3W~y"շS?-˯ݪjYOvi@0- Ͽ/_ ]-]; {Be?JD4-!̒idڌ P,~~F1Hn$8@Po3tbbgVO $K c2$"5 ,FaIVذɘ+BRT[թdK2X`L11dq9P(Hwpts߃YPv4yFdrd5z՟[%maFdzvҖFӾPtYEWBȥ ^Io VY̜d>o@C|5ܲ*fV p2$=b亏<6J{-{9G%==N-ω=cj47¢RXy;t[򱤸r~ X{ch-ߥ;sN'ǝ*&Oo\L%qa,('u}:^{[; Eirwh&\XN%7L1b4wx :!l"e+ql dG9 3" %[m&>Ʃ]7~o;]6{YuouEAԃѹ{chw(Yǯ z[D*M 3kenodef}[NP}p"b+"" BuDz-LҿܚyRqڋ'Xz+v(Y4ܫR!HWDeֲE]ݮTjrH;^?67y%#t̉~hzÙJI{GLo<2H+ h&pp^EST*($󸧕ld &#n@9F*W8#KO[AoƟk*x%JoC שBÐ<(OED=3(३Mblb#dZ2(B`NkHAa THN + y 7$ٛȁ6mes-VpD &]̳; jrT[U"㴐WŅ#~Kq G0}Cf̟~OW_qտ }O'_튭hOd!MLݙ0t tk4!)qt)ɏ&ުKo"rs7,#NgJΤD6X)@=ș`#Zc0Kժ\{D/>"\Agmc-۲9>V{mbH0 $!%Bn|!"?Q~DD_J"0"Jp rB1(48Nncw_Wսg{5Ɯssn*{[Us{c1o87 _e!Y9XH=.}JdT$B|^xgDIi0]¦@ MM$X,{4"TD )iAi<o((&]'J"LC̻\raTI}#਀@#+[D̊Ǥ=Î VqtXZ,(}:]2Ђ,uO19 %2R-JXzNz}Q ֺEB4!3mngEúI^=_eA(W{π} *e6V&5*<8CVlu|XiA-Ӊ؜h(dMV %0(nygJEA"GtgEbadORn$k f "EUaE2ɤkP]HY:_ݒPmϦZg_Vϗ\rymv~Yr1_uOzk믭.'l͟pi_^oNiU^f |m/ܼVwX$TIQT|_.!y!Y;=-mDAX1Sb)L@B_.䋖)R4hOCRDUY06@xhɎ<*!!2IP &-,/M-0tI>V[*UJV,q_[Q{N!, |&GcRR!de l e`(PRCգj\tHd p=ͲYsbN)'9e@.h>Ud T tDzaza9M,M5"xWT]{.l{ra.{[.<\lU}b$cS&>pvҀŞ_a_[g޼_mS?v{av>?扵zfvOq:TrnRj|j&MeU,]9R)?ؐCF$.]VoWR2L(*V8DRQv|=dϚ@pS'Y2^"e0z &LbW`tr&mFO&U,TRcAzyZX(*ʥ\io{X┙rWh/ gA6Crd:Sk(-JUk|PH{ yBq͹.uTn>!͚JwiYllj- ڔX+\lIUklIUpo`~؋ou3Ώї'iUu~a ;}[ljM@ki`{Ruh&XdjM~- %04}h݃B! ysH"{09b@o-Lsr16eh)  ~:^&eQAM}("'O?yTQ MwM޿rs=s/qb3c7y!ȤXZ-GgN<Jb{R-`80bcȜcƏ K^ϠRyWaxgVU{! 4_k8{h)V֪)aJ#`(fOV 8̮g !} HC fE1\=&Xx^ͩXٗe$kL eU^r {n=3¬xto1TJF*.*2ԪU+U0A&[N/k))P شUM@QFXJa)0qݬTNQKr/dyG,]80cW<>>{pdo*5g}JVUS]]l\ro-YAQkXr~Yn^Zrg+oȾ[/^v~}`FO8nVV 1D}tɄԉ~SQ=zX]sJ`Q]N'+bacPP51jeɿ(mYϞ͖˩:CU[ϐ(3O ~F1R ]>`^q7{/^F5߃ג)xI'FFEaFm: UK^@T4eEqEJLS ZY{(GdCW_X869, Q{`b[<󡭧nwREU#׭6guX89Bs RN=xgQ-A7A 󚠓pfMF&#F %0oRAdjj;<ĎJTkhǮxDA˝;#bDޫL,xFcaB} G\ů 5FL*\[?lV.'d ɩ+}=V U'zvk4 W}CӣLCT^IOP n~}‡("vAߔV[.v_=.׫Q塵u?EٴW44 lfÄeڒkcWffӳӿwOӦ˽]6Z+\Ge[(l7-UVQ_EdǂD^$8`S &(F`2aZ$ֶDB٧T8$;Njٻՠ s`HyR"<$Y1\H IyIXX=@Bgga-$[}+=ސ|{)6 j:LiRQ|R6'&^XY2ZA(q0d冀b@=Tzܼ ltL@sYQϧ0VZ\*y@Ř YL+AŸ2}!.[)#HЀ$E~6<CQ\ mkQTxC˗-_2B$3T+ Բ`#z J/I"웡}:[](r=-Yf&MAҏ&FטahRAk=.,4L>hL$rR)c޵:P9W:`(M9GH#+̆5:hHɨeVRTL`=fx*XBj0QrU,#_Q i `$ >L`WMOpV<@O \n̾lծ|<ׯr׫y^떌ٱ`4ogOw6';y=ܿvv#{e om_O=?g>셝 dD1,?f>/}HSb0bsfJ]1vz0 ,ӲR֎T<<'h{hZ!Pn]Bן{Fo۳0"qc:eyuakߧbϧB@xjƗ0As˽ʫS\3 pZ`G=#_xvW5n Ǝkh՞+h__~5^׊$a:̗` S={Y9{M|Z`Ub8n^>#4AlCDFH@Nօ:tQ5TmȚcwS WX,MG?cf,p]ߛEiUe:%0zAYI$e`ijI=ܯVSu />aK|.?W_]ii:CiBpVw&S7+Qs EL5n1cҁS͇}6m7bGـlGSl ؕZ]:n nU>Sz.oF;HTqΌљ7(x$LE^v0s5Խ=l6h[ tUUWQ6焫+ p@ʕ1:\*ua9]ˠ#ʏ0Ӌ C%hSG6HW==ntm@%VRaA$*ϜR{F?=Mx7գ)֔/I㎞i^) r߰֬!J"g_Coᄀk\J$k~$(A| \Z0I#n4ᡥ70cW@F`EtSP:jh<;{i[êzxrXkoSў?ýk> ^?c`*&.4nk =,;_l]ID"}U^\o ? 3/e-F1,t P% ]uku0L9IgڜsER~Ńn@`UD@FSL)Y^U` 8Bw1}$;Ta8(q3g/vT8?W(?C pez슠fMW:k3 cb,U˔-<;Vo+@T1tX<ZCEmC̫PxX#!^)I=M1ު"r 9rjI )GÍ ۑS"T0RaF%_OJmT_>E;[=2a "Dl<$y@ٱ0}E^u•`_|c>aHwq^ۢH(NH?u@pg]̣!8~UA1Z겵nm|;x߿+[^|>~vGٞ÷oV{#?l_c.?W LMe:o3roۖl/vc_&.v/8g\oqmT,y0qbwnGۯz_L=ɘ]eQ*jk\'Wl(q=O8?~u9U.~&3Z~'zvwzr8䶢QZ(uߞE=i*G]ވ [WA;Ev#K蛆Qt7|z\ ?Pޠp0lc_*FzU5ȃ)չcq*YMde/uSvU~jJ;$ptOٯPo ^$qn"r?mc`4}<X J|e!ⶳ昀;.TAulrH:uU~_= >8-dIGI ^,b~_^Tk9>[~͟%ۗ'f>3w?`3~>M} }WG&Av`E}`?ĸj[U Jpel!#7yۡ[ŷp֣~̀owdhz>VxrzdQ7 fJުH}MǨ;Zͯo"oienDKqy<ʪ1V?L|zqtnߴP68`c>{gYP7=3n9˚?^d\x5s+xerq񷑗>X?owǪ4܈(ͮoDѫ~xiDqx.r["탗_g6=8M5N'X6 -/ kK?nv4s6|p 5(o+=.iȸFʕ |{}$x6@WɁ x_Tz8 悷+RxCٯ {q|l{;qp7|6RߎGC[oe|+r8}ˍ-Wcw 7?Kȷ_ɞ-pQc>Avq>v_Rja]`lmei-6yp|>[7듟[W/rY+>!Gd./rXXr*G}k۩]{=zW[Е f}<+74V&Z;(>ܺcm* U\}o툻o<+[/n x4o[:>[!ctU !%F A/Wۯ}ak#|ޖ˽}7g O+}.Tʖ/iҏ~\G%%ţms#b`1WZ[כ?Q7m@ûH1R]Kpq`zK?: 77Ҫ:"#)3 {BχyOQ{z>t0'#^r,VG5[yy|tpn.]wPqpSq"[rѩ:n\};A,l:JXݮ51j p3W,zw3eq)>OZ~X?*:uj7g L=oxq̡׮A̰fpsZ7 Զ5 (Sv1+ם_H:m rryF{矴ԁP@ "d7?Ƹ_[x3<EHQPa'4 ܏?:OCt7XO!A\ՐA>'>Hb_0v){ŭ>VRyk~͕ Se IS؀Xc4ދ_Ֆ7<躇 iB*ヘsNyæ_Y 9(9x Ǡc`7W(*̊JNs -h-v[_Z |$ U,RJ:-_{t~9<c~ggQ-׳^x[ _?\q\8p]+R<^ q޶]Tl9K0<:qҎ8z|GJ0#kM5\!VмҮ1/u^mBHGv6zQre k<ȏZJ` uZ5T?Xi!%Їjb4 \Br8 GP˜tv, Et{$}FzY@ 3>`qo<)@R_\Ʌ};` `lr2;l FA3.i!݁crb+1X=1P\Y2Ÿ́r[ϩ*ˬG;5!ŭݺzR/wyH{A X=ĩ=~iۅ}" :[)]Q*{tNd<V\&iP3v甹><+rGfշUi^ _3EdW]x`3[5=Y")tT^P閇+MEZC/cwP1&pض㝃P =9 \ ~ۢo&ewBXMĞNƳQ3zD2'τBתx( 8 S#;:}૰30pV;:(܏fލ-!- jmѓij  lF> m{Ù "*hc΍5d[?]S$^~? P}>) z?>߉@r&^TcՋN9 V!Qe l;c!+ޒ*Hpނl~8guj'ș2*g`)(omq"hJF.&h&#]7=,Y犮=Vp׽ӽ4C 6M'Mٖa=}Y#Og0mZ1Mf>mbd UɺҋFAJ?Ll{-" b^c®yGpP%h. ޶ ~U lcFH@+D*X;ԸB@F":Hջ\Aԕ|W5ox P\L[covj ˹eAJ[>KlwZ\Qn}W_=XqJCUc@d]$]V +}vԈ mEXP+E^d ќeP,2]љDQ*WZ)ƟDy8/s0xNtMOՂ \}6|3 LXdN;Ow#__il>_0 i")V)xj=dEo2zhti5 ^*݊kVNyE &DJ^Xh@p6nf3G) ,UEV $8P11~ ЈD< p{=s" TI"+}hڸ[ctx3M.@-j'RU h n@1 hkLuϰngWy*{gxNOG'Sj3{;6fvo1[961Ę^(D-ޕzlhȓ bm6 R"Y#>jC+@z<#zPV7K@xt#6{@yN9n?KBQRfZCt$VcN9CCF`$Y)te]MotU5 x-yl乢-Hu MI%"V' !V =+bt7='͹BUuȀ:Xy^;L<`m{I?0g+cv^6W^BnDU7ܺlA`ba|>(lH 1@Zząڄ4!š4Eѳ1A&nrK_<Ƀ)Gֳl4$lq k'Qz渪-ٗϙ|APfSe <9S-*dڪ$4о]33(r"|QP{,m2fvRɽڴXHDTDkTչd⬨sJpsO'ŲR߂䞔[o?]>N⧯'I}Q]i%iRcUjhde\Y[SiS,k G311E0 ^Bu{bPWq+jq6B@wJ;/)$ȹS~p [qxR;(1ep2fdOcfo *~YV5B+oM:}1`Zvplf/nK~75_o˗.o_?c6';ݽ|wg*0 6'̳Ã-86#dG]ɫ߹dO|d[ \ha ] RJ5ch}Z¹/^֑$%åUąhĂ8MіRxW`FqE\砲"懄ޭ'x dfwEc=..Ċ$~ O@ﮀpG4$)m <IQ>T@䗅@HkܰŠQ2/P_hM9)̋JA.S3 I\K`ųNJ%*^Üf$UW'<" ,zxgȡIϳv .EnR EՉ(fDZQ@*B TST4lLh_C\,N]$ TIZ Q8=姤z*҂ ;ꎖ*v yNn|aS':mP:y{d1=ȥV>5j%匐r}"o3)D(p$@QL;]넗˚}O F wd zldNyNMr!Zky@"hjdOמ|oeU O&ZOXQoCWl2#ˆ'+;DM+z9%{iHQSD•g>sLjz'U@7.ĄaWF&fFJ-EJ[OSe:Br`d 4%sݣ H{i! J}ua$d**&~ ڥ Xd/_o45|Z+w&[?3^_yNg|0>uЙ6UX!B=5@Y QfF&؎2v+BQr4A`HD_(x`HɂLzB1`5DZncKpjsb̈c;GpIlX)pFznqMjGʡ-"fyUb\bO6fNrR^WYc=&TI4T+X444CSU#"fi!NV$7qB:CFqZE7z!ǣ?xysgN.@6\Eimqr4e , ЃT*^qĠ{">7 1.6rp" U ' ؋a~IL9ғ5Wo2Р>*BzBJᡓS 3K9$|(fHE}Quuw^sq,olR뼧â3UDL` pâ) D[$2!`&wg2/LC10-i2 N $Aߠ UKEs+ɱZ(P7*A5s+6q& H'kw@kJ&n;DX">',Qa}'܃fGph#6d6EFgmj cwQ^:-¨`?SKEJY/]UxjʼnnsO{Yq%` CV97f%"M^DLA:@(M*y&޹?QX0 f ;}`g믻gهvׇ=v{as;ݭW~4L4d b$浘w8`Dao6eV7R^e 7| ۲ވ$PCHʹǶ1ө-J\x%U;V/.{6+EMQVHxkկ=AIM_#76nc[kUԈC@ߢgiݤP&wlL.Kվ8gjb!9CCoy^lNztV#ڈ-xG"TYv+!![-Z~> k'"*W 훾aQ8l9S JRӖF#55xʍ-<b؊9m^'}<]8e#jXN9P:=屩tKAYi-\NuRĕOWV%` ~7>glQ5A2 mӑvx0 ͖]!yKJǿ.g^?c?VOlހ,[[!=^b<l岂WYzƴAi:ڋC*Нfr{㘪%5 Rr5vվ0Km.͹S1?5݃N yVpC&{PE(XXq ~Cb\7H:z,`x̅| BO X X&4uMW5Z-ExEI &%slS;Q,x.>ٳ"3. vd%Q̓EI/Q@퀀! ;AxFѢ\)PeDԞJRp`1.`WrQը-\5m?6&t&N94Fog)#dU3)hjS%vNhSfc|P+&FZ90&)I-掝X<rVZO`чwpި=H$qFgS|bP.Ѡ=v%FAO_Q#%_Ϲ%Œ => k#Ȫ!uzЖ[6TacsKf/-؋Ϫ;oJ68-آ= ,emI\ ٷbq!+syeyGv#{#U{xU{k -{_m;ww|^Q4wubزU˃-bld 0Ԅjn&EɍYѠS8PݝOC>6(x\ u@q4YSX $ +sLާFO'K c5!T*]-dL7)BׇxݐtB NBU"K8A"m|ױiPd(!SZIW7c09M+#U?&-09̮u}ͬ05ƞ/=}P.Sq¥THJOChEkaϳz/ #؝ k2Ʃ6yYWZ.cT] EUwV4fJ>QCøk1(Hgnpk; N77ʳ+:hEm>4^tVd;Խ0 EC%*vDƭ;MdW'Ui% Ϝa(9Md$ǝtsjDÅZCREA( 2FAHAbD)l3pQYZ4>&E1Л7a+6MXrzo b4jSk<5 cWP$ACJӈ 2W/P HG?;D.CcXFKNPJи9N%RaEr6PK*Jd#(ߕWdO#ZާY2)6pdPX#Xǂ7d#Sa#E>+? 6T4ո26ٌ=IE>MЦUA-^ʀU؋$P0J]7 9N%F=.3KĨ$@nU=m_)Z\i/+ޓ8SH|ȡדq*ӴfFmwA5E'zﲅb9$fh)yR^o"8 C2D޲(+5T5Xa0E6[%=' ҃#$<+2&-^`βD Bתº\.vyxe_K{v#{x_+{}? G폗M;^s;4o7UTn\-۟Wu7,&-uߧi3fWoi!01Cp E3 IDATeӐWm Nd`I(3C5>EgC*f,@0MhW !Ny"ώgEj1KƸ[TAhE^s g:L T b&x4ibjɷS6qT|TsKJEZ,Lбy,(XfU–g -*TUjRԬKPe%P7fP7:t/%R\,RV:ıAhA bayQDxj5.P5m=7V"cKn$0YEUh*:xԟoȑ½/ȜE͢\ˬTF1X 508W(&J*w'h$m(XU ece% i`oƈpXj l@X ,fRrl8P#F*> a00af( De1r.etqPxJز"@4AxYq'#^[Oks;uk2;//4| v~=v3?_//?tgt2giӴzM)vV0j\JOjGdc["ocUMnfKiQWW5=BYܙڲHGd ?ǘ0) MOL` $65 $ϒJbkԾR~ AjlN/$@zLA/l)1yĺro׫'}W_]_k[.v<=~72;}g>'߿nݦm>tzf:N;;gl4oUVjˎNTam?k=5Q47:kv)Tӥv:k0#EPhgRvIJrA(>XV81SkC^.ZGj>[R lZvGPoD abŏD5b%ز *:=R<”Xk4WWMVD b[\%˲tTRYRYYdEWGBXm"T=SC-Rv Q V* $EJV(Egy(K`sԹocʎ%/t֏Y兯UzAO'{E-M;=ES] > (*f1L+@a^19^LXA i fA 諰2/w/]D 9]05D ySy[w[.E}liƧk >cMyhɀ0l|y`g 35?{|ӝNwv:߭ռWئ1Cݚ)daf63k.Ɛl>Z鞯+pj4m Z=zV lXxtE@ (U-bt`aN+b]@7+'tKZ">gUM7$rOvU=d%~EaP[ #EdlإO~r 'TSL+Lk\nW,KV4[.b_q**hX!VgC+ ߃BFUI7 `0=Eb+W=YeOM`,&GU aң6YX*Д=2'@N&QA 4wblcuǛ |qœYI9ذYZ<'eKJd$!=gE?7ߓg"_YgIA ,"/ThxXJ !Q ̮8`UqU%NHDηTğ:kh%jhU_Z商Y <` :@ 'w?p *s Rvr]P@NfFvqFeWU9DSn8hm<%=XLF dv7oŗeַl 845)l}GNh]bכ*k\m\lYܕKt(7iillӝM;Oߵ mP+\n76U/nv{l[-n(j[7Xw%0O(9n8vk:T=EQz=گ8ˑ^L>y9YRc@̺ @2qx@npT$HS3(nVVe)>Ce9fubGcDV Vdgj()d'z9j`WUR*U4}O峂nS;UGTT IJ~ZymЮ>3 T1>KߟZ6:;̆ql񓧇 `ŌC7 s:Tp{fr⦞n̩jdHE%\ -U`|)W ~ 9R?Ƀ_O Q> /dj  $HPqE.WIǏ"]>,;ލ.עu`,M=/v @ղ\44\iM7޷{"Vjy؂O R,ґTX X`SPl\$E`TF5XAxT>L1!I/PU1}J+;ZPZ-. @PFְ, zi P'ng`mc\j%"o*>Faq֥i(JҬh^⹔3i-FEnG_BjkTjŬ$)}תxcjZ6kz<¼zzEKI *2>l4bBI AMl2CQ[$nR?mZ槳;^lfƚ&QT$?$~P+x^>w(VlNanXN2>GmwUo& ,8`b(JOr}RJ#Bǔ .T'ұЙDŽ0nEũV56 S}j%g3qY3$ o:3@{`?,YHdl| (f~՚V*?͂:`8.G:KYЀ(c Jn]=9 w1&hgh6(Ŋ'Z5,/kݭY K|ͷE=t Z嫞i)<Z1< #[bunW]=+ٟ-1šG~Z^ga85bJCK*UlG?9iLz <$@x@z8kuJJ3=[To,>9Zk JKB uҟUřVs+\H=uw׮º( 8We͠#Yfd%q< ,u]^ɊCՋͨ#ӝͻIk'36Mֹ]QOb3Q$9qs# M]iv)eB][WPIATl$(2ۇ Z #]OEs3 !F/b٭-CA(4gzB yJS>_>q?CV0y1|9mp/e吞Ynvgڵ5Wi P)V:SlY*)b~>|frt\2@))G @L,?#*zWcC٢UeNY:|'Lzsm_O _O ]Ĉ"m!GL ɇ}j% L{0y=%$8HcĀ[`o"KemX$( K\rymý߿+{eWv_6EoWH!ci>mɖlɦΖݳj>mK:R'i#lmW\ldSeMUũB}r|' @˲Z^첃d۾}i{lئ`6_ mbaOk;qS"$BbREʁT'\3 c\{Lb2K E縆BlEBbpGfsZ'H͈;*L܊8" JE@hi}UR`=1IֿJAXt#B)2A=߅ce,&ZI`Jb=]t1ϑP{{*[gF0q̈́UGSЭ"L='{C>+RnUSjP-)Ngepw*"a]J'I&98hڞK#U :*h?0JQ^s#ÆsЫY+y8;,`:j&c-v`8YBgZJ Y OJ@z@u)7ܷ"cё Tj|XLVh8sC01 ^^(Y$p@!IoSc桍^(kg%e2.pk||N|gs9cMfA>d1!уqImO(S&!­L P(;(2P7aRVnU}]@FsEAx5˦,4Ki/7~<>˵'v3meWl~Λ*lVubleUWm,ǴЭpcih-NZI.el֞m6WeroUipo5MV|˦`l_᧾0뽻mr؉>dg͘MꣅS'(J\/[]!Gj~ؠ$rqx{@׼(L", 6*`+AEQ_)"hn.Q9Ybc}~$#ji=%@V::[8pL=1I qK] 1[{x(TPX#ᵎU&pEҢmKYPp,i RfP.d徣"PT"斕9l *'x0}4ng"_ܑ ꘔIYk бxeŽwYl9ĖGs^ i=Hi>E٤Mf/aMqnR 7hL$.<{Gr8V}UEUeee|ZWI2C: [+ 5}|<=}絘 sƱbq/Zmbalv.rVBoԑ֎zdEcLK\`}58iBz V70SBƒ^O;x͇" VVCI. ^Zx]֖TIV'S`dS׀Yb<`)kg? X .Y6Nmoy<SB>^]nop\"J?߻'% OA8#Q3mY\YE;kBBDFeݐ+;"fAoP_&U@mWUcV \>>X4Ś>/>9~ MP IDAT6Ǻ`|?IoFV:MDwqv1~VSc(+JZ[kd+6t V%=;k5b(y,N,$ΛGiZ4Ya~"MgϸGWt ;`в񆧆pjkrk::jO\՜e)N]BKV< ͒1s_#ώ3Y G@.XS!3F#}cxAwZ5H4<@Vfw|pV2y;ٓ+v/@r*%+e||['gr1ɰw jYky?꒕ Zx4E'G"C@ghGXk96ـ Dk[?zYKf='N^unbo;;b' ^S=Wb\)&Yu jN%cK&`v1~4KK<0슏DbpͽkѳpռUV)\/em}SWJG f}VAOҁ!!鄘΂UM{ʯDWP&3u\XTDeTSP+R9!suAsq)ZJ;qTFo3|e_~{jAC!FcLtחJU$,nE@I^ Ώ s͏<5|&謁g-))3;x<%#srGKB أ./8cIZ0Z5.+Z:!"o12S{3Os^ap +Y;oݖegϽ Rx'Q3~fg9 ;TrFA߿b+03br{0`3;5d-[Soh4g4cQl#&l޲Wh`&o<9Ϝ_=F,8+x,`{2Uôk)'ua|ݑ$&/n^ؽ7x(bSYU}cdf1s3KMH{7ޮv4 Ec'۵jĵ =y,N e4z16댓ܤV3Wx^&Z`=ګ[V hKO-D{wPg W ds.KSTSu:uI&J?7; EB-bK&\TJ/n@Lc5ܸ058 {u\*uoOpqCN!x[RfmhZ]4iI" `k.ĪZWVڸQк:˸/3^~ӾG! WLeQN 9Y%NrI{%bcjИ:_'Tq1ke,)xpC%Uɯ|;ƺK -AskZZE~ Ld\tsMZ\b=`30L\6{Gt eq7) ب ef=8t5 Oz\`vAm]Ney⿨ִ|@26|Z;$*"0խk 0O w}5,آt^=> ,=ݝ8jFp驵0lMP{"`S]X$㢧)#rL2FhP&O ,ˠGHt.&4wP`*tCM:OFX,f=`^X]PdMKRpWx#qS]]]h_=W@V>6c} [+>V^u⃤α(-*Cߊ3`9@>Xn1~hcU\U0*+sg p)inoI ]c+o "MHy9;6u 1P/9quÍq| 7 :E1 bN 36v}15# O1I QCHkY2i&`C1yw=RSr$Vgel O-%fk=恳>t˞ @!a޵ThQZ,H$=|O5i>WbߙZ uLiQ>i-iu4[Ly4>Y@ih3"9 KT`ڻ~}_=Xkz)|_0CDPP[5G5HAV:d"]ɱH,\h%#˩ Ћ+kbu^o$i|_n|53[uG@f3cEzk #IyZr?xiba9D|#w0c`3فLF Tn4ۄa :91 -P55d Ta/$<`6A= [l iCl OlȼoԪ\tx܅4T4oŢ~ p `~amGgTGm,ހI}YPLiż#uS&ӈ8hB86NMAlGR~d#I3kB^iH+DwRoQ7Jgj2Xw|"H]{z;WV\ܔ*j mY=ZB!1AZ1}iHLlxer&De+)`EhH=)qH2l9(%tE%xl&ȯ+9gLòߠU}3b;>ⱈ=21Hن!]-l= &/UkiU`si|c!HLF@ZS 2>C[Dbu,yFkd+3 ¹@{rA,;3 Bсߵy Wn`G~jBm5%\&` 5PLpω0m9H$=6a"3d78BN!.$2NyYU/99Ab}2-?+<(Z(hurvGGY;U{%`s ys=֮YH1%ǐIV[ }{֏c 4bŪ {G8^0XY,`7A3{3 L#޻|l-y CoX'4zv3 'jV66V{gzgP>N8biسl=H7@X ٚǓGm9 ^q`VꣅjzgxO \UPZaĠՉ2zGX19z1,W%F 5'A*@$gfC6t1Mpms&⤍yNܺd?t񵍁,PRyflH!_6/$=ノ&d-h:@u^3jmˀdc! fьQZ2(v~1ϟW8Jlz$q:Θ &YרS$`ף'&Kna.xed,c oŻR,PJrJ43z.@Lw;rfE-"w_P L{qys·eqF_ib;C{-v4D134iɵEFҺw9ӓPz &x\a̍)' ҩeÌb<^\2[²6cr1`٦!.+ )_#qҀ0LU(a1@ XM)q5u#56`C6GӔzDC=w`'4svgsiM 2}Yu04Zi eBD::qձŒD16';e`9ɲBtx8D lE ` 頶3K;wtmmU¦ DbGL~kUB8$fWkp"Q H H "Pc/cG>, f {꿢bZ ̊~_M{iB!DAP?d R>FcHU1YcqSНyDE 䍤T0&P5wY|^rYޭuȈ!|J kvMh,+;]( Ŗ(10r׹Y2>TFy)w  C(<1NĊ-Dv\DtG1H'b>_$W۰ϜsrYZ,fEC_ˬWij/{V ݽ@ kTbLBbI~~,z^|5l\~A0NS.φvtyxyWMŗf3^=X=_O-3jŖ=[v%p,~'1, ea\ԳtnJ Z$s,DU)Ej~yme^ݽ[v|z=G?vzsn^gNO'p514PbϚ@1 IDATRy{c= DKҲY0LV3~覑kI'~oq'Y XrFz *ӲiJ\a3&%}xB]J_L+AG_F.k5`_5N'׹Sz]Hr8/i9 ʑa]YW~n3ώ;jFirrtlm~pMJ'_{q_dE15Ht ʪZ+P# 8_wz׈$ܓ9zoד֣Aw<:{ZW_^X9R<AN/ܓf:i‘\RjbȆ?«cS\ u 9}9;p|z=+.#" GVJU7cad^8qU{X*(~TJ?Y\ 3T>AIN{-uKձ ܋$U. vItr&ϧ`Yi'k0 ՘da[O(}9 #)Z+Y`<i9:iKs *#b&ZĨ5g+ e}28hd(޻7{16~q2!~9$uؒ#}4yđ~Vssߺ@.:XLNZ Ȫ<W@3q 0D"jmVg=Mřߔ@85`Tj,b}RCqGlK5OdR4Ҵ]ADd_l  "s}|?FNS}$\`e̵` Ƴ`)tP;ʬ1e+\C.w٘+]1 2;6(8KO ws'yvμz%-X+0yV$]yqeZ=lv4bKqX!̫{z=X߻}Hu\5SSs6ɇM@W]ҕsrZ xtwdߩ4{tO$aЗ9פsF9ecG:vžJǎ=r|z+H!"UV:NaGh! "NbAW ϵ'}GζWIB;E.2YOۯpV &М5e2[[V-Դq4Y2c\zދ;T83j2+R|m;)u2UjP]eQq#0Zt aOxtDӾeaϒ@p@\w[1J$H.uV ! ppvH#.44䅤e⮾䇬ǝ9{hLS@9 'FzـB@UmESFSz(-SΗ~mLNjw8T.͑)Оt/|zWga@4X-;u>gĜ4 ;q cEg/3eb^GZANܽ~q{r}eZ QދWb;7ANJ8Cɒ\л;ZJu F'KrνileYiKVJ`& e]{X. #Zj։.\u*e0'dl.ޯ1*O qٱs]V`|H;R ?1:Xv)wpy߽~:W^ !ngl[_~ ⎴]rQ?Bg= xwN[H$SM+(~To9dv+N9 PE˘'EP,krBX tlyq :V.:Kb`$VRN9%,K@`/5~ DBkמI]T-[ Ly: 4w d З 6U+ιyԊT|u{7V(YI2IűOCD R@zٷU.#|-\)Vŏdvn eb Mp-κsP=WB3 B=AK5c]"s=/UBve2}?ҒUDY)sYdz`=wGZ~~ƺz4@ !\ץc$-ru^:u~AILs~yO ڶ8n'+vI?g~ЦHAMj}߻1T0XYNkIXKr*@Mj>JA ;1'}F62V2YgQR|=J\\2Ud|t%;^18jb|CvOG|Dg 䣦FL Z = V(~+vvfg7E/CvmmM\A<,M0NnǤa}Lt;쇔˯l~P=My?k1T@+zy԰)?ѿ_Kɮ%ǜckwlb;5&͕ImprkS0b0&HzC^ Ā'㾞X tϑWx z1/ۘ&0ǂ"9Ux0]*_Ep4?}J&4 S>buS:^x# Xʰ"G3/>{Ǡp:huSB(͗v}ǎ6{w&V#iڞF~dWM w5[k?UM FJAb xޓG ShzbIZз4 x*ŧBv^a#H(d9#v XA|Edv(A`mmigJpy/{9 ae2#rnk`<5fT4{k p,K+ZCs͵#"#֮Ŝ̟%\ }=\@T2R 8,^m۹$۹~$G& ?RVֳNkLܴsBH%2Տ<woxK&V8J'JrO I ٵ*vOZ]wM\?bvWiߑre8-i3^٣wd@FRl'- 8"Q">I6fOhR $A>8ntǵ,v=3V5Ɖ|D)`Ʊ|̽F}@/x5ʧBNضSy2rZk PNT6 JOquB3M9ȢT5%'3PҁT~swnwKSc~{QK+G97y볝' c$`خ3##2&mGD9Ǧ `%c}˧)`aQxVg|8 !d nQDqcs7ӈmbv/ԜḻqT +۹46lC/}y XJoŸu9g:85~?CzNC 1gzŐiBq-5u< "QbuݑeOD[Eqz$K.Ӽ:dH+zdhBƆ'P"XNLDz~ _?RaaIzN/# 5zPl-:d|icM3J=xN5PD2ize(ޫG% K /Uqn-}!NZ.ӥoVST3b<)pK\uJß"{OtS6qX` ǥ`>rKjJBS7cFF[wdo2 l%Ok'dR$/{/2qhǎt ;/5rxglH٫OVedźO:0svB0-PG9"& RDV׳CdJ/XLQ.GpJr;: {:jR6xBJ [yF5gE1"G>"E f|_lch!)>q 9(2D;KW3c\i[\O:؊7)n1xƶe! @Z \ X1P׳&^i| bH%io/H@\ uѱ٫OhxKRJj)VP1l̥xfQkq(1 AD"wk#Bb[놽j#pܐrF >\nĩ& .mާ$D"IdmcB3w5e\M=%~=,?{ bH%{)h1|vo؊zhДci ǁ! V_e|Φ $[c+1s3pʈHUbqgxXSG4[+HK`T޽Jo??/t숧[]} [-#Sql`Sd \ds8L ;+Yu'Iǝ8/1j]nͺۿ+¥c )$)r 7YL5+Tϑzvq"`ƒ: (wۈ_eMub].%~3b,. S" 9GJQDb݆{TYb7z9gp4ԡ(9b"a\Y*%s1SltY!1nHiGL#~-k>g~9: 2+=a07iDzOXoS: d8:K&vyh=cQEďJdpzzG}V) P6UIY^_YXS э&bˠ2{Riʂ<-4wgCg.H5-f;ż(ʵd;))yőQTz92:^|Y4 ᗏ<ŇNϰ|*è ƊI㜒ldwȄ&>OA;XE7ZiPG3%+]r 8G*7^8?n E d9Slfɐ ~of3 9s<M-0ゴ? @k?h>2Vr"m7E!N9Qh{W=л]c,l'j oCt;VV,v~PiTvѬ7M^7ic 0RקQݻ LᔾwQHdq: ֆVsj\pkh9eUN4˰TL.orߚu퇳.la;tzu]>Vs+ә:y'?sR|f/3qȀd"gpu8B釸.sRc+Bq:8}RfΗvے?~kLN^g/!ϩ4haьw~[c>󜖆q{"iw$Lqьn+yrǙy'zp4Or4`}A_^1J*i2:>$d 旙PՓ{=1k f&ؠ}q3Bz@P$;C6S< *JpJiJ BE@ILrUR ,b1^c*@X]c#r֕9OuVm4j;?R07*\Ţg|V朐E4KBvԎeW5#M:>RzBHX !)Bc47 \IK4};yPMlVc>J9wP&"'jԧ+0^rtVGrʣj>uwڡNGR}6i`6v{>?q6N@N(J*Ð#&agB܀ySvbq\ .j1 xJ;#eXdS_}R9aTƁ!Ű˳Ȩ`ա7C&)$p|.2JՁ.){^qf.IhS/ Vl3c,t-trX 7I+6^[VŞ۝nj؞c܊Q̏Y0u0`bqu7,F:IhV}Tw,#qc筈uCu9[=UbGq]6fr1up$x=+FuܞVUB4{yG P\*֘zʪfRz+MA{4IVN?=ҫha{x(Ni{4Nҕ\p%qXٞIW.jJ7QC'p/PC>1?*2?4x?&ZC^~TatgU릺>sXNhaыENTc-4]TyM9 \EX$4:#&l!V:@ /bó-]  nU ǝ _Y݁céMoK/h s-4u'~ 1#ۯ~ۯ ^~ 鰴I=SaZm|`dW9cVIqiz>͜ldXu[@(a((#uX~r՚)kBxz@-o/wee{*zyYhi7N>}B?"vFPȜ]jfR箫$BKr5Xp{I>Z%)'ͶBq~{QGt""Hf)!E6S걾7)C>/^=/!1nwacLA.PZFTAs-E$4O+:y$̌ 0JU c>>Ѩ;T#N@IXFRN,W2.OWO֏eD5)4L){#v 5( ܃|[ Ӂ#kNDGB-g&ycp6qL7둔5A¥ozcl>_ZMP b{ b<dƙGu"K {K[Y咄bIjQ1c)l!ҔutH"vө1Л-YCrO$1e`e0av‟tx{<2O̫>Fr[>Zbߧ*y4Fٜz/cnr,Tpe},NNAJBII}#{ݿ 7?2XU&AIh3iQW)ӒIz,yYX$p]>ؗlT6>ǹ~xX$}$e<)YVl%Xqץ4,~?͉JӃ[}J!Ύ㟈^e|Egam1LṂݵLKe]߽. ݏbyN"^|,GyDy&"]٩{t%50(昼؇|g2h"3<=# % +8K]?i_=X?ׯKn\buʱ&% Zp9u.,dhI]oo!wd$#*I&VV@Z!7y6u,%#,vӎtb[w >:RFL &S0!Z 1,K~MUhnIrŌbKсC^_}/e̤Os"[:#mGr\4..n=nFª:0Tm0h"M ^xfHnm[d)#1<PH5 D!D {b$ 4ycwЗ ~=]}r1{Y1l!8~m4E)ɨ,XGgcűVjaZ^~_aZUVaEa X`1vtDf;<%㋹B4g/ o{s:?>O:\rR.Ud49@i.ϩ=!ӄI tlRtE Z9*@(mupn %wX`݉m8\rso}N`AS.tew@t"s.O۰p9*KIea5M̰ꬵ&YhG'+P;HQX^4MUIyEFvBL'\tҎ6?vDt&Y'yMSf2B%.i\;~UnLۧ:Bﶠ3=3x9#Q^T|1MU~_]|Dt)@Ea$-{qwN\U3a[ s?sIjwƁK }2CSOޟ8#+'8#!wc"Ǒu!+QTB`8uFϖw4pt!Wr]nK,}e*>ݷTk-tT&\C3=]##5Xmw6U4ag M-52q<2qc el8Vgc>L6Is#7q"fڏ"skCO'GtF;nA?P#v<H>:h|o ;i@4d;$`ЛDbܒ0~>% w~^kngj+ ΔO#!oz0o U4pivjoݫÖ@.kZƤGPR5]fYY",;,3Ru6&kYY,93ˍ' 1L'Ɯc2Ʋv%!v1KY/H`~lSi OwH;EXWI? y4ޟp`,[Lv%,:.Y6F-Tչ ʾ1aInbi)!ҵֻrUb8i]rq 44 <,S0Z1ḆHh팰]Su7|1>^5xn]VO) Lb6_Sʉ[(Ib]Goj:J B}J`͗H+$%IȂd+# l/+ t!\>YtnL5xUݱ6p֦'[k2 ~GfkRY܀\TkĽk.Uք܉cg1(C0LNE{'k.es葽ռ.dIPrɓsՍ$9a@<雕ZϨn&1eZWvsH)&Lwѽgv(. &ٌdV$=0-~b^=X?WA&"RaIZTW8f5O,f. Hg ig{!^?Chue"cS 4k}h%FG(*[ք=e},,Tb@,c1n}Ou)PGY(%Cܟkn;3Q|54Τ, =)\\{gUM U!W>? n@1#7lqCsqC _}zf9T F6C03՝ano*$cѿAyG: ["5_A~g/>*nif ꣣)߻ rF| ӦȰ>#5ҁqR \H]ELk,zzkCumB3ϨN\,DZn}#tAh͞th[k+<@ih9t"l=}"G6iœhlD&rbQj/}`_?ş 8V:eƭ`0ZʒGV #-sZiJ:#nL5fH j޿i,5#rst!% Yqe[ߍTO^W b=`c_E}-ǽGo#H\@cXUsnk7BF+ytOUqU)Ԩ:L*󫝉QMC<$O_M&6PHE?nV7GsrroOmXD>2sd,-<$ۥwʢ IDATs */?w}l̂w|}{<9RK'κ{0iyӥ# 8BqEC݃!B*s QsG@};b8{Կv+C[Sڵ7_Qu kj? Oc_ ,"{`P8g o Ul[V,! 6Fi)#MYre__oo/BC*se^Uz9.UM <)Jv_Q,Vv¼sYրg0NնfŢdh :h`mgxZc7/>Ͽ+t4l9@?dtHkS&3HjdS'(]%KGUg 5^RөzBһmyaY* 6µՙ3^})~| ^;Gf(:ñYw|^Y!k_"bȈ%Q@D{0i p@yFeRslcQnN7?Baݾ6?͌2惟t" z$U'd5[ݛYj0RGrn;宰k%b* 0?$uO@G]9t.crxι4rBť/i0nq\ z eiIJξ. [wC{/r CAȚ ,MaIM jYur7;6ObR_.NAX[[ P%sZuozzfe4okg/rЗu.Ζ$I1UvCQoMxj2y`@ [7fq%Flm7OWO{_-gZՊ4D&t'doFءq`FIn&0&[ [f9Rl탑RYwJux́~AeaG&`+z<5 ?7x_<{QվUWu|0M$uG: c @tEh`BHI(HUՠТ KP fBH+C,CD 燸!l興W+:X=. 6odfV6?Z8N_CTK7gs GeWkG!t)LPi: G:wĤ\ 9x9KfN7c~ΞO(#}`Q)!w|^觠#Dm:BH\!0(0)V-BNG #/꽬V&i㮍Qd{W:v⃟ q?#6͒%u{|U5==4q$a"iV_/&@ F5(QiN&a^EDUf̀l+z/F>NXM8BB_ .Om'eUî l]4`uǺ(pUMjg&*`nlș(4d$N'm (n Vغ1Ə̄q|u 9I)њYYiBG l9f\1VW z>P`+5 w4&v#mm{4jgH6'wNOm\݃g6ϩk/8%RG -Rƹ<XGẼpW1|ѡ>jU{85;6h'GnAy>PeaqCQX~=XQ:w ٹ5n;~ N*Yz8̌~0'<| B0=({-A<iǿ+TU*1^7zrjiyZe\' q똈xn% 3'BSڋg9NyEuD[PJ]k@9-u۵'WE}4G c@CuѱYn*ـ|Y)̈66xW)lm6vKxlcquV_Zi+'*Ⱥ>zzG)`t|R%>|&Ʀig,4g?OMŸ#gZOJIR"LEjų^<2xdo߼Z/1\b+ ح&#}'l볭7/ľumNq)`ڗT3Z1^F;1HXխK)x]R;/n]$3nW>躴BiD`V)Rո칖꼈KiK?tۚ>?ȺbYRoV~^{~]O&,YqX@UVRXᵆt0E zeHFe;51G`~xhedOCCrgON.~nl#9)Q.Ӵs S:^%VEqhQ:p:Z;sI-#2kxc2Z5[qobJ5 ~ G<BB~ʭ F>YAڃ ]id`!XQ&@s@$ɎX͞-q-RK:=w_>~I_\L㟥 :>|Dk:>%@VZW/91)#`5t켽 NGaQ8x{,?wShvz1g*T޽mk :=~Iw >ktxxYkzxxM%-ÁRk:7tƒwωOQ_DHl\ۉ=K:~ل^-jOD}w[!Ge< 39@)`}xoDpf5G@ҟ+O?3t+u|IݱMB].Iڨ]6H?yk^/^#:}&Zѕ/NT%'!dwK7}Vz{QWF+:xEGt|xIKQXDZ,B9\7ZKEz|CœӺ3uY1Ra]KY+K=G'=Oasg%-Ƕ.@i21+\J78h[]Ƿ_6&crmȹu9w^:cƞ&`⩮cYЯʷn._/>Ë>E d3 }K_лw_л7?7KzO_׳5= =ƧlU;UH5R;㛚@NovY.0nS7xNx8`2:Rmd>dн<y?g946wjxV[hZ4aB׍eT{ub~;=hG U|46:2'ٶ3"%̀7D) p)4g,DI7nAb8ɥB Unr_M:pԢsĖQ Zgd.:6f6Ԃ@pP0L8*h4u9LFRk"J2Ic]%Q]OuE t +èubii4M~i[3zw~z(O¬,!*_dSOO;p#mmϛ@}h[3ӣ?g +uE=&!3?*dk?xW[&GuV*KcڊX6b=Ҷ)SI'8ыz5@>:5UI_M#eHtGW=Um3&g>кۍP1}R)(G L+.f*|"Ѻ3uںк(^jcu.xGbLeWa]euYAˁ3c2-?EG;hbzOx쿣7MW^X9SZt I Qɉ~+!HJ`\]WD 2X=A$e wxސ46.#2%T~sR#mm#)ӖN)ϜZB™PCiɍ(Ub6:#rz{xL8&A"ӦWN+URU8Df0 Z"0p[o0O? mOZtevq+\E[I@㥬;0̴P:6^~uzk_C֥&I&UtTͨ^*}B)sٶ8($Hy9m!΅R)T?Fjp6 5tFCe"L m`Gbg[6DGrR7B~h*u%jm+mOTTRuXן\mosJ팤|m9Q,$[i[$u0=#=;u %-GZڙ1%5q/8rs\.NՖI;kӍؖ@zӚں|'z ly%. "\LZXW(SlkFiQ};7Xp^(tζXQa?B\VcmVp5MmoօT-y)'*[&B9%͓] BC|\m,eg&bo`f0blw[uq;NIܼKSזڜ1O^VJ?9w uɏũGFdJ]ƐgKaXc9?$uU SJ|xIpN ΁>b.$B[o{[c~Fd ^-'&ZZ6Wه%4RYʚUph̲9n IXj'XB9>Q-ۺ'U.:UA:>"[u"+ 0cebILhաn[aFPӿ1x $t88 #1XQ8zѕepPxz2̾UARfNdid6bFqbV#>wc MD $wՅ%vDaab?Xx" ad#ld]&luW!M(1X .LB^ePTjZ)j@ҙjTj2S5Հ;_.ZO`g<*c\^}TA$DUC[-D K( I`s$+.) =v :t6I$w(|  BTEIJJ(LuSj3nN?/-X[)@eۈS f8ҙbm[>7*Vx_fyt*SJdux.cQ]JԁQ^ gޝׯ_ˉrHrI[9iPZzj@I5aץ}T/ +[ b&թEK$[O8RXP(m*[c_d8wuR]Rz^Rވ$Wvmskêj_WץX,693뺠LhRר2(I=3i)U6ʶ\fcj&@DH8ױSʀW3&Oƪ9ktM+*~hb^yo4%Kciu?JB-d!b9-nƼDe"rӥ$5gpHF.*‰.a 9̽MD&mrDuX~VE MP Й 'V<1#1&* O$F'{ch9&6RqRWč @BE:b&଄#OwB NߋJD0@izGYϤIueQ >k᥎eas_3C/՗<͍`:K8.ZꐮI9Hn {=Ut!ZԝҸ9-jKĴhⰙhQ$ cd™*HYhI앣/?DA^hZ,D檗!aVaraC4eqMZiXn+' "{~>˃{6|:e-wK @J59%$6!IJRA Y9t܁H[^)X PeI,B*T7FLcIowp|:/ JK9kl86G$$Rf!sQ2Li]$ |=U8@jUPm#LX/ŧjv"Ě =tD3:*x?pMgoJi(BLEP+\L4Qd>~ԴϘRn3@~peB>Oیl.'G?Y;b sq28∘FVcxl}nXW웠#9PBMD윸U,Vpp{EQs AYfBbn9+ 4=SNd#Q ABO\aӻ뜫oI%"6c+t1B*8` &Ck=MO }0d3*03oG@s=v]zV]g'*lcPdf~Z/C,A S_lJsPbozPrl\J&JRB)ZAٟ~_/'. jZIy٨lt 5d5lUX[I(-n/Ǘm4%A &ai])&|nq"l?B 7Yli;U640t;].G)uMmܾ2C+X[ACxG$d Q5TVD T_a,AL3-m]Jy(vٓ 3iq:6.z]^5il:^%[#l.-A9|cW{ځ. WsD1FP }Tuu50e#L, P|DrLo[!yfQF^ 1$?9mgᅎ#ñ(73flwskx'W0hz%d- e*̙tv}ЄzY ~DHdk~"0y 5Ԏ}w xll]@-E.GV2i]&D 0/- $wF1eA=ǦYq&WC_w"JGO u?B Ă\AafI="@]{35Al,Ha  5{ FP ã֠0ݙW3%] ZTa$ QXJ `=0\@ +p c&,nl?\+GIݡWq )7*bL~'&*5}Xlt++dirDC"ŝ{r>{vTBV%rE:^*zl>˝OIEM3>RKLA-qUK"bLj"M6Mh:ƹ1#'G8wc:xv)e.mT3Q`OgېKaIJeST%KbɳPݷo~kQ[/I`/H{s t{ ۀgvt*L\WpF*NkFB ,e!.ٶ?ka8ޙ93Gc*,GLffn xPGD-DY,LTKEu]:HRP2ؙ9J[*H"Ꙉ}*:j}]/˶tqMMJfhHsXtc-H-%pdi:`eCfkߧK۽ٴd}Kk7RE06/M+١X}~(DT]BEvVO!t桱QQa"6K(i3䃢uT]W8Qr`}qYjLAJD#Ac71CkF2Me?`4 'C(C}<ѡʼn00)^S}q=FH茈̑Eyn6n݅5O$^Il>\&knԒj,r.&B#G^  K`4<0X FC6Pug(~|N=pEBSW<%̝nbuQU1>Tx7 s^>i:h@6yuCRW5q- qYDԒILZ"bW!t0j%s_s;P;d)]tkIW=]isĮ#%U_ ۊ8_wSZ@t/>ك ͫSfciAζ$U8Ù'+nXt^}m*BV*Xڊ2; Aă:T$<*>Ω0BVaQBN(`x .`-&ٙim9U'ѦcDj \embםڌ8X{> [ ]r,~*40+6)3aq4+úl ?xs6\Rn_WFT24[\cK&I{ 'Vs:Rݿ~H}Eؚ,ƭ#0UF!=&*)e!)lϚan{N[+-6i{UBX/ K>o51М*;?5!@.70?7\N=j̾ZAΔN@XGE8far0OvKGi:mLiXs*TvHcE=m,Y4O n~-W 30~U3~&!N3q)q { @!p;L+V f`w62 } [!*.Qb|i` -N1v)@Q Ab7&A8aW 3%o/ԂW)YU\G jKtMuus5Jg' ,D-̎)odPSMoGMQc ?oG LFSd"^' Uǃ5mJ+9,'UטP]cT/3i# FUĺ3IvmAX+5 U>& `ULIK)WnI2$m d1fo)k:/=PILI4PV?{n.U@QdUVzf\R6dm[(+SkMMg`j6Ӊ=J 406( dG 3,^ܙxM´Pm1G׼ж,Յ\β{^Z3]}Ys)ِfjkbI9^,K3$ɋ=C:EuqrLdPpdIVFpI/T&5CY;6ڈ|5(P@* \a` 0CN'S0vR^F ?{5}c`Xڔ :wHpp)i("faW?Ɨxto ~0z̓HAƃCE@ݜD,M?CC}$459[# 7|K,I裔#c3S39ݘڞꀹnxmeתf'`~ Z1>&څmw-bPGzز,VDM5`L,ScvMgq"*peo] ?Quva"j OlR ^"@V*׊3Hy?B1%Sn;/GV>)uCJ]KldL^zx"s'd(:Ez-&c5f9U(j mS.!%uD;-9=MUuɤl:jĝybpqYxd^!D#OhNn8O&Eyz{7qD5S7'hcXg P|L T,^ .0< ōQDiLyi7Ps@'%t`N\PO#j;@P(/N8^|U=І@7 m2M =P90Ĺ8HAvxƍ ($B@(S1Xeyp=c9*|$si դWw`Q*/ǖΫ ;ݷfb2ӳU\^tAQx_wg*νX}Q}vde{>Gu_C87\F. %p!^FoSh*Ugto+Q~PaX"TCu{79vABvu54Tp2&Kbt2 C&uEo6E4V+-$Dq~]PWGrPHpFyBb+L\QtjYN @|ub1|e票Лpq?Alje??zzm}G鱺TND~qwQֵ~ϫ89zvPPW2*Poip-2 机KAмb@m/R>&"4)ċ3Y;8@Ic5so,-g?hٯگo#N Y}3<qnwK ķ=XDh:iO0}q\$@o},u`#PvafmpwĊ6ZHP]y ?co+x~K2f4 in_"02 ȏ\{p4UvC19s:u~q! 3{7;B,ib]c8f* x帏}oNPR,cHܺ &_;cZs8-)?*$8J^xcNMƶ>-i6BPś\ԑ1vZ" #%}G8eY5 c\aexd7 *Ξˉ)lIlRϵ8~xq?K^L;j̑v';s0h!W<E˧/ut-2_wݸ6,ؓ>gqX^s ZAA7 Oc(w 6ˁ|EA*O\쩁(N1eiqD j!xpBCvPfG㢶.}<6bJnMD'JC{G +DK3Y¶5@;:zzKotzK7tz|Kz||C3Ƿߌ[N{m pͩtSH?:t8|]VFg  #ƕP?=@YKJ9$!#oviaۇ:؀Rf&h~OB36dƁ'C>*H}s[]ܳY"K]z?3B"|>)rQ~,Oql(@ xŎHsϝy`7.30 ^w73F1K+u%l5&Bm.t>}>;ݬ G/X"bP_㾗rn?JMfRlT#Ŕng¾ ݑgbg#ۑ夌ӾW>6ec-. u#q_aR%xq!J)m7= EUoJ=\5K/C>2fQk f~ؔ1Jna`kMk$#Ѹ؇=gI!K=pD\XTG:-+cv1x$֪]JR,2ֶ<^|ſSWR53+%6:uצ/{āMEkәi,"mצڈv"CRn)$(<{ bGItpQ1ŭ `uQ낱_/KoRl'#bl/Ī޺>6-!BI_ IDAT5<.+%4zGo^iVjԷ4:ev:l1vRbIP w݆ w%%<չEr@䱆 {UW pO2絎]-1Xgw;u]i264q aN A 3|.=?IДE";8h/GG7@@v&S΁_<>@̦v@@^ w0m3k%JE@Kn~Ν_D3~ngg ( u X"?YYu*cepk"w)$;I,#G)vƄƱ.u .s=[9jjGnr_!P߁$3$b=?L@d+3Ppp(k.{7p{:dpsHL-yГnYLŽc(۬0f4n]̘^jy:;.քs)֥Eu!|i+.J}VJ)xŻl6>~9_YX8Au2ͪkUgLa\KDc+щ[.лyl97gNSӼ f>p9pM,=&эˤ|~NGUd~,9[APp}$9N3`j=.;ug7MF{vw.Fkj`p׉)s!zNr9><-I3uX(h89 j} `s#*z>"?M`Rൃ38d?l9{՞Zo6N \ $?apr/?whM8YO1ۺfn.] ^tͺiA)+fHV:6x3+,1Iv+ʘJy{8}qs%[颦Q7*,;sHMЕIs(gn?ϩ(ˏTby8J(ӛ&IR-;Y<.K \yr@ +3 +rϞg8=u˴;W~/v,*dt;qؐ0!U/g ȟ?М' ]ކ_ )|~IF"I`G 2g3zݻ}h-,W|NSfNQ{"`~ hg I»j?x'v#g’4|}bީfMMǒzq Ld%j6 Kӓ9Y":qX.$wί]Η&úὑu~&{%si%%'- 1V RtkKu)J7Yl (YS)?gv@Js.|ײ(~[g<=Li}w[uw?TngS?SQBSڿ&^Y5`wL`ẇ9Aʍ_yef'eez`kbsu`_%`_M seWhϼo= $r'@cb y˽S4^ z`8!Rec=I(/8&N'eECL=#'Zw_|zίκ~֯_Ɋg'@K_yDC3y6'y=DmG;0sq_31SR3 >x xhT{>|#{5V\PȕǓC!}1H=8w.NrKvpfm@DdcX'?<dPp+0!E"Lu祔?y^$ܫi~Ns 9?,~>E;0eRWsJ5èo$~pt#yŻ*L3|o>YA\0Y% |9S ͉CNIO+_דtָzZɳE a;Wu";̹_$Z̩(!HC4Tuq"X…g!ty=Hy2Hsf3󜜐1e6ʈ+$7D"k`ޝg&9s`\o7u' l6Ӂ a,)WtI6?<gPˀ&qߙ<E >trW\M\]n|ߙ/s.vZebq\&.~uq>s gfy^^4[i1yscS}ak Ϯkx~L@g =67&pss8]1<}nƻ}ÓzZ\; ~S)5S|>g1gDp>:xEDKse?)Lx.>2L3{\=K,(]7Xf뽧3H dz !^2dxs% ,?#Pט&tNR>>8Tpg\̾f3B31$4.g||T@ӄ}>xw<1(gݸ? vy2v(91-|d&{7Z8@ċ}$6#JW>CBæ{|>_.8y!KmL^v{Ğ5ׅ24^ē;z POƢ~sJQ3p [d 9jޯ3Jvճh;WOy2F3$H 9 9ϲ {۫ y^X.#X ns{*d(~=ܛm k=Co0TyJ)蒚؁|} /2 m#C[ٕ'O׮  PN?'V0o;o3Յ(f·_s0D?:&OK0\Ny7>R ss69o>Մ3_s)'nȟ_kdd1c nZ;u^!f5L0?P`S0] =s9q<7C7xpIVͲs#5g/|</SSQ@O͞O=dTtlfg\DmUJ^a:'a;|w< fVRHf} 8A,ܯ,vd{1ցN28ɋo0( 0)[ǒɺC2|LRư;Sqnuu ^2gZ:cwљ1Y8&<kן)4s̘F us$hĎBΏI^Nfu{_gU&oT}b E ȺWmu1xA,(ޥ2B;Q;䚀PsԽT\<HX3bګuO&d3c"|66XX\qq#dijO|o7 9]'@/nb0gpi¿m7_ 5&ܶ+Q7-AMjv^;\mX42M,GFeg4RvY:2euFOv+ N2Qi'Y&0ddҸǘF Q'糷O/_BvB‚n*{3~nU&f;E'_.:N&-|Kc3v40pylM&]d* cv; h`{lAҌ ڝvc_5V5  S=m h{4_m`$;vs4#5' LCf{>;ƒWEW:&N*`E*sܷ+Ł4RnS&X(㧗 a\nwxvG=P4OxI"#Ӝ$?/[ 5Bx漿nv3[nd ,s{!9^UdC*gR0@ U42.X0W7@/g(<g X 'B &\b>bcȇ= w0w~z$T6+Z¥ !#Ț\̓Й[;d%gW5: -Y !SNOȋtp$W@5=)2tՌ55|BBIcaR<O1xNɓ&̎ 0'w4 E K&~E{iwF֪Η!3JF2GK,]5NJO@))}t7d|vPd7 M{FG'tRp wԜ1tjuF$:L `.XQMUׁ. R^)FhqyObqK-^s(R6Up i1<"p",pH{B!·O/Q AY9:|L336LD^UhбL"=86+.]edYr_ Ҙ8?(w@fQ-raoS0OV81ΈiJ<Oi}g.מSEgC:|@in&ڛNg;ߢ9udcdL%NfXB>\[ gruI(8qg(Hp_%F(@®'"HqČٴH<raG]DqIĕU_$`; Sg*U&AXS!&*?$ʓ[XdP16 uFYBX8<$4rIĀ3<t6.e#:>#W-yȒi nl9,3%D.@F6cOndɦSずr"± *!a,'#^#I(Q1owX牝Dr}VHl[IBЙd@p@Џ!&9ջ,ݙɋIUP&)L\}$y|/90`ϋgŻ"Sċ;A֦%3w—NFl"8]OC vJY0ϨͥF 1=b񐜉 ^}N[Yp)ۈѥ7VPTDib s'_bL:BW^It@h=A1 3ž`[:Ȩ[9nqpEP*v* *yV,] ܀,BRˏH잋jGΫ́u?|) P #v Yq,E,YQ7jm#AS cXX|6됍 8   #`EtuqP=^Z|ub91[^bTBQF b8hx4Wo#9,=#7A4y@Kjk3XJYVSc.uf00p{-v+L,YoCnO򱉱 kN?5< 1qdhn 1ZS~5U$Lluc;Q7v6"֨_>:x'aWT.]\Sbz(ξ,vi \px!M9LC8hm"(Y (Zu)0tū} mՀGyʱ8`J NKt :s6i㠝(S٘ #ޑ,϶3ʶQY HR?j FUV$Y r5cڬDju0'!RϑJ.iHR@sd'].z3P=$x> %JJ)Tu"ؼoCXq=!P_BNb4z@ Nkٽ1Hɴ}tDd4(W>$ `α;R EGUåp΋$Lšt=4R /p40hcU > )52icW VTL)KtCρx Ůg7.f՚6+gn3Z1\#0f 'q}#0Kڧn,ђlcXWvu>nGwoӬwEEsMjcf V'FFـ 'j^gJMK%1&}'wXܙO ^(yͪȀVKpK؍0 2;@xhIkd˂exaDQ sx8ȏUD`T~mckۉvo pe`'] Jmm ޗҳˁv28(-[g /vMHeq ^&.De[jcWWe@ֻN+23>d.ť<0D6D#dh 08_"CcQ},7><xN}&;KTK;DŽHSMHig`Ic;6 ,8_]sthIIuՅ4G4.lx\dvN łLHAe]xg"`{.SCpq6wuy[Y B`k۝ ]#X;0G IDAT0/]p(iOj ~6 i nJs>LQRODHQC o }1K5JU ҀB`W@ v;cxY&*l vu9UR5q[$4DnE` +ׯqMe{iy7mْ5li]]a&w-AWA7v W@^ *fc;*0 a6.Ģa7n */=u̅A0l 4q@X"EG+p{2,0RaCvH0׮[J+?C_/.[U*, KYHҊB"F{@ 2<&ɵ6Y!t0F0^)6l+fcDd ̛;:u 2s| cIP)Wm|p[o"+c/ # ׀~-3\Yg~,~4;{q IO퓖< i2YК-7ee7 p^xL,:n8eTyHZ2i]%w9 B]'81Xmms,)$ɵG M^L{Ul3r^Ma")\cY{ߥR!W݅<#%ZVJOX-MlƊܜMgaMcט1@BvϔQ3n.lim nk|뻔rcLefi" b̜)-QAK?vHX&|p@ſ[mx|oI`]uC,synw3PF-pq{WEؓrbU\ &,6#7{QĀg, dq]  884!bzAY2҄ I$kڥ}XO㛿.V2$tŽ&٦"=ޠ t9 @3KJ]veЉ3Bfh_%)kž9Si_7W@qJ/~H}gh(o]F\B6;(3t ^k _&zguO\āc~̊m_$)1⿯#~ng5(]g3XXWdS']YlzX=t8|85*Ƭ,JN`5\8;g?̗AK/;P3˜j<0 > 㶖X㸫A.pG hĘ|K(&`y"̃.+$I};F WwX&+FE@XX"dzH2֣a( ďE;C۷}NlV]=큡 *v5낟imEe}b%Ղ[/\y`a~ +"[.uA?2b&͌"/B9-ĹEUi3ɞ?9MM'ir -ʰN@H@yy,i̹_&FӞ)[4xIb0&`F|mY=N܁]Ql.M}$cf (Ҙ%NA6F>CN!!U@=g<]~KȋbՒx/o@\]|fBiqPph:hHpO f" '.i}7] *{-ŏ-#P:˅hbWm7@ :ؓNu ;M;]05b&:8j!w"s=ۉuOB…JJ"Ĕ@+u9Lc0جo=XJXSdvco`ݦީB3LHLTGīm&NK9 IK.3@*P,7SFf^6bDŽ*xaT[%=~9' '; ~ (uH{p܏XgB! }E^I GEf"ΩGYd!E` %KDдx?_9|ݶR^J*$3wy=d@k0掝 q˹DiҘ <7,ީcH[۷ B ttłPRCˁy:}|3;C|g:gD/2wЯr}AU2q,@y9Ҳ2dR=(AZ/XEqȎu}*qY?+8+B|J L|}_j++mJzO-JJ̹љ&u/=dONf^~q2n0A6 #@di}\-P=>Bܺ=(\mm'ڀ%rp|ɢ&ߝ)4NO~9zd(tUEIY3:1d76;8K)lqhAʎw4~F^gFAZ ,b  (XT֞ KA˺c8]k"49E v`֒[ ēLKO1`qKH,{PV*%Sn@$ڴ &Be` 4jk!rE`SV?CXGE'Lzlƌmz+ҶQRH`Z4klMFܖSj戬mN cMF~g1Pf?coE&'Kc-G&7m/(ːȃ;E; ʌLFœ,gw P>)#AK)kG5{9qXy6J%&cNDE(%[]ZL45ц %;R`qűM7v£PbEYv;O FSGs>1*? i.<{4OsS: w&p~_˟>RF{R]pǀ(;09KtvQ66LF%\TEMf9kc#/Tԉ0Xw:Xo裏Ne]i[Nm&,~")*)L*:eq'^EPc@{W*# G?0& "Zo [/xRG@=UX6FXA,)qiΙRv.Y"J9gfFrXF8^e)ŝC"`vg82>>#{w((zTJq@dQR_~ F I\ءU'%Mo1Դ9!t8ſG__<(l'MʁX6*µ($#(qnNjus>FUk+[mz{߶SnP!"&ӄ IJVw'_ſG_^.E }e=QYB\6J)U5X:Ld\?WQ 8 1$pG +}8 mi1oXZ8ZJ;aX#K&o5C@dэuKG*t n@Vso]]]MI+hCKт9KzNT5`rR:F+uTJ)9fpxmcKyu]xvВR*x'n 4#~ru>/39HlLݼ4;ux}'?Y,I>uFw2BO!XȌ(B&ɅF4!>ŀoV ZK n"=dUW3VS]U5r>G5('?8I!ak33*q$iBԝRqmr/@f_?KW,"=%Sb0Ө(fe f`JLBsҡݚVg-r߯s ՉU.Z p2ߓGҧbNzx@eD7}CrA9A :C~LۇuºV(bJȹ)5Ś1Mz iW.#[wZwxI>@tkb_tV0v# F13R2[jc>C$zq:}=AQ1q#X/Gw D2..ֹ_$,ӈ&wyEUc2ωy=sh=767 Rѡ̈́7!o~AW71Ţ" p?*#*ƅ/m\wη 0>'~yF2dqNw#7[~FgY9 s !@z.m޽a_Uu𵘻r#s6b"H(Nu,=ˡlSc&pH:><_߾ƳHkb.iJT\wig}M>R'Dc1 ,f@ٜr;:voo? ֔B/ޗ@`0)]X.8=qVZ[W#4#;T9==i]?q`G)KQ|ݥuܑ b;s@G꼄pYɌ,vXiu;`ݯ K k`˸ ^ ԃ3Z pIeui0EY.|| |YUf}\]=^}Ҡ]D_|n>Auӆ{agH`5>tqRD`E.{yVbJc(R4ƙz qoZE(pi#)zD %-/>_VU 0)1|h9hAtcԣ 4ibt7_;L h>Ca r+IE{Dc|ADreaq_Nfu@G\Ѭ U!ёR-ĉn }Az tphP4eff4^۾qlzLM2Re\YJ$`|pj9j:Өk`G`GX!Ddڑ Q%W4-*\:c M+n#X֥h *,y4Fv.Bi ];n2b( +Et;2sPA&6fA:1Zqb $.*BQ kEg4̛ǘo9XV$6ft&Q{&*KL7`?4~ ןۨb PfdF2i>[PqVDˤCcަԆPy.\)RhI#CDR=rVӃE5έ:^ > JVJZ3 O¸Ww~8A6J:dSRD12\9q nsʢqN8ވb8qZW3hnW#y )f,0΄NHc2#9/2cܗPGSӺQ ^|MqK+Ia]B>a}ˊt[ [7R7rtg_22x lNNpӡɤ4OvJA,3vm.i7nkXz]^؏MvJSnh/J&.V.Y%o/>$lh/ b&-p"rbpEuʒyDbٳ HL@vbץ(f]{SEA@J>|Zsf6p}G!\Η.E6b־bKb;?0_y+<6roAܘkAGzi}1ٟ4kwᡚuZNS+cSv䧷 %Oe̺Zg f_O[C;+m[3Ku+hcGgx[is>`8fu4$2EhgcXir,CKyh9[Md9O&!Ҡ\7X l1i4gݯ;u~Tj 39+O1 &>d;Q3\TPX*>:b\\quL"C::"&%ƍ@L{tsI2jh,'KȸiZZ&Gb`nVsGTmO3fWk̐MkB/Lu+7ApՕ(UpzU̎w̺jbt(w* h'n4"1ھg=ojw\'욘`ȃ-q٥ݹ2QO}"i[4GX;Ƭj cP¯]g/@h" EnWtN4`jDg{^x/́@X@c}A*"U1L^ f؀ 5λ7g1oA'aKi  &F'f)%P[5`eԕ3X[|Vy&@w2y,),Ζ֭mӧ#d\۞!0\){]"kr"y38%2!Heam<墺Esu}+!cGcdS˺ٚ<@r-ppgڭ*'f.SbqL)s@ |8ا J@ Ӻy1C4w†,yt3s>MާJTxs.hMern+_"mfC96#@iE878, JWw6Ώo꯷o%N\Ǩ$32?YLņn߾U- {M &{HLlb$R}G`Yt>p]u˺Dz.F5!XP3@=)g.fMaObs,*4J\8s&X-0=m/)C˛oa4RyX͒ sPT'f:v؀NGqcebR5@ 3ߡF.? !:λx^Opwb>>>ԽưC`HߧΘBFNp5rƎl֓S1˛) vy{gd:$SX %b2#S>Tx9VG9$;Mh2;z",뤪_?˻-VB ED {-:GAQ0JȲ]˓2rP7pتV`1̞vMGpث(؊=1B9VNj2/|Öf-O& "97v%>^? 顲6d 4"q<w|ϣlk`1 >E|tc3& \ [E s/wK5pޏyhW,k(~ 7^LMԸI+[EPJi1Ώ$9w6Ra_wOϡp&)gb檷ԊӬK2~ɽ$e 2(;3YK@Ryu5ںp,`EUu)iZuff Aw}~E؝]q/l^)uxXuܿzg"pzYD [ЂdH%=P^d-ks-GULOOW$X+n_CWĂqtӺ ֪v ٵf`ݯk¢Eq 6Ѕ !x7#  rp˅-h^y WŌqCگOFb84Y:űw8[K:; Y= IBd !R?F*Q=xW.&vɺ0hI! SHM>f.$z/c8?ŁԠy:̿Tw%X):Wzw$zOYI.V?Ka3,Uno- 8+[QzT d0GduS4ɠtA&]1 5{uWmt%}̱QIuU@ LϐpcbAF=4'J&m[6hnoq~q[iׅ݅d2ڙ^G |A/_!DVòAbHD:H; A2D"|_g3磱֓F5lZ;xeio8~g/[ Ns7t!8̣+=yΪg?U LlUv 9PRqdK(t[_xKUݿL!n{q ,, ;^@|xH*H}TФ:={buG58L1:C`{W`@W@:A1%  ӄuMI\Ôk>Cچ b#-c 5a/Ѩyw/Գ)znT-~faV(Oh!NӈUꒃG&fN->+u s6rSH=Ԁ !Uln 7'\?L $9#T bS/ﳃnEU͗\ATT?6[[|xS_NR,c%_ׅbB# Q1Tu]r]OXݺŝ#ƠFcg u%믿T6ruY E5 K<.ce-'e1PEy ("ZQv\lp*'(2&P.nJO;(*~Rjg~Ďa >Θu?$J|͐ >C#W_FC`9o9:goWsĿ_;u~a SP*ɺL@=q"hЋ1aW dC@&d%- #(? aߪ?5hK򘸌fM k]:3R'-A&k]돾Łg}D6ʛe|g W$EF:?b`ߋ顝ʟ[7\.eG4n7`ע5G]nr VUp=($},P̖ql %=UcϬkT@8G@ ҉|vtuDURG'\ $ ↜X%M); ͵~N;r>!]U+[$3v-DhZ*-ů!8wہ@,gN3`:Vٴ.RE "r=35auWIEE,UF:W>ڛc{Cqzb(M?sfy)Dg.` 7͎~8280R*!Fm'S>yGL;r~g/) J72&tjaoOO3mΌd0:RT^@}r" QƩp%ۋ4j͕Q,F=_?+ ˝Ѯѻ!bX\]f!g{A+3#˟ۭe~_vc0:EHxJ!vFˡp˿so'DX`ȂPr2>ͥvHxfVXAaФJ2JQk3%iK IhX^Ijp~zv-:Umfd8r^jjd ~7+e'Β}{R,:EO; b\ Lh{'xF:#/^7W`_6U(l 1 Omɱ8RDƸdE<ؖRq.鱰:O:6x8kW1$9ڔrd]~ź1˚B*Od;xݺ8n.fw. IԎ&HkpB6터obsl`Ŷ#sB,7UÎP?u\Y\?eVƖ?H@r#Հy%&|՜XNڤM}N Rmv^I&NGkr}ׅ?2Ql?B#rۊ-E :֙pRj\W  cDuˑy5ELw*BʩV7Ģw6a^#8Xqu;~Զ7Kd(g%{S|!11nHl,Տ!ef$Xg/hc1d H~gˊkͺh"gpݿ_Fdl(EkkSf}FH_X1m۩Ʌ!rI}xi-SJbޑ  WؚX-Fw*[t? ;[ 텕ӎ7_Is":gB9 ;r:!ng^Rd^{9Z#3B<#1.)[**! dtV}Pk*> <#HVȹ\օÆdzĺ&7qBxk%(s.l13 -ƾau)e9w%a&&7G p&hPwn(#~]4m7G$*kCpJӿ6Zg,Tsn=%ntU՞J{MrXפkA)jb(F (V.1h=7Yk;u~" |gc$b%w :[D\ю*_+&) d*d-[%".\NA;MǍz{T?hKf#"8DdDpjFIC:#]M3^~&C-I ŔXAOwef ~iY2,ۙTCd< F57one*W`(*q01+<.X+s `4x6iZԃDXF1Q| v<q gyMFR0}Y)B_SbLU%EqW3q.[O`58lCY, !3CBD$RBv(YJxayg}&7ހZﮉE IYRg sw*zua|dGK}5 dl'#ۮs.ea?D% $ai*}4 bX |G*`Ia)"Upæ97Y_ #:Us7:iBjSS ArS3@RM\Nceۄ89w&pir(S$?+ҶSӤiqmU3tݝ>fviݫ7idB"\w92 ߖ?'vɠĒ1N}ًFzG7H?zZFh_)Bjܐb@by`1~8ff(MUO2ŔcbiSl.[(2T(n¨haa,tzեlTkTvVw)夻91jXŃ@m1d8 Cя6 pQS K`#8ݭkhEJu޸u+0*Q{rsڥ6ǭjÍIf;wdDDj}!y5z']yKCoBrM`mM^s/'6ko9M-:t[4#M= 30̷PI3#V>є|*gڕC-C[GP q1㉹_b,s==.mst5S˺ pawx*l2cK.-u쫡Q>b]r!*D"!tE]kN/_!2hO:*:jeTH@!Puӫ@L?d)Sgd D*X2\QWZCukcˈ\ C4F㆜O}S2~^اȤփ 4#פ#F3=SQ نݘ |dV~mЩ1Dwj$P@ AT0kT3\%bxF‘]X'oIg20V/ur@nSqŢ]ȺyvkUtG` 4ek\B$8#2FSeamiCNg<賫o-|uqlNK H&H*arPV Ù҇@2D(yAװhkɚ%;RN7E;R𸱯 `yBN}&FZőZpG_@3,q/̩º~r7{2Ia[`Ft";cչr.ܤ}VH]` 2#$ `j>4h5o8K /i͂5p8*^?Ђ- 8g[Ye_Ip)?EN:w-Sb;QO,~_V$G6 Hc<)!4>Չץ.T潞kspRoT~E:kR9l୺iޟj󇗯ù:*RwAW"X$8>Omfj긽؋|CKڪFl3W4 %nT^rmdZn$/+hp\!c}gqǹ#F;XRdٳ5i_v$)ʥV&6fŏ3-|r5!g6 0I1"oYa'`y䌚)w;u~o/O~sAqtUP"wfȎ*}~=/?J|ݒfYi7&Y>^4B4L@áTGWL%P(U6G S?Fs@u]dJ1n.lŰJ=D÷(qKt3Ҿ#UuվzWӽ`v jL,L>B$lںFb۞C֞P.0 SQ~*Yٍ *i?=o&;&F'" e#LqXN*M`~*+ yVXYyȎ;m5HV4@[j }vIo\Gėf4B>A*9\A/?_?lًO +=Ƭƫ-Y*UX(ro~ eH+H…#QʈvJ3< *bk@ r9kHNH?ul3A IDAT7Ne\L5 A23d{V̖3'9'Ț * H4<b)"`d2@jT:+3AZ Tq4νdۘb dqa[Im\Xyjb>Z]?뇰OF=:zF+ڑ@ Z.]2Х7Q$%,#faIsau_E~!&:zq>"1 ~8Ki!g#.^d$t 9Da6w |mjWsà "༁c*Uk?L[N?DfnrԤLC;1Qo{*vKXP׮yc #G'k\-S&hB8+[^WTuϪxtc YdqvhѺ@ +݁_.tY DRItt֠5aOޭ+q4E2)q[٧X}>> )f8 5 AnƫcL4t?M>F1mp*PuT{%@`P09tL`]~5Ʋ&TPRc| TiTC䵛ҮrKzܨ)]Z NAhvt.Hk?Wk|E?n΃qC:ՄH 7 q?-<V2vwB+FEKnϪu%hV!7B܊ozη' QvJeUwnT䐬#$19kEq 5H!hÌ^ L_[*d2S(ldd<(7R>XcS^ufw ! , #XAEY/rb3%iQ)ɰ}21D@Ua^~?/+s'3_*ӲPVcc@5F$#`X 9sIYM1t}5mHb4$pa7f%~ߧW6汎yA)f6j@D) r#Q+^p$-)y4l~hN7{/~!VP'@nf(ltF  (KcG9&7>eG&}vT5J:?@.#wu객RoJs؅-;$pbG-T %QO*\,EC TYruȩ8@cc|[x ^~N3j]˃ 26 YIP hiy=ZՇ&k%&v-!8@ 1VHSCլl)*mwYXH-0P s]hU?ɬf3 uVv GQ[Q8@lI-`P@ m331G%Ar*W \A*wF -sbAl*EqY5FrEU$!$Ha 2 ' Jրm]~?*=x8!1n}b꺱*>GnD }F~ dNȼA&U1Q!XnI/ lN}mRZ!SVjV8bhOtR͞kT׮jtSKP{21$JTVGJ W`ݯ%'?V~-8Y*jħ{6;CsIrC\ &u6 2׃jaU  #ET8Uוn"A}V(rcv1 *PU~@r?Ya xu5~ZaC (sVB*Gb2su9*~~GTA77@'hv0R)Qƍ(Nz9;N7nrQ VΉrχ*'%Egk+R403M冷bB"dhƎj57^3b酰rrS|)N=\@}Ӆf$0}4`?c-@ @^^;B>"s}uRy;fMǭIvtkG9}af?fq1$24:!,F;{'E_нD 5c#RC\#$2td@XuWIg45#.NnTѮig XbuCݽt8?n64&@cHс*3 gp Rt&"v*.{\2e|F *fQD3 !]%)̩rBJg\XWyXu[qWi=3V܉Z8ǽh`uC׆DJ Jk)t欘۵ ,1tp#ZN44jbPVPl'܎A.\*M7hRۖv@V͸$Mㅝ];0h=MlR> 8qy LtxxN{( sHI)Oh+By_ygWWaZi2wR ,X QPO\"smv<jC筐c7._[n㍕':h# nBd(U;FJwq!mF|u퍌)G9B{ҕj׋M">!cveKxgEF-mZMz_A=_JOV~ݯ;u_E}*hiH]置ہfT'NU;_ߡ(&|QtY7Ce_1@ra \bqŊdk6;D2j2r髎B JBBE+&#󸿬>+0D uKѢrVCYl[oP{GNiGԾ?"`?+k[ޚn,`NU70ohQe ]#V^5E )XML!N濵ݰMv Z]A]weYtұ t'`K*7>(Rg;3D?¤iј"KX1sŁm/Hu}dAW8kJR9ܩΰ-{,771.EXAw*qsD⃟_:Ki X ^̳02  c1t_oW[h[X\ϊSFR<>֥#g+됫(_0Ռ\t6y0^zb~˜y\%>QGVDbǖAy.Y*4JZ]SE_TUe_!;Uee8u5VBjb9Ld`}8kI5iD㇢d[w-E%R{Q\1~s24Ef~j+%} tӅGS@vU-1L6+oqdx~)ݐ 60@Ms!Y}Hih}f8G4NtaLK ~=,̐R؀ Im6}.akK3 i`}:tH08ԭʎU5.߉[8Uђo9[E1MnUl:5Sk:oC1hY;`=˼KQjDPt2k,yQO":E7݄gwxJ\NG8ᨉ ǣ3KlE<`j1Rn}t~a *5AĨuI@]aA840c #0✮2dgh@}/#oB%CDE@D։03z%"q'B0̎)pRL/zZ$%@EL G"h73hXPFs> pj ~ ?aBVs%5F5I +oaR >Y5্VBoqd,ؔj\kvӄmnp_Y4/9_uׇ$EZO (Qb= \hz\p*MXן@*G1VpeAa aCH w쉟|_߶sݛfD,#3B:!W%VXDJr\ @nE4ˬLJoCzdG9UV+k ER#3\¾J#$#+lioϰ!ĭWL\x †H yQwI$<NinMA]wDY>unXˤfb@‚K`a&|_Jtik]ko|@ WxbeON-G8_$ѽS1A??6?6kE'7=@/T^lٻ%CgtJsеzv'Fo (:e 2>KZ ^m}B={fFVE*:Gu/ \q/xSɋxE(]Jch.R[b}ܿѶTq݀Bzt|Q7b@K/"Vy4>yTPM(^`mOt ._i1v )!PffV@3]x[G _w~뿭,,/>C ։,*=*"rydg$tlc;F,z@Ό/mv,,62'5ӈ7xSHZX)! ^0)l)0 9CMTseJ0@;Cgn#"Q*Ed=ݎ&򹼷NۋU+걎>V}錼ĸ!T*a`ʴ" i 8<fYvKfqu4ɕ+uƣ:h@֑S4~fZ$EBk H<oh lM`Ftp{'k!G vGH~3CƕLbє1#2~jCMcCjPl9S1b1 ?0acVrnm|=l(ञ3ǪWco벗LSY{,Uj:VB }P4~|~_p]4Y鮅rH1zX֦ǢGF* (x] զ %i@= ug¦7(U1Dؾ10bn( q,[KíckiLVݿЊ#xo>W,`AΞLa:el!l)-}\2C2ںZae]-_|9WcQ\4 cSEF%`IgǍiyZӮt94rgX0v G=`.,B*75@x@OCr0f^)so˟#{ЫׅUn$߃7EIJ!V y)C,9Æg9퐜^z<+LV|zڐt*R8rc10ġp(rq[!K/CP < VE#UP,3. Isx;}`͕PB%g g%byR̷+P8"3R}CqjI`aq=}cݯ搘*ԞSaVU\ǟWઍ >`;=vz@1:тZuYS⫙#:9kP"A.Dk(k3d?g4n9W: m{V[*m~hH%=#.G{,.ǑUaG 3?z¸?zr=eYxH?sSwu/9a#.t"px}N.Z䘠B֤̰dIb)ڣ{Պ(ʤEt␢yr'&'I|F X(Qr#%}LuAkb2sq9Jo?nxWNϻ.1:p:LCz.Mc85 qCΧ.RZswlkcax*h}Nh:s!hJ{`:*.L-VFʘnH0Qg Mu`ዦ\x~J38?E`Eݤd$~4538A |".)mR[9q"rQa\C&\VL1J =#F\fCq յaE1ץHuLÅPuiT΋K&O.YK/HR9sڑ*PΌLt}r(TAlUm]K2r.|̌%=NfY|;gMd[`),y}c [13ܣLz ՌI? DA4E$3J#O6~-|Zmdp=!O('qH.>ܡuS\DujZu2|̀y>夵L:ҀnNA$S ` (Qs<o~7^@=A|,)PCwwR?c}N5)Hk_t^mE_ F o"ߝ#CI]ϵ)/uj,!o+E ʍ$'mSO5Scݍ ]dpszW܃fox$}|`c#4 jBdlX+~SUEK?pqZ8s,ORkoqRFVc6 FQfYUSjYVݝO$[x.Q(Ej-ȍӫ_3rWT>yQlNL@窾n_% ,u*ϕ{:PL%(r].e99gd~Dab%^ ?D\Q*qifW!Dq2fl#$gF"+TGA8EhYJ嘔08rJjwy>:xzbդl=(QZu { $n~'ILz~YpfK%@ 8 3b+1l'GXj_RL՟6(%-0{Xgh \UgWn,/W}!()`xFŘi {8aw8+(bQbX9}ʾI;BOE.Rn4~]l+zAOAZQыB)3ҝ%8G;+͑@X|$G0riMO*s!@SDRb+/>?RE)2>&U=܊>[ph*#*G!vȾ#oSE*2xZ _qh` (>n`Q˰àblnmh iܞr\jς;TDA}T1ԺX"vd߲.F"RgluvDAw8^' P@ ؗ|̛ V P pNe0_r>R6UқPyPX!Qj<ÔJgA 0TN3@?8nSX=>Ёdm㑟l#֭bmb1?fτ$ }Z5P 'rJPP'UBz?Z[qj8@fg4Գ Gq|rݒ6:/2&b,W`ݯĢ^G9.4:f'BnxSF{ WnŹf VȽ3ġ9}Vm(!UMJrԅ^a^ll.̌m&`G#`?cNT sC>2 !fwDX!\8gd9BBB 9V.EX%)֝K|fwtQډe h+gu묤fgzo=%&$ 4r3`C!̵0"iGM )aƱugs00fk4h>^ޟǩ\ xTI{54.k,T~IEnŰ/a*KsSM:qrM`mDO?a# @39nG5QqTWfHؓԇe6&KTO%oH)A})-hre_l k6aIb,1d:BD`ф[Ms3h&pL.삕,za^ݯ;utKLYC${5,;_ٲulWtR.D]k8_~_>S?N?֞ߜqGz2V߳ % >:Cحf":L~Et ~T|=#V\2ѶejѲg@ݓ=uս:I9!zd ̽3|8=|>zxh7m}uztm} a#%5K&]9Ss1]_S@r)َPȑ lPYޤ(@i6dɬQX*)7`XGF>Gcf0N} 1T aYOݪܟ F(,Υ Aji"MjZZ \^ПSalˈ:3 !HTUm:>jL Tb71¢}d ʡbb D i(_?xlyrΦ&kRF]qE ^σsr\A8~xٓoP她Jd>7TLF+޴n+8u>~Eep$p"mq(w[-y__uPDJV lPXX,׉-hVC;롞ջ[fUl NЛ*EpΪ&&/>U:pxzP x>;Eo(ϼ<(d*)Y(Kp@Y `EC>BFWV]0qnˁ\"w"c'!p_fbzxZ)܍.^m(``>b?Y0?ZcT;)u 7A+:d ukvdڊ9n/5$I@][б ,M0"tf<ƸDEV+ʳ!Ŷ W䲷;,CV4~^ H@g Pb&Yp vDXUaHVK ,pP,R}6Bsa5 Bh@M NCDOZ2:i sb}L\[;.ȶ5hnkPAZ)f}]hLS܏c lb%ɢmqDe>ֆm8 K Z7-ƒr9ݎSkl YzGUM/փ-ZGu˺GE ._6?יг~{~ܺU;ԊI1Daag-!1bЌ9{  B:BD;!ꦡv쪺}9{/[Uq\~>2RlPgSAq\YKfUb M"VbbM␎0oHsmD,[4\eQ.bϖOpcbU&XY/`cB.FB#nd뵈%C"ޘP&/A@2!u #s,@h}BkIV͢XAxnѻgX}%u1@ A.jP`\q#ݨ=x8-NDA:OTjv,mlד$g3 6f sJyJ 4EaQ==3;FiMg1h> to!;JJ29. rEJZ0 K-Q3YEυEkl}9A x@MUEʤ 2l^ئSI);2͘d:4v+,zY=ڎRW](M9AEPIEIrW jFNvv x6o2;ƌ0%-VM}T`΂kkcqV ˔ &վDE5o ]E @59mCbW@Jv2|ʵ`&X-MXe?z5˖+`K G B &+ȍV&b[.X {au4%Ʀ.₽ b&3Đں[\Qaf%H*gb%ﺶXxрra6q3*>.ҞaSOSOʟl[/P)T7"蘇LFc.8%r Dk.Z2&i.;⽯c]Nj?1lXV ^eUyȺSd w^ q9%olb5V0MEPքRiaq"ZP֗[bHf>@BXT*;(1퓁0a`8X4{*);化W'6SB%YMMXg4`Z|nK>Ơp6֮Rm_TpegV0۪: zֳ9_F%1dI:Z;HS]8%$00P9أܡTr.I(ܸW%Cu_,&%P[켤:鸫wκlDų#֬CnbZ d2V*Rm,si1׼B陻cYFmwͬ kZ@WKKdJbKI*6  ߓg\; Hx_qJ*{g'BZaEe".'שPM h'*ۋSg յ|1&WjhC*6J ܽc_S"T19kԘVsy K&\DPp2"aA;~~|aVȓT6ɠ 4* {Z"†jiP(ك 꽾C\uR•#ݫS:]in%".A 7yZNU[J~&\REY)xяqq< YMĠcx=9{84؜ ֈ B*QbD*lf ZhC^9A *agYHz*lbe Cdو S]Ժl4Xgb#_iV.$gE]l2ge *P"DdO2դeT&v7rj2IS8 EB؀T|;iדJ2٬ Ғ`-uwf+ --Akt k013 U^$#/JqlR,8Qw#BDº _蠜RSZ[HI7 E{II|)V Dϥ &AFׁhrdUJ=)L+D7x{L-YX*. ZJāK@;%`Ig20љ_U?PN5fHh1h׽r ƈ'i6#L Ro˭͕oYX.',S&澶+Ei`?6iMZ;5֠^ *pk)ȶV@تDmU9ŰБԫ^!D;g5[4ĨP[|$bj\ }5Kqs$ΗU;w|)-F;_nϲL%XKr i9gX~{fӺ$ې` ;ak(UۢUՂPD@sGdbC=9IqMR0(a {+'JR(vj&,).Bxܿ i.Bư-q%iņ[F'h=Bc84n+J-u$]2փ Z{}1UB50@,`s[,*`4Hr?Mf[ʠ)L0 d|W5#z IDATkX}f'l8jdX⩲uL%\utee;xEHf51IV#*RE dOҠ4c2k%JIZ x0 &FTZ3uDyuرPctF3HbV5QΜI9vs n-Ϣp]*4WĈ%hXԀJd.n뒁H˥ޮ}G?#مΥNWmWsXk( ,CmTE0#*ZX;˚dkIݲQ$#n7eX{v6&\;8p dӉbX{K^C,L33..',3sfa].B5&Li>`R+ Kqkgi}mMHIzVPiK>;(tK਱@ywRV#?L@ٵI%D cB=_95Xt'ת `)VSITUAS8Q@([U0׎>αSpW?va?>cg`gz%(  5TIAbѕ޾2k{&(PM$8: Y#ZKT\\jAv/Zә\'$$@Sn%L )͸+kB{u=G? 9_-څ\W! OmӔk| ufE&X١wJ1DJǬmM+H, +w!"2WZ+"z\I6 B'MXsK逛%۝"rd@!J t @uf3%cHWAc˃N#]e@kno tR,- Ar$Դ- Odw?a]W }' 8?411 :PX8`aD\*X ,$K%v:aӚvֶj֥8Uή{u3j\,Jdֲ,oYzH4ujKu ?ڀn=QR+34b#bD8)~jJ+" XR,DM*]Xp=`@TK6)mJN˂WKa^Op9=rzro˿nw^ ?xb/X!d&J]^!m#۶ˢ쀋&"o#_(f ~ yT54SN8CR& R籞X8ֵقڎV 9~ߌo}*HƝZMJإCtHu8X ;x\wJFL+R{CV{QWNbC ^)&z6]hm9^/g\.9ȹKm9 k++Ɨxx FMsfRUUmǬu8brKTӜYWRL KHw2pr#SA4 B#0DˆЭل\U 1u)|YV0X؉>I KZI35`q-ikYfB]zìm+p]Ul(1,PVFkr`.{ `%a '$w:sJ@VCBY4Z4՚j l,Wƺu .ϯ Nu~~[|w/p|xwpH;|@J|I#MjM>"-a CMmE`$ˤY1KMǡn8ޞWym -'NOy<1q>|wpk9N?'81p8>pYzL;NZ\MjLP:l^ nS7=a_B'嘊fBf/ ˱˰]ЯrWpF)r "@mLIJ 6i:/`;Sd{eV5]7&Ya\hD~cXHߙ,cث]jYּJ[ pǻ}ǻGs@{NjǗBW/:}ގ˽{ġܟ!;1P1#*-3 (  kCYELE `V*¢, 7wq2$HWlxT!rc2L-`ov~ΏaAUCH}l;:]K)sSps'EP Wjqh@GA`IЅɺ !V"$qX֑OVluż 07"EX}ʚ9uns2Y LGdM]z- $6cv!Xc*\TIZm!v/PXRT;c! ?IP@qNuʵ3ڞN}dCla%k3"ԾQWzEK^Niߒ}⃬&Д /8RlXSڍ%eH]Ÿʊsr:r1&*O(Fj 8iRD+ۤ"JeJgkua2XIO಍VF N^.TKxr~B+z/*C+RԬm sgƝ[6Rpd,`@z?jR*(Ӆ=oB`b &/l25Jc[ZEi cn-&Ms2EæYD}\HZ)@uٛZBUHQ`؃e/ܿY{ ~|~bJ1F 6#IUl;"W#ZC"\d\#R/jEQ.2_WPi7Nu3NXt-i>`9L51-ZjkƱHixWCe-Jxi>S+J ռEӵk VkD +y餃~ G'؄BM_G: B48ҶXC0 ֶN00,1XP2/XSo$$m"jc-D3hXU[yZE&cv$^!"Ytn׻-B}IcHbڶD # eF\8Ȃ M,+R,ݡjǰ j6q"l(cg̫ܽY8,sZ 4IEt6 ?[]KT4$7wPlOIbi _`|X;1c-Lf.]ue4[IU>iAi)T:NNcDԼ#:5L ; UR#ϛSlA^c .iF0]f,ӴkR&N go܀j.6zŎt۶(VUЃ-y|R[O9Uidk J@`w,M˱~Ȣ0Enي-A-cp }V ֬Y!gWEВnQ`;RL! -U;HHP >Eռ 8зftDj6Iv%!B\0[u5{Q9޾Sb Xm%橮IJtv.w&OK0xD`zVL2|aKLkYdZI躰"j<33m3̀sI5'aHi--z]"nSm0ԯ$ ͅ1jk]38ְ˹/g, bύu$XW\2#+% YV,n4 2cp +kQE*Cu Zv`$)>Ib|rDYz%Ţ@e{s'aPa7F; Ǘo>.Ż_>|޲X@+*i'ю+ډEBwue8vh =V+׶J {7vgj MKXƦF=&no5)Ї;x3~ѷVv*B()vU+mi'Ζ؊U 0^է9C:%|OrPWLSp4v:p^.9Z禧. 733^AY2j.A|ѺfLcѽʢU t(AT$*hAAXXp $RBZDZVK+eb\/t1)-FUm4npBY W7 z7Vɯ:Z/L3aKB~ZPoL5P$*$e-Ԧ肱d!+//h;XsHU񡴤}&ֹUVa diEޖ섔oO z5Fk̰+ b[»1)G׫FmErB@gPSw${ KF7$"Ams$'BnJSֺKw gn۲yC)d2h5^Rfaxe(2#=V:=aEQ91Zl\X&D "յxm& ǥHdV_2VϨV,Bd,\0q[Io:kXQT/{[L@@eJmj70JV0$[\ l7duO lغj_nM4GA/ (6P,E˜T2sSvٴ,eR}cKߣ( A$SRBfEHTCdy0 H86gK:f ]delT@N>:3aI+@^3Xg|ƴ\YؽVuD7r?6Ǘ]x|PY ϹuWgtUHh15Umb[}@idH;UvU 1ؔ]^Ќ//:)-4)h%\z&ɴBֆ =7; nqoLȯLG^]@d#v:Sw`t EODZAtbd"Z+{i` LAP~SfKjɃl\{"EEeHI}ZF]vzVdVΡi ]]HYMgUt" l Ls\Lh}}oBF6d@R|۵9EVPme 7@uHp4G^Ӏ'u++nF=R=yY(ĺ\^NX82X4ZC.:*(izNRKtamFb*"qEz,щQυ,6igS!?oVwKYQP֬C^nڲdʹu:nOP5XyŴXj[j %(š%EڴkDmǮG Qe6""9.l,r܁K_mj!+-OUx1i#rΆiT&}>1plw܏ڏ_ bj-вMil"@vի&K@>*z%pئqP-wD)kkSRixL%^gLݐְ^.Xu`YϭLw?KE66>~`˦4!͇`kLWWoUZ,(e; [u& 3r!d ]n8j'1UYUER2pwġ~AxC;P/eň M4IضB0`J(06U5I2k"60%E <2%g)? v ژ =SvJl0" Âl(aP}=giPմ HqgD9W-"9!NJڦ4RTHid :)S , 2-F5k3uj|Z>󏸃+r.e=uUqzzRۦiUJ3%@H& (%f |ht P zs"(RH^%گ ]n#b]DjMz{S=ZX:_Ա/x+P>*x$' ])]#},Vq9;K3]eD'3HMG!z/{J3of?S&\,, jC(ĮK=pb+*^`/*b2f($q2*E vy ,AT {L*vDm!r!J͟@T)D@K%.tr`\f Z*4*G_.Ujor| JeinUOj fДM ,؝Zz. U$Qfw |%䘒n-GduQ5e%eɊ2D["m~G 4b Z@AYf=2b` |0hc8MF6TYjjrwcQ= 6 #|+ubOnzeRqdZX7+h%` KoIޢ"}:eI"mSo IDAT' 21ȴݓI`9JO3YjDZ^&8&uPb۴oklXJ ^sbAuc`]X:X3xuA.[Wq{0U +b>(&倦`w@ᨥePnkBf2]ZivCs[A9Lbcu_ 0LbaXl7`KW.\] (i؋:XrH YFNPnm8HVL& 5.#x5M~bgi%TX`JOBJfNrpcA%X2$.J9h1 MU_ &Cp!Q8ö F_ İ~t*-8U:!8W]Wτ'`]s[`gL˂u^낥Ya?7:(Rhlr1HJ" E'4e0j*l)տŁ$Ļ`*+#DF:Xc,3 aWXrqCݶBҎ07l3}5ߺs @_P6envMy#/@PG sɍ3:$ց>)dV"󹣜ˁGc"`9މ]yRbF̶-XnW6H"  ӮuRN@~]({Z+j7o-Wy”Xqim}u)չW}i˭hSW\\w  k$٨T7DYWXܵcs":"5{M ;l;=nنVݟ.(7#n bɍ-&DJmlA rId `KxW=2[&SiiŴ&p@ N+&^, ҜueW XD2APSWYA*Nӌi*n$X4@ fI(DSJqȒ0 ܘl'խx,lcSpFh*.ı؏FƃD j!t 5$baBfqoQ୦mqf؁<ٴD}k&h%.5(LY`z!\k 5SH91[5}!@$%H"`h}'ZT\`,c V?/JAMd`+΁c DZp>6sou9V ^q4&wvq2D׺KѓsCc`Q.J' 5U.`0A?c[S-Rlg_4AI ۛ)h᾽ DXTQںK\eO_?XYOu9`ϥ̶aZ,xD!@"PHRwҬ'ͭCxrgⱴw*0QVoA|eLhe(q9v~~X?ȭl6-XfSEPhEuB%[3LӠ2]7Xрue ڴ0ȴٝJkv#@VZx&5!QwLJSiXTA0*tkB7g +$ hYX``)UJi.며R>7^h$tX&P#F GLR Tc#z腛e(!T݀Z\Gup]#1w8< I*4 \FӲ}:Z{%#)悵A•Rz7Y'!*[uqߝ]J8KTdB#?&V\ϟX&`ʩ=  n aKV [@H< ,p"h׫kǮO<ߵX08\l8Oc `-kvl۞E ^q0^ +; SK/. ʺSaw7A;rJQ6:뵫T&jA=DKۍXQS6P,KbӀ4* (b,R:\h-E:ZT*5~ӏ~N"^g7Gm'5y DʘHݫ>1]\CaֿL+gd5HYղbZXd(^1)آ K:w! ^WX~H3cQ?o^6WKlI|0d҅]"$eX/CNR8Sv9'qjN 4ĵE"Zu*V|@D؂S[ת;( T(؃4U-n%^A?UOE) i gSY[\,MOb>k=BR6*x |YZ]u 2y|g:\T^l$+*Ua3>駎|41w*.T;HEb;_bd2inlxb3 4/+Fe 5':#-L-<ն.xZzV\帥xO5^&P+:&& ψIVAe fi^YѺՀƣ.rj5 i3-i1d[kִȩp&IDJMy joX"G-WXba+cc_m9]/H-`V >%2Tΐɝ6m_:-Nk(3Silc X512T~V  |I=# 9 x{eh*e3#g}2H}bH@C*Btrw b>WuIdkk9e଑ Q\r#hunSd2] J{}jܶOtw] 5ق*O`J#DrZ ,վ`"nhkҨO`$(2rXOY gĬNLR-ZzJ2uezg~Xɤv YZ<]HVܝvr"~`үM$-ǦQ]+˞{LfU1ǼŀYu˲4U/ϵ0W3_~py>b:a>!VŁH*" Q' 6=5]Ojj7bO[+K X 0I1v¤W>d}`3]S;ŠDU*HN?}<w_};>?8=й 9bgy_}T°9ػllӠcrIwkHr'xU2X>럂 \YKY~jQXhP&hGuu$e `bqPX=vmKfC%'R-8; R$N+SņВ:E0FIV\VSR`T!R+]h¶īg2XQx -6Ӡ Z1@ ,Q-*Ysi! Vm&[" J Ib{nI 1- Nഄىj6m6A$LRM3BI)!nPLv7,0)6  'lA l .JczU?\PցګA>;q`Hɹ(W3҉f^a@K{ˎl zX9^cV<Dz,vso54LXNs;NP( g ٸz+zoj~k,{#{#;TcQP[ʹnDR Y`S5@50X]K c)/g\*u@ֺ;`vbtR\{g/s|t8v i *^Y*"d` ,7 [g#KGguȁ ++>7b+(Y"KH,bۤ\i9b\8Fz|F_ / ߤF}lO#6( \Z;'U (#9> eFNW}7Eȗ@}w!V^{--B8$N[-r$0 YosX ~}L,]ݡ 5%PǍ"I73'6ViD-M5Kmڪ3;Zy%XE@{P+S%alb^zeMyM=Z%`˅0ұE19É;~X°)H6eX8iK{@QGόyxAc;68ШsXpn;5ªSuk:Z8_l8HƸc(hОj&%8UucҠHWIn#$P2=?c(g'7L}kE ]/Jb9pMb;[:b .sy+y{7En?`]NZ|YVkwmRDKaanz1q8>p! OSv!$)F4& Unَ/'1.-sП7pW,NIb:ֱ z1Z⾬fu)3Χg?Nϟ+_[Mce??|x8=b{iC:¦,>ؒGmb 0 0Y-7 <8X*U=z1;-ӴR˵O 5Q'$:uπmtT3wÐZCyLaPH7~~l(C+Ǩ>ߖDd$#PӡOÈRP)LpANL88pۂl/Qb=423SI{ +z.-tkQ Ďc@QR@&08@S٠TwP0Uc:Va0]\ɺ}+t$d2}UFx*c𒅾4pIjr ,`]lgvܻ; d4&֦ERi«Z ds2-Abԯ~pfdA# O3媠f(8 Q=y!2H$Jz@lmI6`Ψ.{%Uו縬Ƹp>$[z)΃Kߗe~ЋwWw83q{=X'XN1hԀ Vn&u6U$EJE+2cuGn<mypI@k̵խ\{33Χ8?U^r~^w_+?}ċ{p{>3!VC^s>kBόUnpcODEv Zb,ov.2cP&%Ds˘1 [!ާ?~~kh@*:$WRk͌`on+rͭk q40dR5Al@i'bڤ. ~vW~D@Gˍ̶$Z*]5- AQAzLapא,]|F ZvD#IKj#K "FiLA,6jRB[Y&EυdXmDh <*UaQ#~ K@aA3ķɎ`5l&7cֈxZ.ժ}fĖ=f) KL̞YXFɀ9r~ WbU%x_5z| ^q<>`C0cn 4QctP8gqA@lxK:p7|<)5.pemb fX5^2rz5.y<^Or_ï8|_O{x=>tcp񾌕 f͇;L];)91xij<-֧wa H=UǜxCB]3ir?偸iHdu60_ksog7xcw܏/̱k`Z_/72r9B ~0;[`et E~<dJ&]Un5T*uCJl.@DQw4IlꩁWM @L(Srn`ch[YrapnA8s ohqeqZÍ,CUP46 u6k0$Zvc2ZU><WkeH]31u8A_T|Ij-c"ĆFC2}^ԮiX|4 i.~Mw,XsIKԴ `y%Z΅[g` =A9,Wώ<`όR\/H8?r~O?D=M]fwfLEӨ2ۓ(Z{:G_JPa=UR[ATwTjʋh|qJ Z]軑%G;~*Ͼf$тRBl';>?(.Ŵ: 1Ṁ,}JXE.j"FΟ~F7D$ADlV,8c`f6FA9zA-p`hRh|X3ҴjU,grYcc?n<hAL{lDN&JxlF:": Mҥ)Hc`&a|ڻh>ȍ#tH0,l3$i#6hCz6Vg6n'חci rHOo'+iձl~:d HN (վkALV8h9d-^oCoc{QK]9y~ŗkr4hmq[l, .P)#+xar9a9= >c^+?Wx_2x||0 2<ʣ:S/Ԅ5󞆅_y"\Q**JiҵDv!*^wG"E\)aPS7jE8014{xWk^`~! ṳ-G):*; |ph5qf&m}8+ 0V=?3i#ƐrEMiӂ PvMY~>2 6EI/B@j %?bMggڐ]RD$WScʖNHtp.8iC-fE@pk6aX|ؾK*:z'аy+ vko92\ⷵ߆O #)kFY-+yxd^+SӾ:O?c>O?ss^žx= `A f%$B0Ll'rR+S•b{!KcL_ V[^rIT{m5":|6N13XO8e|siy47̾͢o-i>dVMJ`3n@Њ `#yA̴ .56S.`5E:9F:hz)ΗM2*MP_^-hڒuM}8s xy\B @+4ZA.C{7bх1[2zQ_μڏڏ@,3B*66 t'YZ{)f=rs)3:C!e Вăy[M~, z \ Q]i_3d$qd@伎O96[¶MtZ(;W22MMt/[FcJ׷;,Qh$+6m5ydOݢ>b٣vmhxr- D7v ɅborR(kXD)m1vV87F\ۜز `pV!;r,\^4>oUu(큙}5WN)>/5D`5gA22r9`[ho(uF՞+,9^-'d6>`9 Pjml0*SXWԘ d׶V[;,J;Q&b : ĘPkwG+\q)Ԙce\F/jn-`̆s?y;-fU}8|lcw0p4EWD}]-1[?\oFPC{q|2_3M<[&\]KcsskJ cmšky}},D*V,xVjm5,3_ ?Za>*aaHdHyo(d!źMу7Qߟmp?,Go~|YwJn~BdFƒoHVlZӦㄮL=`(d>Vdk:ydqDZ%ݐZp@<.}ӱ" k:@ܾ'pRoqVak'<\%&Ly͝O&u5ˆx#+KJ m2@;L(9Hĉ }3e<1Wxk`?gbM=O~c?bU#]]mT(# I+v\co#bf{9q+ vj?vk?s:z_6y$B.!PL/$$ m&kȞƛ^.&ti @AӐ.E= ttk)rb1^3 Hq蹋13MM-u(x eW {(#ar(!j@ ؍mJꞳbPZJKUV=V7p1NzC<+b#QN"]2l;$ĺ g;X%kǃ[g$}|&i$)OF0{PF"]+GS8~U  2QX9e 2ᵠEөYq.d@:@遫_Fֵ:>*W8g4&\iΖ?ǘ8$6u7{3{ֵm욮eqnO,l|ksZhsQEzZf|*q]_ػUֿʿGJ݂u>'2k-!iP ^f=K/mG[<TLL+( 017 U7.z4ħ`MfͨX-?e:vu?Ƿ]V"(NNXP8$kЭ)4i` 9߰ %^_m'Xc+ +ѵ Zo;ƖI"QKhݢ9&mߟ-QV$ڌl9Y2Nl~jȗn1u_Ǝi=7yWmF>71:|6XoY8 աܬ8{]i5Zc=Z/h,f,kȼ#fFcVAv\B qd;h6W]\ y={-Xz6V0a'I6\{ջ mNXPGFcߑ&@}6pvsx pi=*m%ג@I(p6po%ap`8 ׃[Ӯכu!ct ^,E9>~"/?(\)0MSfQMsӼcv}Zul@E`ްνiWgA~}2?$튁M-~vrx|#r5T^/^{Ni|qZ¸7oZyRjt[w|ڏ/1`?k9 ["Om3tZ@7`s BFw&Ɏ=hoJޛO|DAj|,LE AoNUa24J$,c0zS}"'+ﴣF`vg Tl{a5ۯ(`xݛv@ud% 4 aedn-/! µRLC )>0nM=b+8QWl"m1:M!õ}FZ,ۄPn9_~5v9 *XEVSaZ&u*p5"1ny@,ؽg=d={~sEֵ% y? zpm-wۋ+6^K4U&|~8an۾e?aM%Qw\9#_CEt?7[AY-FҕNhD7M* ֪p*Ʈl[_[*zn9v$_I%-FF:B ג9Xsk-ەo}QQwH訍 ơ19%m|p<yHt?8IQ>~+[4iKnGyƪЈo^LkGxV^r,k_ ׸^r~Ʋ.Kf .*&T930V@,=MH4.C2}M}\3Ww6m„7 dd&+{chˬc kk1ޕst$yWνkca"i[{ `-&z=^׶33,SNO+&!,,u>c9?rzrƺ2.U4Y5oS4Ыa]իK4gm~7+L h{}׭my3n fhzx,aL@=!V'I6,"pF,7*2v1R/r+T:"ވ-`Qk^콛tas >70QNDw{cc?P 6wQ+2 SM>b,N>cK9Dc=w@&b̓Bζ"\:EN)};'Y618F2ڏڏX]@Ϙ0mqU 2 :ҟAJ^78F xpe `WQ '" bJL)dȵa$k>#L//[| -x$. $a:\BkūGUFm8v5TYrdN &ng6L9c R1 -"3z E\Y?kόZnR-!1 *^g#(oKG Fkψ)/ #2}C'fkL +ϐk!++e.%WRt @JH@fP(MH400{aL|$C ǭy Dvy&kaLy#䨅jOMaQp7u[@A2F̈4 DzɌ֬HD;q+%[GL ,x\Y}Y `Q +z؏/2U Äm%lyg[oEaE:0qr&@dҨEsʺV4"ك1w(F{JRLn킹QڮCव  (H(U,a+0|D)g'kפ<_671U38|wMeĀpX.hН IDAT{;E0o*L $v$񀥅7unC19.=+Wl<6L י\_gBi кb-zXe]^+fUh_) $! D ۊRc8GI<Nhccc? ebA8* 4!l->I*r ~h8&"DH ꚒZDi~ewLr53D5H$%r!hX}"PѴx=7T7ߦRA 2d\I)mƘ$@JeU-JQBuTHU-R(6 JFAm IHֹ$&J`6q{9{c~Z܋}m'}k>侰<6,F0aVsޣb:,tuAWoHbOק 2MAKI;:PtUZ$ވuƜ-:S T6gZ$=UCb-]5حWCʢ;},?۽_߱-|ut-EjҧPo66k\1J-{( &ߋl#I b3'w J S0JYJ d}خOc ha6XP$?:1Y<' D#0?܀X~092R[(5Q[G;A4#ٯ<%l-ì|@.⚈4MApC@GbZZlnן*p'A\tQL hC QCe=wC ND~!cd,ub5 5B a}=s(Tp`ߊsʘɰ$X/jfT-QhtTGo2e9G49I ImXz3CǮ,uRmm~UY|-0)Q$VB9E?*j7QoJӋ*fIf8#дE%}; 'U?Mn#tb$rAeJBfKֺ{ⶥid~*d a3 fqWc3#p(kdi.K R8*x$ⷸCCx S)EۈXӡ+6`A%%OV+M)e`>gX'3'%RN( "dOJ|+CmO򘏼,(Z@#J $TMP- $)^;lӱe"qrU؟ \wa@žS"4 :/HvZ }K睒t? оqJj'B;b /@O930f*ϼM f̙BԪ3C<zJW@+JUL" X̳ʦgzP0oWdde%%#Xٓ跰Hc".8o3 vg9Twg[\^"3FHb&,>؞cS7 Ш=tjD"u4{m0ϔXpdc]0Tol8X Pcx`v;BO74 @O֜gUH^ao3(k_SO LE 3#\LpC=jXJSP`Sq,{,ю*( +07+`^| 3 2yo;n*A+ e3츎!xY-?"$N@0_[R2z pÌmݰT払yȱ: KRu4MвNwCwi߲t,@ 2k%g%{=c3#TXҔThKlGPɔm/1bb͐ $<nǷ`0aǿ8w,̦n\" UR֢|ʣ?WmlSNUS2'&Y oBlI68 ܠZ{@. `!P.E% HS:U>Woꙭ&Qbj&ۑp:ΩvU&[yGUs@@`硥s҃թY}vХaC8єycX鰷!PbZD&IKX/^N ^XyZIh܁"a1ϥz=_:n,>]묎"&,ksWLy3Oy*(}=½~M{qT(::61(0G c^:qy t *Xua )MXƧxݛ#n% E.e^ԅ:d |J5I)NGƲ6'1ݾV6 X LN1wQ/[:; 0ӈ,c$C` /G `qq%CM>@JpаC1BKB[d>FGa+4E:ϙ9d">`eΑ7陣A6HUtM/d+U_:()\, { #? S,Vvg'3C5(2A0cy:bg!{<k:fYU-G?rBHYUa@J#0f0KD [ky s`ML^*(ŇL)5YHSŘ"첄 xU|ˀV]'Jbё&pOEx.O5rs%gF&V=IIl'Kg{ " wue]e gWہx!,L \Y<)~ZĶq[YŠ߱ocO7=}vCMQ9 .[!27v ԽVA7)n8"X'14Rgz bo #XGC& PPpϑ,aR[V=(s뽣n{`raٟKkkT.6@)VtxU/ Kv%#;g.r J1H|ʗ o® OXLłM9Y6HiҀ44aDw퐆4 E)E8qn077 '̅=&4HP$%^SL& MFeyCQoȟIB)N`w|aɯjElG+Ez=6#?^ۊy0KxBFןkޞ XY٨( a;,2KP<:a0:c:^W@Ax 6~Xa;Ĺ dEIul͘!vFܷlԩMCo~M~@"ſWoSt{S,0UʆւY v`(d ,"p2eabPy-9~AGLϞ餁Ok8:^:@@60lPsqANi!\ρsd;6P?w<[fʞW:j>^0 pU~2(AT[d`U*e`c_ wHø[8" 3+(gx5ӴܗD?S.V*Aʀ"l3*(34EHhfj>YS!⎞{bZLq y{6+!Ǡ3:pʼn/8 {}r&i ưkN4i13,f[Wcpk^mc V/y_֞<,^%J8paQ-x8ɍ=QRN~ JPU؝w]R T"IQ7X|IhyڇU\%8ͷW#)gB5D=؀_CnVNk׀%߾:QbaUMw̌ ҍϣ@Ҝ#pfAkEdb)NY8W3c{^g9X<З,Soe=@*@|4͊i5ok̇LbMYV埉ӿK_%@K %7Wka1}8>[q@ĂTJnaa{ GڵCfde0y^pǛ{8\-7 XWd\ڦ^xEWX$|߯jVU")ø0ҰuB>Y\t%,j/ѭ }wl c;(%Qb)prȼ uF&[7*T^.{0#q^7ˎhόL{mLeŮ60Q3ؘWmlwxݛ~10b&a ><=t2}r^R A:yUlL@ZaEԱ$ &B18hx,&05sbO^n Xa/sY,vYW$L~N@uyy,~?I^|w`@B e ͭ6ߘ0@|rd٦K" =sq M߲mg0e.ՠ}Mx̤TV*ոxWaZ  g|sWGz? ЯW)aJv{ ~r^9\pǛ`CuD5c5aeUXX+հC2,XsIR +M.[$[{~?`ƭ8lΉ(')b˨@!3Cqo?zrJuFD!}gwjŴk۾ɫ`fؾ 6䄴% jΨDH/Nѭ;ݬ; |/V>Ƅ{th3Gt`LL!R؃pV2ܢF%V;xLWf&eõ%qLjX@cFgx`Ȯ2r y̺ot?tzy`xToMsF'q!xcMLzH>0]m4ӭW@Sw"D`LoCJ i::\x |A7/z_˹zO~ta$egekiX 3+{nqps}x/<77 p<`陧0?gӘ>~5LO4t2U Hjha40˿/ 0F$e~﹤AHN+.Ҍ:S먞Ɖ҆jՂ oTL^{E?jWEOETףLqt\e^ozfa-5?u$.0>ۘW`mcN?0‰dQb,L@ej HJt16)Y%Ih7orkZBg$Nvs4܄H  isj@_~((uV]_17aGQPvI:sp*QAVDfu6i~ǂAi+:]}GwI[#~N/cw= = r(sӬ88coOo- 8e"Ju欉x_,6]𻚋y62?qpjxX||ÿ⍠r LH IDATt'q? {xqq.,laJª&W8\ճ8\=]{~"iU`tETa),\C/!:"!Pjmlx}1맗D*I`D7#) %/::#['A|~00S VYUց20ztxЬ޻$*k&@@7Mp];0`<KLN r&ǞF>sHP1 VR/R$w:g$Z[B.>vj1\+x̞ՠ *=(互'h 3}1xC62?}{]:0k#+X)!*XZ, ^Q+ +,32{dbVę! W_ah.>:/:aT3Xۃߋ݀>JΞ7;QVp{ݺ ncz #6wWgp"%IQT@%j*< d|Ll&d`))-;^4Ӥ&5{<{U J@#̳Y$sՉ=n0=?~_!yf s5wi٠9 ;=aZ s굗L/&ߟ[kևD k:w5ɑ$ߓ}?$ӮLj /L JoYf\3 К1c'#q1kẀW7 ?=.>w~=n~W޿"K99wZ̞^E>w_1 #xQ2xb32y6'lI R'EVH*z:RɃ2]hDz !fpe=7XQUL]%;qu2;'(Vpj>KI<>ջ`c#ƇL~%}VDaro̫mlÏ=ml# y,F=X>' Ia]0&Y)@€ ',Fז\(UX|E)aqar>'E'LwDTV}޾*wdA#J=Nyr['֬ eڰZ;w S+!L-bj_zYuפ#0%|be+Ļ#Y -H%b!XAOT%p#5XЈl2 @P}m^0bSy1{( 3$h,l[' Jwfē;ERw(p|Ü}fY68eV:J*ї7 &= [KL<-RI9w&Wq/Ǿ/n.wqns:\c:,dy3⹴s&>6Z c"ZacOC}x$ 5 H<pޛ5LeseY5sPK 0 i 3X$}e3ƩU62Sb.yD4`S{eؘQ˲R=+dmtjx#6A׽ &%0mɜ=E@MOD 7/^ "h؏m8'|Qf=(- laPe~5:txfAOJjY-t\PdWFy=sTd=lʉ:C'd}u<`䏀2X&~YubAZs^jP7vJ2 /yN&@-dE0*>Z]~7u{ bAjfϼ]OږS*Ʈ.Y d>QJ%+-OƆ%>bY- C¼I 6?= !Yd#O'FsI kIs5Se^&lDBP\0J ՎY(mV%d\;Ց:SeX=D*ԂPЊZ5+[|%m Y#lb'%@"HFYk Dl-L)@ s$qTyI*,Ag{ 9ώ `` 0-MWp3FWtE nYylkr+תKl9A\ib:X* ;{Kf6+PF̜F XyXk^2D~X STyλ̕t_&xhA|oo1>ȭG?wp&ϐŃ ˥n5ُ qo0 p_cO;mq"z^h?iJ | OwSj2=%%DD0`&BkiZ!X 8 y)cZ0`2 !qd{Y0Z w3O%K՞O\fjPeY)U#' T*DsHub,Y gb`l 9Kf6& leRU@SH| Gd &Y> 6NU#6C!>;VޕU0D@GƵR'P>ZWL8FW,M7ו9m|Y&#+5c'd?$Ouw[ Ի>{VdA(T(n%2K SfHFE ;HHW2oA^ q\fw`&QcIl`햅B5@Hʟ_ PwJK0tTk@{k Ut ٵI"icL*)5 9]e_n/ׄ4!,+F$lML12{53]*(E"RE2ҎqeQcCH0K>?cg0/W5+py7WErX7xVgo3԰tK d el0 ssk<u_>C_>Ńv{$Jyp]\+&Sgx?-q)%R󙒌a0Ѓ~ #c|gcUGws1<# ~?0^`wq'wd| ܕ1w(326ШE,6Eqհ7`FyefkVzaO$ӭ}`H뀠+w\'sЬ%N:;׍SdAT&.)MWQ}BWiaqoAэXHyϱxZ,dօrCI&m{ ʀLe\h3+:>2 DΘ))W8\/H7טטwxٷ[Wӽg\"1-ҰÐޥ4fk@,v SE#_E|~7>}+}jucN?i̹tp?o8*qL/,_{p|AGo`z?mQ-`ۜ%L5n魀4@X 4g7W <׬&k6o՘C, !aE"V{fxs+p]Ƒ 5Z^eTfʒw # RLٟ$sg*abj} ū]*AxZHξ@hd(:&UWƭƶX[׽ nUIRNւ^ $}꣥%J2FfEG#6{5tܪ]`@җFKh -2(ӲN Sk,\%a4TILfEd竊oؖU)c/ - Yp,~n4&!5߀lD",iU& ,p`LN,ȧ;Y5i קi%8Pɕ_Uox}r^߁a']#cv$ d/g&/eMYsbnkz.)\a39BQ@%RfYIyL‚a꜒#%΢!7Z Պ>W%2⁴@ pu<,b,Wwqs\:xǾg_sˀ)zP5+K A%GxoՄi1O|ț!p˿B<.>ܵ}~=fփ]h؉==)3LHi@F xawqw4{̾_og ʦg4a 4?o~ßvx~/>}ӳ]WÀt( qf19ؿ%IGj$*K2o"Ad ZSe S^܎{`diֳ@@r'ib},Yw}wLi(}ļCEOVH٤b"6ື7&ˮȕy-ϟX|P7~^m DLDT?N5+ɷm6Xa<, I 媒(#U)kټv3dze &Ui:͞RekFd?,@IĴ.EJUS-LC:Gꨣ1J|& m5Pogs" \46"rTف mT$'37Si6QM@pfdEEuo'TA[KFḤb]mUe`nHZj T'Gu|΍1WRM>Ḧ3霩u.U' QKDHx֨O2HmxE{"JB&gQbU,iK_ TcpgX~dQX_<&M2 %K2~RCJ^M1hܝ^c%%-{0 Y8'BSaop31LGLqCiXXYO'x^S6YwɘORڗ IDATg /joW iy5MLp|1op*~xOk?'poO sWa<a$- (MɳہAe ZơaRL,H) ^i=4]Wc01IcMSڳkF7Kv`$eOx{ ws>yZPΓI{d"_w'*'|aٍ @MؘW`mc}?XBJ'!'uj}'9\ҙnJ f8`*Vb53x2I`eLL$`(5,-wU Xָނ1ַkl H'bmnBZMd <@`g"ORk.I^CbrβZpG3.b}GJdTu iJP!*"e P,)%.Z]sfQQ9HH j_ɵKuC`B/7o@w@c o / i'b]d\H(e"GJkBv¤d2qmn@rݲN8U3r-̿I<31t-xꚦ5jK4/"Û_{<i2hxqXEZ4v=ˆ^:4bm8ΦMDV5iVX I*9?H0Z{69*;4Z]VŞ Bݴke4T};&1A)we] I)ĉk^0ao]YbQaO'mBqnxml6 Of V؆0dLHD^EJ̐IE5E*a~.NTZ{H`C&pճ=Y&P'I7O%?>!IHd;xY)%ACCF][ZDCDm#CQg)CFG'A9>EdE҄J &}!gZjisTuaFzBG\ö$!H4m4ywEf߀meڎm{!5pFgRdJnT6WcLva({rLR%Tt$jSECfDa32$\ncD]CĖ 6.d&M(|Ě/o?<>kCZvK&v xU@2+I(!D5Nb"Kx1 P; i1q1O|7/Րr' yf1`n~bʆEJVItPX}0Mpq\Xfa,R?az)| /?c8}È؏Y^`˜wyid8KǜrR :Ot8徣;顥ޒތ!-6\ f_V],'kdžH41C:ɵf&|`;-QixͯV5dJ 5}ٺ nclc/E%4%)ayڄ>PPƮE'Z-YqkA^*O#HJt7o¥2-脉dǽTԠ$ͣ]eݨJ@CMu%(&&X|;)6{ %QMI|4g"?E-v&n\J k "wXު"`|VgP"cVWm) >yjo"I&RIb0ݲz:뫮@n`|RD~%47ukbSQD!^e %ֺ]BJ.+NbE~cI!Ґ]}윢\qD0o]*-߻/Y<tq]/1`b"/0 3ߘMQxaesJ@@CZ[4,pʟyt_<]2xq ww6.&VZc Fk~z 4 U.IÐA}z˽1; c 1w.y EH>>ܜua/^1υgp(Xu}5 a_`]3I?3YƓ;[$l(]X6H!Q*۞؈j4UlU٢ҏA4iltwL@fGogOa$=V$2ʾ1h[݋,=_KR̙yml6B* pFlDWfo*e|MxHUG8Nk9A8*ǚiL$'rfxHHH+Y!{iRf2*ʂjdLdm3SUf9oZgEĦ+ؤߥTP&.bJ򫹱N_4t]{dץ;]V,@gXy_+)Fdcɦ@c[k>{nTPHa<ɦ' )& VUH5Eʴt#+x/we(81$<+ɢhi*ٍHPJU 3IknzgN\㿳0442baDʀ!hR ]1s4 ePZDkaBRΆnY_Ⱥ|ˇ|`"XKrgĔaHZhut(RCNf.-ҹ c+ZiH zo^JgV0~k TW-m[#AF.\"V 4 35]d^?]&iNdXr,Z #6)q]*GSm(hc1 #䵰d {ۓL(3-H!XnN{c% d-Y Ld(.()kEy7 *׵ *>?tw c(v,[sManVךu' !- r-OZTw/.lzZXKÐo)sΆƊub9@w(GfeV,1As?"âr+̑5L,[%LHJ'G2F~9&4+1S ._Emf6IUs&E#mP󂍟 @ LIw)W )A2 ua;>I\E$ M\U%j##EPL;!ݠ?&.,"lIj 4MPeN^J{o7\W$b$ּyW5Ƥ:Y-[B˄4͕yA $&L մ`=! |„쓎g ł,dF RXW`mcd [Bߵ i В.$NxA1z5嫣T>LFi*I?$!q-$s)jO$dJJQ wy 7R@3oL)B `3304MW)Gs߶f pb- j]':i`/^ЫX"o :/IO|cP)7~L h^`١ARG*aCcf(a;8و%9p% Bh_`24,?'D% 1)4ik:ybH#Ҹ0 Jq*V Щ$1c0²xa_XJu7`یf~C ^%كB2+ka! 6 ;Op]?{Uү]*\͙|Ybׇibc,ɻaKW1Dgɢ uG+=TۑUG>vBGiAEhU @Je3LZvKe~6lA?@:^=$u_%U4̛lcml2YFN$;zew)2]uR)[b&rV#*\kzċϬabqQ/3ylJ[p9J0y%SɲV8L袱UE)x}H;%Ser@#1`\]`-ԇYv"ZY~=7ao IBt&eI3:fBVBDL$q Oy݈Bu,Kv0I+d| ֳ2wVۗ)D~s^\zYz$Hwepe\!@KwU{7@eM$-J-fE8~q,.rg@/vE0lX.}1΄4Rv+Tdo֘;;qW=,}zfa-yMgXQ]/S<_&e!"EJNZZaLMR]@]V \ּVp z`^Oeq1 ޺iLD;5|vSibZj3bmlcm|X Ȣ\'dAlε4pzgl}N &տP.",QX۽g)[ _)&99.@E-3CyC8֧-A; 59"D`6Y/Vxj\G{E$7,A s&Z:3O}! K`-3 ^2G{l \-6AWcU|&קyW?x։/?v{'*3@Cƶ{{MI3""I\:a\aDJ0&}CDޕk$$^Se ̳{eUn/}?TYyp4olJN.b$3=CUlB|:YS{^CX+\*&}jܰwAS1>}ѕ-^zz_щ*huƕtNx߳a^/|ޚUZ\ N_]t攰V+jEЉkYy>V8[V5zt={~^3xf0O%3.kO/ VM( *jV^ڋhٞQg%$#"-"aX?8{bfS=N"[jTlDf{֕_~aj,^Bq{cUGgho t+ETЊDVny qXopo%%V _FgOjmlSĊ1٫TOD'(1s߆[?fY9/ןrp߀uon}?whtU0HTV(g{~.jҞҸ;'h) A!\E%!?I]JD/DS瑾$oek(Jia]gκg~Y4>R};}yJ+{`-8O^bM6m|`mcѺg¾y$+9*>/ª[</>P ܣz|7 t+ֳI:?W }fkOW-&`Tcp硓pOGj{@J#@ "9[AҌ]k#D^@/=Jv4LcaSp|;#c|/m28yž]<<k*-yn{b2'eml0|[hʦ}}=q O{5UJ@H;RcZ=/fy^(2i~~ɛ?g3i_n9鼴O{:+p0kkV/B'>%=;v$BHT,לu7P#¾p(% P:}Uc&[=co|pS'kbeyd`X9^\A,T !n3 /z+pzs;{#^r?mPu-~ؑC3þb{ml36k'-g Fttœpah*){s'8rk|ޣH:0SnG2 zgdYWao&)#|Q  G2A>ѩ[';LH{g̃Dg&UvtBzl?Ӂad~Hܙ亮S$:1u)y̋;=O<8x!ge >RSaXLS6&>Mc쵫Zx"$d-^}0φM;T &Zwp|/{5:Yw ',ghT΄@^M|b(d4gm'TlYK`@7BKrA NyNWe4Xxml6;kd̖ϱGj'X6= J(ؙOP+=82͝CȢ&b ,X5HډIu+- ԘxG6H\`j@o,ID)i{^ s݆}g|*2 IDATI7c;G)YZd1gH>F*bL~?S6szGݗ" la 39_`3}YQtˠ^09|*]5 `c3+?d8F]s"hfR/W)}+(гYŽIG41x-i`d:Z1~CH~s(GvTP91xr &۾w9=:݈6jmlc0d,Q\F:\7h!\WZ21VV(*a~_;؃ԅ #Pց/ RƘ {"/QPueư/}Ȍ8R%N*Zm.gӥ?}}nN( 12ǂf߅ #(D2Q!"i9gO҆kOX,1>v5? V?m2&fG VEjFFX$D:_ szQȄkRT%(}iS7"/q81)𲁜RE RQP ʒ:պQv &M!*$@$gk r%(HǓ5kb7TPSz=dt0zim;unW)"4,9֋=(9aٓ|]tF3+dy$ވYQ% @Ջ c-_=̣p,x)ĞIL"sd"[5Oi1&1+fB%+/\ _B[HzChSGZܛe!9\?frp`ޙBy̢Vd(h+6 4^B"ōymƸ=mlEbf9X*LD*x61HIjJ%F**(A_`f踄Epc}p dc@tTSjLpp!Tϊ[RؾW0\XNRJ`ȐB 5\Ϧ2f17Xk؀*KMNR$r^9D ɵ*m*L>f>+uPBY.( &髹c`iPyH| -P.Gl ڳIHT}ԶJEKg]귐g0)$Lj_2Y2ƚIF6_ay%}U&HC<.@}RO{ 0yXYc$1[?^~wkZ~kQߑf_ D{8Br3( +)NX2jms7Hwo ޱ`r{`Ϭ*@3 ,筈 L6v  %i ,` pgDpm6^@[Bľ%"WvR~PydBrEtz> H0< ]7H(&]f Jâ!$KUJuMZ%g,&l,.H]XaA4Yn iih M!1v*o CQ5&Rf}k*ЊDY%HJo,dHRfc$%zݼ8f6%/-X0(0 P=Rf)Vd䰞=| զuySI"/L$o X„cf \KHHm K&z{oh++3*/Gl&|~Q5{|H6㐷V'߀XSU>>xTD2jNRw:WFBH XbiLHcaRߥ䴐w޳ޥVɺX9%9=[RVЫȞv<JKj9C%ԘRKb5g)L#2NEX9s)kYm ä K'HI6JYyS1 xv0"(b—=V,{9wccH ()6 D$mnJ۪M*5THi҆F-$UdCiKcBc(p>>9{}sc1^퀏=>{ﵾ5/>S4UGeAEhntx[o`[o@{EQ (F]\j:aNeUU{N>l:=/ow%Y5G7ʭ6$ĝ=O9)b?kVi($ ʲh+^(@Ob%Te z RR^6vWZj8& 3S!VNvB)3(DRN5Eb*%oؼ|=p(Up0Xŷ[H 5%IU)ΡU $hAabofοٺp2k۞}4.) JM&| *8Mk5ZJfޯ&^TWUkʢoNs^ܱZp-ƛ,]qS\5Rj1Z1UmUXabfQy#yՁtUihZ=$(Z7k (d:]ƫs^]pѨԚ׾tfHǦa?qB 롐;0UTUbm;U G0 HmZ5FؾZ! ywMȯBg{T]L1Z hL1UB"4O3)EOڼ랻zzڻ- ͬWTz+MQ6bƎi:IFn̟kʌߠzn1Q*ɱZU7ʐ!x)ƋsӖr-=)m]Wh$W%o ]ZM fYԨL8gxjrJda Ţ?G7SoOFZN!|mfQȌݖ+؂z^XG5IJ)< ٖy32ZiN ƶ W;sG(2u.+5xKՋ 8V"A9RS}UBqJs%8ϲ@8mcZEC *քLc4> W֣>3Z2e,rQE&|Cևbk>ڜ#mRf0״0v{OHp7X!W!$0jq5YFQ .V->\+ fŭc&wҝx9%Y!q{^XZ ޱ4{iyTŒ!oEX?8m uuz{@,*PTvep캦Z}H J DxbJe]7a4p99TPLLuEUzjpO#8{^e;l8q@J[ؗgn҅<I"WW|iK/鿒ڞJjuU{5sd|ՄeWDi%ܘ~dRU 9$2W[jUPh`Cdni2 K)VD͔ZrTj0MQqJvjCUk}\]BI՚bֵ* Z:W~J u<]]SU]acPX{gCx.ssBAͧ.-4Wyև ښ5ohUY/eO˰wzԺޞo kR5m@hSHL4|@F+qr\/q WJJ.f4&@! 2JMTKj~B놊ê0H@ WX)lRC (<)ڇ*_kjлwiƚũA[т8cdRJ LSj rk \$\RDCfS]@3jCZ*=I5(j i|U4e@]l,FPƈƈƣT,M$ IZڰ&ׯFITfQ o}RƹP:}œASZ/р@b? 0L:E(R$[\mQuE n.<*t^`s.HLWu07Cp[Uy=N,ό"x#q=߶7=Js?f;R #?|CbmZ@SaOoatJJRx}W_P9R߄S[IimZrsxҰ*7Y-,TXnctT8M( <#48?v N+x@t.hMqѺUou[oz@+MK8 yVŜ즢-QhcqC5a=b]l3g"snqi9iWe,*HaBEv>e#^_@ ! VU] ȎWʆf h)m :sz*йPDNSQQY$j6jSr1; ]S`ix۠KCx6&? ĩ1MKOĉ7Jg^=4ivl_:,XT4n;l_/A 1~{>ߤӮP*_(߇Ƙ %E0J.) P\u $z2 hy$E٤0X\@ ~;dh,8"pCl^նu<KUQU=0O_RyfUr ֍u;[5^yfr3@ZZI[מ pp5˛(GJHVҿ%f>ȗ6?R3ӢKj9" h N`RcRW0\cdCqMuntBH-H[+Ce P]V:+Ī0 ȼ٤+fĝQ Bc3of[b]=5KIpm;RWَԉaRҹJDI33ø@N:(t}7 .h3OP* ѸPWϠ: hJh:oZH~Z4_ysGPbs ++.U ~/j0JnIlS8th<`1, Ce?Hk[ @:LEbaL m6F:_7Y6[o=zy7~kB(Jb2**'.PQ >+ō)2%ڼ rJ;;5mĀGU.YهC)=VR$`-d[yQTcaZY !qݳt y5NzsK?Fډ; eEpH80W͕dgZX|Ęr7`}˦ΦBV3[m>E5Sɯx(b I|~Wm FhPmDF/ڊP]1WS ջ-RkmcWٛFlCgƑرMj\/X/zN%=m^ i% ?Ya C,q CuòyAX>IazHB Y+ȆgR(3̋k:M:nu)@S {kk'FHLZ*a-3M:3Ѻ?gִDs J^bgo07wX#zsU(&|!*C靰 YJAsJ.:ꭷ>!Ka7S"Ėʯ lvbfW+rdlYɜh81 'SJҺ#+rra 1fp-pMdiSgQ:k0!G^Ia:P|TCɊ '\/`fk4‛ 4n?z ;U<fv,^)֔lDEkի: F& Kt^' pO o"4g%oœps]"dKbsb*Ɗ jעJNyJyWecZJBJ \JPJ8 iURXǟseN>Gm!ӑu g8K@ꗞ,)Bb<@P8)& @iƭA`*3SiގJëzi=> !osO {,J2÷% !{)~RyFMJ_+j5ca>Gucc,rzvQ 5zubl'=tF({VP 6I*&Zm^IivƜNBmz\S`K%SfUM֗A?}'l͢8m7%5[ν.E̾ljlH912PM2z+U$-2qi- 3}0&}ZxjE1U`դX$'jϨ־iƘb("GbOSM31t5~r Pu_֫J tNE5Ms3ħHg 1=R*b1x#t\byJ9JCAHcdq(0 ]WiKS#UIܴ*^3>2uԾHlxSr'K{t^MG3ojAkX8N?HMnn IXD U[:cQA5jUZ_ˤ,RFNUuimԷ}'yvP1Y}q2[on+zdjg"1`z& 7'.4CR@@Yzц7mE:n=ٷ;SMoxeP@WݪIRRRm2(VdYbAmUKnF;/pJL%5nwl.%.ri.ƖAř`+>~PNΰwV+X+m$<0+ w-H !+NE ca.aH\PZX}W󁪍 j 8*W7jZ%K5+=^>Wipr#Kkflk0~>s`K> tʏ[SlM)%}yji uz]!1 mq9]_}ʹvj:UkѸrK4 Rl`F{/&+vś(j1 n/Z+V i%SQbiI'\}X14?I R%;YIG*JU~@K*Tϴ^aYҼyjp6W@kڦκ k>A W_Ud)ݎOxV+l<ݙ]z&d_zNB XP1EpԭK|r~8{W<1v1A;OW{Â="I,yY4KF8}E)CW2[oۧq+O_,(8cc8Y&C-3IΟ$xA L`[L;( f7lG>H->% !OV6<3ب>l֓l:pKܴ"$dz[R`cW~"[ď|?_7&^) izf hM8$Ɲ"d=nXO5iӳ%cwy)4)pfTPX@+a #d1~ϮE_5O#t\ 'GC(Qz)B: 왵)W~]i]'5ΣSQ?yyRNUmnS yPCI@N @}0̆8K%MSXU4N!S q3H9»|.g!G=2A=x19s遁n(9RP_CaU\p:ټ/yCUL[L[NdM:-\D* g֧m^YUϝu`-N嚋µ IJb&D|ZdkZϹ«Mtt|\t[}pxE]Ʊ `Xp*TWY}YCJ! Bw\>$|~m|b:޼d6lt`I;bU:d׍l4 `L޹tx[o9g޵Jw6H7^Բ*"M&ʁS6fR~_ϦN&)1,#q B5W$n-F\֏?KwL NchݯF{ M#+Ս{cDŽ(֭WYBxHޖ"ԍwjsbHck.2 u6G߁7[WR3Vl-T-=<1Mvj3s9w8a1d<,bl{߁ϓ_{{6q:b<4^-ʮqQ̫̀=PXAW/'BObJ ܙ\~Χog\TF\ fpǍnÉ2f՝\yOyIO @o=]~؇!}aXy8$POR2Uu!ɘ]Jky@rF͡YѤ6q\{dG^BUe1ַױx@#ͼ:Uo}浮ꭷH$xX`=٢CK+!4I=ƫ)4 0GZim$zY*1/5-mBwIКŴHI̿;H'f+>!X6Mj]J%Bz`)߿T Q%!M3uAm9ـo፦Wĕwq0BFx)*j|za*|F`[ fZH: پ=5=L@1 dX|Ѻs SOkv(nf龎::em *kyWsUK*|_G8xǛp{xG ky .*"aϔ6(7%q֔o<>#Jg:-*i Թ!N7qhW7.ѳ к}#iV̛.B+pRtX*$5-ؼVmW#E}5'/鄇?+:`pdB^/5\1*ZtVȪߡ[7*3X@ڥN)nH4b,(L,*V1+ Uܘ4{J6j)=e>s[O!쭷p*&tlAοjPVBLZiۖt)Rl]TE+3Lh!fʗ)?'1نS[R#+BVўU\=`hId,wġwMJ|:5͋JΩJo .xWiڂqQf+sjS/T$RzL R٢!fHLo\_`JJjTyJ$xKmRZ]%qlya  {?ZK[Y̖\ޙ@2-i~q0^ayĽ/k΃/*߆OcM:.U _^)U`1Ɽ>[^_ukUL 4AEUIj>1S5Z> TJ\B(1xS :C1. xU5Eivj^s:op}æ,;-`7~{͗\tϾ>ރE}Z~%cz+fѹ4^M1^b-s}u+m}UL ve,hY-Ήe5h%<Z?ûi]3X 94mꪫzz ~[ oN5W9ue㉞Gb|V#mD/SϞCB,cu h(^%N=^+;PV8ʇ4կ| m^ (3f$Ua~YC\Ux i<~NZR,8dOEF9⨆-EM&`|mҳ}+ZbɲDL$O8T­b/G[@$M%'AO Fo;P/h I Tص) + ÌakeyjUe:iMŴV8WLTm9SMX)!#״O4l}^dP^p6SzV+4!U(߆W/?q>οpTq}Cb-ϱ?<YIԢaPxGcY>܋v't(fO>C)FY -l4{ZN"YR MP0E!$3_tx[ou[oV6 ȢK* £LmORИSmeOA "ҙf)U >.b`ej*w mA%K&ThX0[x,-I[ U(XVGGν #6EMi% 33貊*R[5w ab f7o:raھehj fCTjKP )j TJR6DCW(F`z i fJ>s#SJmZeR?Jj&@j>߅ҜMmW 꽔lAFL2/kpxtpp:cW||~%w!r| W3' ǒ P `1 c;EEUUV qyXabOdU~ͫ E]6ʫӪZ*fzr蟇.g1gqu C/o=MԬ19ٮ~vfV9& ;Ń d9"*T>-`/שx.[g8#DYÄ-AGv0Rg gXP?ȫ+nx$WoષzzYox4Tah(M SWfȦkbS**ɫ2{ie.( IDATr^X ߗ4]GZ"{ ACm-}l`h{0}ZR:X&y Zn Dwj!^0R gWG]O}LaYUkȯ_'s Ss#Š5I4QHD<~ PpEPKDI}oqͰVMy K-W\dyNIa"Uu s`z RS5I՘5 Ze73 xppppy~'n~|u %3*W'5Äp°ZWU|\#Nii[+uu/?'?d1Gp@2y|ڃkZRpNt4̣B&Y+iNZkZJ鸦Ho1U5VW߃Ë_qo :,"K%BUi.%SSVZ|nSi h NuO̡UqⵌْR*kQFw2K.:TQKXԨj6]QHaVY V޺$p@UoVov^iJ,4' O}eFTj ooE<ܴJuݦ.L%1>xO3/⭭|S=~jGBH3ux`x=gAm^$e83ə֋|b* yF8%&/P"opR*'E%(< d+&(\$?L2CM8\[ɴ?^ϫy^/A [Vy5AW4n1a<\ 2ְ/J^gŌi:S5jU&n } |_.\ +TR tZa ,F0.)"?/U(B߫kߦ8+?|Yڟ/z??{ `]]UsaNDbjkOL3穱}Ս8Sr},~" 0lk;ͭ< qwTp(D5'|7XP-Ph r-R͡ηKpjCt]7k=w5"N}z뭷z뭷;@5[S|j]bSV8OSc)zI%Z/J"n4 U&0l JcEYqk4d@Gl=a 5e#U5F/lh@A}Z I$=>$^.-IN4Ma ϙZtXO1ḥЂL_a*B 1M;.l:aL$Q 387m tI;3}6A[ fX5T xߧN!q]Kdy8u&yq'T{ȟpkL[GS ,I zLWGk?+}xɷ3/r> ըpᶚKZarW |*)uj>3T_{' iZ|t% NJjϚ' t2jroƬ' N+̚NEox7!xy~ᰪƫkW0^%Rª ;yc<*Rj|L58F0b0Yt2isqWn}@IU.)xqESv)T*A% [aWduNfXL z`oVo 6wpZrh|mXo `m)[YؠDB6XB74zۥEZZ5 פJB&Jlz8yuA aƱ)#_j'<; ^x_qտ OwC>NGS5?Tb>B#dh>Cɤ Ԍ{=^ߜ?V^ڧ$M+4A`g ӢrB3}ZfZ] g\oŋ~gb8\]cսð0ʪSQtx7[uR!/7q}lkR|`yh҄.OI*]Ws̑mNk7# UDKVe8+m+?26o ͩK3Q1? AQ: @9ϐ%-͂؇/JՒP fh\%Ib6<#Y3/.o9$ead@GUGș嫇^IP^ HccP:$p9cyL4 \wWj3HYJ3`ufUlEMMʷ@4k aƸz7 *TO;2^֘U?~NWq\` Ұxa,|WjZaΩUu| ¯mT')RkjxY 209-*E$&Un.)'q~;߆~ѳxi >Wq^x NdX kĂ*mUĊZ_ !T0#(<>ޛ9I}dY4֫C>UN@&<:#N'ib,zvp[ou[o}A[W g,^Fʄȍ(<|MU_%%m)b.@L:%t\oؤSoi"DD@5Kl[`W{q;XEP$Q.k Dg+ISqժȐܤ4vD%b(v\ US (@dq).ESBzӆ⁂dߧW.@X3Gwu| h#(ejX *dbopfW @lUX )hnw3 t<`Wk%+ 2l1Rw W~Q0"\Zg\ _3HOAjc49fHZe x=S¦ϋ=GSD@>{5QUoVob7MjK\{yy#~# %xSlmn$_(, GkjBl|R騜*\`KoCN qZg/EV*b 9u0hLD=7 +'@ _ =I0Q R 8tgL?>JĎGX:e]S^&\վ*J?zރw-iWս~Wp4a0\UaF @+ ?+=(K<0!e󨺯|*4G ej4xwn~<3 @:F?z뭷k][o=v{۾WoF&8S RO 3"ڜo9卟JB(f5 P 7JY^%@2C܈MK] wh=#Dj}쑘!n?8I6bT@pf7 X"\2oty9j{",H߽gм|]R8'RCXQ"r?8FO%풾Y2`%iʨf'mN0{Zg÷i)pu@xqX|Dxvɐ^D*Z1$ t~+!*w% 1&sS >*1*ՆC!m&;xٹM"i*8&zzXF &m8ެ۩ DBo d;k{ 'f#X⪋iS$&iJ\Ȉ$LkPE!D۪2wsRk)ώc6I6y0*~!)Q2* 8ϼ8r@fipe =r"KIT^]H-|9>/O\9%SH1ޟIG|ۅ*Ub #X?D^ӋA|#}6k(]EtAqfK׼́#@L|^ _?;k# Rp XI?~=?xVL}k q)ÚZWY/y`fJk_`ޞͭ4Y!Q(-KQbƿټ?@ l E)0HB`5)S{뭷z뭷O)UX 8$Ek`>#`C9^K=Jӹ$N6|i7Nq=pCI@@"߈~&!%pR̺czbb8Iς-I?~&& ]UmV8һTlIlmWd6$}ו-1LPW3hCz&Vnij-TCL<S2+E\b%}aca:ꭷ>YO&' f_xᜱiFL=Miy4%o/8 9\ڽgI`r>9אT~OsPlRwMwk C^9'Nu1!/*<EΌϽ`m~4ʊT >[7@mכ=Ufׄy:aNN8o_VG8>}ѳG>ѳx'Ͻ~-pn&8W=WWŰ}8 o<,`rl ^IVێwE[kg3/;7eg7\7|TUjdlD{뭷z뭷2,iox7p>|^HٴbkλB EA]A⥏tۊ$q`s׈gރB[bB;^.f3@B|Y™qx J<ƻ lwqv]P A(tX*ͧ!#n`Ai:A^9x~o~C֪xg;aSHquXzIb>W`>|78Ի't aWq8a5i_+x0~`RbWS9ox={jd9}\q9R\q̍-zz{>o}p[K w>]ҝAϺ<kم([iS\.ժ.y{.悱%&|z>pi wٸ;HT3A8|dwXbMөG8Tu:b:`:1x.<߄Wemzs?#}!7UUxuM*8\ս j>c:q}ͳY7ty+?_x^~iZMVuz3^-f\ /V@kƿ(wQbCzn^`6`Du>sȬ]pYZz뭷z뭷?zc:%K5;ĞҹKlTU }K3z7 Z*m=;E4UyO@YF ̲n R\ ѷ;_'D|*GO&u?v!~~?Mt[I;՝Hfׯ(>)!j3daӄi>aZS -N*x4.yyozƽ|){O|R֠3G?8߃~  CU!-*F:\cXHXgtJ>ۇYoË)-=陏@??0W0?k CXw}jZS k WW˳d"~93mU8m9*3u@5 ]k$94 yV9{wbO[mW[Xۧ%ĚQ IDAT*X 9HK]Qہj,=]kn~:rE <ڄ^hT{Pma$1A%^AjJŞ5%g Hޡ_Hܥzۈ7F;7 ߙ@<@|+W̥ kVy#@VٖZ&A66? -l tp\gd6&3ȴ-w :h*hY0Ps!=*(d 0Ae^R[}dӽw,C3+xH׿N4'͔Y~_ b#Ȭ_j c)*.5s+՛؆]Œ&֪o̚1M5x@NOSMATV61׽qPSdMu+B'U5R12oOР0ԧӌt\b>\ 8z^;P$> J0.@}.6LP≢IU|r n Xjk)6+~\Ufؙc3,/Sup[ou[o}FB,`dlTHM<1Kd 55i? /";˦qug>TƆ9lqFЅ@mm߽=.f : ?@gS+V~N=cAgȽ>}}xgtEu՞7NI@;AwT] #$oEQ+1\S *FET/<.t>-j0i -p-L^X}5q\U-n\~>v7gۜoiċO2އQXdF7$z4I$zك<{_|n2OBowyP.&!/^aV.Vt.@D]p+ȃW , sұެ\ 4; BJ@)^@:R$Mϥ©˅ l2qENq6q/F0 MȀK{V"rSdD5mؽ߀pO>Oa盍uwB9;4% 몫zz뭷]:dNΆz+@6].-mD\ƀu/Rb0%P9!=1j`>pY6b\~n9mpk\\⽳28 쫮i/?[C{e%HWEpgm2D kHniws(^ eAgt¬X+͋rIZk5@95ꅅRpXԀSDXL +Rew @5-U zW8 0 wΎPm{fkK+gj1cx}6~%\EW[X[owXH@VZN~ ћo#Y'OP[w}[HIAԕiIݶIKjwfO/KRn? pbCAB*l9mh>a$&'dmrgCzSwCsp8$q8EBG6繱p_1B1-X7^TْVyۏZs4̋HF~LK%VWy VRa2\R}f&ʀPS IQR ˗ +ZRZa`ݪBϕ> 9CTNq;*Rdă dGk>9?D0c/9hZ1Wc=\tx{~zNɌ@lD6s邽[X[o ҔBSnNA.W²97^%GCu#{[U6"9o-aJRQoSی{ipG#qA$_Ќ7rؼJM51 P,M? ϒYT57{(4LvI@3RV5p!^ BaψVc`~}rJ3)J?$Hϣ?L|Tu*h&XS73ʼ)hb?;/˰EXUB,*q>c|e^ՙo l5NXQU xDnMDêL)9PC־ưҍu~uVəQ3WY3?5DwO?,g>+}ڛ: + C(v邽[X[ozZ8țt 䪖 )EdNB>}/5/Rrz~n*IVKOvvI9W +Ɇ'B"#;6+V ݜK ͆(p4ʜ{Ɩz,K˞_4=3Y[P!IX@ a#@#QaCւW2m/ֆ3l%Pw>Bǭ!:&c*9yB cjj*cNSd}Ql5,hv!8-JDW$BҙKUR`.Yyl!IR#|` 8gs4\^G*0Q)oMҍ#t8Tg?[jZO@G@,=IBH>Xs$؊$jm"q8)p zI!jNvsb`{m dϦ9=\UĘS1 \AUD3)'`uJV>6)b)tgwɖs2{+L5VU>Ty< 9pK2>ȬHukC"n  O^Ax:m8VTJ2䕊Q@ރ}T` ,@|!.T*F6zY +)yn!3LiK~G$؏o7pLtٽX,(K֍}e7A?hQN)i\U <mϲ[o`[o7;q qK@@9~5`5pٕ6g6ܴN @Hw'2I6NUU4J˙X|jy5K|:{}TG!TxR lVƹҥC$qXyz%Ol xE`3W`ņ"U7㿃ԅ-獶* @dHq0i ktAO+;a QKBT=l.#B$UN |eJB$Q>)XyƌgPN:cڷRlP 3w- a5$k]MM: >.B!mM*[Y@RV2Vd (BzR85b֫mLb庘f㿑J+C)r2I0'XPjD C\9scԦSi_H4IX/,D38͕}gyA/  -E ̀`ĩeu#ΧSsO0vB_PmWIMLJ#W KR>؇$wF "#3$MsL23/ I&^ ѥqk? ơ%I$I) *}6MpwΧ"ry4÷irg#Ivpav`;To6p 6-of lt x/{@ZuB B#_B  Π1i&@(m:8$ 1pagtvMr,OTtTwqu[(n$pU[zf{Yxp}; 5]%U<o6U܆mGՖR0 :̢V^ O&0^G,;6gћPױ 1Su1weޠ5nS]kOg8E4pҶ [? i+ V` O+I$I#DF2 z5R4 ,a z"d(tf Im(rXv&2y/ΗJ #XȠS-Ycaft6 : \>X@-CP6@3+>>2૴Y'1`J5k ,yd:sG)l%X)8 ^kڗaKG`qbs#u`896rqu*gg[el8@ax`-ux;|:,MXkdlt/g/;H6ZƂ59~!Vߗeo~$I$I:[ k. +Yb4H>[V[w Xy.w c-3؈ЁJ}V0xNcݟ7DXE\ %[(T-3 dGPqDʜʮBħQx(0!]d_cy(*tf9@!? q7 a Vۭ%:h6h+&š~c"bKWBַ)ԇ36@l>"tPL4Q)t#p  xO>1v<HdmqT<: 630NDQ7D%o#p8v\F޿|ip `6Ua15U k׌(92Xi$IX$I_n7ĝ'A`Rl~=GRkW#3hcJVz#3MzmQis|3po۲roSw!m>an/]qF[U^jA;w͈#U ]w\v+'f[3+?* T38^5)h1-t^&,U {:WA\0|3RiJSKC$S1Jۅ3Eξgz b"@n$Wܢͭ9ɣ/+6 h6}O{6]3J ƐE: 6/@ڞM'SXZ}o.c N%t_OClM5},Z{FOmo&*{k[kKW킒$ `I$ d{u Z--5A][PavT8e=ׇb!M7֤J``إo3A cūAvO*#obO*XIwqq6~XHZ)6L]f cܭgXE pڅpj8Dxk\8.%5vV4q$➯@pX' pjDΐ:qZLO`n`z̭} Ȫ S[w:8q385XAwѵ@"mV~c۞3pt;fZȔǕA6~R/ݘVޚ2FrXȏgYwcW$IX$IE|c>"ro%7*H-͎0HHvXa~@"0+7Z '[Jnᨀ\2`cZYMޅvhW, x'POʁ 74 RO.$JegٜniMKX1"\(R$z͹n,Pznz˕zQ{\i/nv Im˯[]@:ךddv8|9>ҪOacesci:d 2س,*GlJ?Z5`( Fnނ[]8udƆa%fg!mV%ޏca3+I$,I'~T5X3p<& ^ʇ ;$g8ŏe. L#˴O^6#!O <9&Uur-/$‘, ~~ o8v{o ^Zp[&Ά O#Eu(oZ2ha.DOh!ףq)Oέz:,_]זrm5 (凙_x:-4ܿZ1H'm%w `5$ږ-x/f!b +r^#Ve{-L%`^\|| GlAj l}i~2K5fn2yͤlǫ-v0W)J;o] Lɜɂ$IX$Id}cB2G EJĨ2ؽ4w[ ~#@ BH'9T-*HPk|Co1v :<)e4ԖǦn(d!Nv֜"; *k|ImN#$ m\5wAP|kkqA/DseVp fƜ}| Y[ 60/nFڞQmT (hRw~bC@<, 5:Z=e{|t^_$S^Ė3[ zv$E;Acxx}$`)Eg8sam/iX[l F~s ލ~@Ƭ7мG/~_$I?t$IfV~}p?$r1\ܩ p ;9G],g)-y*jB==J[&/͜ڲǨw{,gv/կ ՏGAwYy^tB܇ӉA>:|TUv3 ~V+k켰0Y"f[|pN-D5oqThz^jU'}*9Ctá{ Ez"o:Y("5226 }_@\Zjm^Xyհr ܉/0kݓ+Fp;q@Oln{EqO[*fvt9ۘH.#HlSe _9k>춮}c_} -,?E9br7\{ S-hq}˚~q^[ŕ VZoZamZIg—nOb} #[`.x%I $%I^~, 3hqv@BOȁTK-9KZkrC|G77z#fHnAdB&*fAQmU-V?C{clCXY_nLdxc-Sm}SZ]% ATN SqƊvk96;#[nzjބ>*+Ro4Rhb"j&J92|u,2);h$YbK\̦$U XP?a&v6=Vp5t1` AdMkߊs̀D|" FE7[|nHYS|c~sԞ8Hs~gCFxdb~v1(_JJ$IK$O@>ZOA ƨzƚZL /5B*Xr.ёkCkVPC+P1N59 [9f&Xc͕b*Ι 7lpM:D;>Ԏɥ2Y;0' u۟L.N l5گu<z+W|cpT-M;0:e2[c8XN Mmmipfz P4KY5 `pVa 8Јy/K(srˏ?2Y`j7so+I$,I/d9 ~|x*} t:}vq(ΎSm8ž$!Q/\5M嗵R `޲g' y Gp7թhr3c(ƵE_c4 5=cN9A=fvjCgG7 A-*-f#X퇃l _l6 ?~ew-!+ Rα^T=O'rv'+prq!ӊlB~_*J$IK$Ttk(=$ Jmk̝`)6ӇmVRPcU,ݚA"ZwGJɉ7lO^&^Om1= nH4nEWwBXvW)k/ROIO=@,,X19[&P5;bʳ#1\k3=0ӫ_i2&_~# wwC; 12t:Nu~ޭٱz_/~5}q%I$%IY0eSx3 ߧ֚GQg~xD.5XhPE ts޿W\ATaoߚ_x0(  w.ͯvt[M¢rp_s@S`'Zr?It (ڢqn6Sv<2q}q`l^sv!bpUMKgUGf6:μ3{Oԧ ~prq%I$%IY? ްT_?)11n¾N_2aɟ-Rԕ'✡U Mj3{?}~r<8Z|MڞdXHwfF9Y#\0蕗t"e'tzj5vuoi/="^4zrmvrW֕k ~#PkҿN;atl2 ~h~Om.AKK$ `I$}E0+O.UBS g\G}( PؼҶA pxoB_PLCLRqIOS6B LjGNV'j9$Ӥ=̍c"L\[K@ q?M ~rp<7^wRP/~2$þ~bkK}p c{l#J~j[>n\F%]19\l~G; > OJ$IK$o~A q6$xQD.HP?y ~YAa/$"(S !X̣aymA[`6V@ :Ǽ3Wx^>BW`q͐BR7]9yON|dq9Exu|S;P{;MznlkPp}2KDA aU帒$I$IHN4T;== b:*Go ة9X6>Zj 8ysrtB|m R`agƃ&R'r=w}"t5Zxa{c^_OsE{'鶼zgs.) P-̺UA^QC>q߬lu(p%I$%I$1U>G"/ $?n`om9y ̻bpdxqc3+{rA P)3~0_pL~}xAX3~BckmTކ4@uat?s_϶dwg\>W_≿t-lt"p%I$%I$=WBƟ 3Rd/7^<Ԏ3[(# ;yƟ9^f/~u/[(7נǶC:XT|ziPWH߸ plΰ>~n|yk@{o7:uCJ$Kn̒$I_>-K`y|=S6C~0Mr]YST O"9m*DR,KS~'c st~0'ԯŲSqQ8ʷ?**HwhfOol9)pf 'Уy>rGPB*׎zyt5Mcά᛼Z 9S.R "%z8lMѝ%ƺs eRߚh#@d WombJ6UO8uڕRfQEC-qG@4>cLzrDgdjJq8Ѥ픍I\2~M]PUsl,ω%ϚvR~^C&=b \K+_|WF?"^YQ+ "̜a?]L,?/m@:N.i"f kwAʤ*J4}e:*4ZCPCljtS3AeY8WNn G6{c4+!`rוM=5w&[>=^T^S)> \AMџPx(y[4%Ϲf(' 5h%}{R Z`+{!Lq>Vu4g8𸎣ӯE!c,g*&CSFG<}ʸLwoÒ!|{NI1{` C!e_)opUѩ (oo@L'.MO=ߙD ,d=κR~pN]QS=y`,|JsFϖo0Zc&B >.>^%X|Õ[tWIL{$L-wn)@ C4YY/~4tYry,8I<|$ K{a5D *>̦uJZc ʱ ޷*E!N{=|Y m+PռPRK߯> yv{Clz@Ew^s^h"s[UeuC Y>*KD@&6N1pm)N_;Ȟ4SY:tq/`)`ޠ'z{ZW3O@RhMS JA W}*(%bSvpo4q}U9$XVFeuK 6zLLyKkaqckbَ{d(_xQl)*sg csm6VCA~F YY>W.r8ie(Fg0-WHc L,LBo|[gDbph`y-8[v>KK PԦ=q}6,L*&6G,~&4ad1#ݏ TrMs8f@b0eDžvv|ڹ#Ax;V,d4D5p+՞i*?/Hھ452e9sqÒ+$m{dHvuB-12љx6A9|aÐ並\ONz3)"1i+Y|ʌj&( b_]^nKpeb/m$OpH`pOM%(Ћx;^mGt3X} R"Z[6Ohs 44#9%3_\•k|dehrJ:zr(9/׈֜$tTdK4#p1bu ޻dˑIB_lvS]+MX82_vю&j.! ቟rn+j!-oh .5v۟R5Y^W4[6)FtDo^t(&LIo' I){W֨j\?B.kA9@DZ_'0/qy~$p~\t˔bęY/pOYz/cv_:Xa z9Mw3ZG[/ko4̧IekۆhSl8|MU@y $H B1 o_HXh[JN{QaxmA+LZXh,rQSq=Ku|8f4$:mLqqL};H0cz _N(ټ6-&E%ɚ¢!#bM m`lN7ȤܵDS+5dTv ;CAtykAik)9C}3s_@2&I:ʇ'`rfH cB+* rB4_vfuʡ"/"u5ШJ,ӅFgDl,_?4V^FPzԮƸ7kl $qP tcrG{¬צh9!Gk/ n766}֛@ dVn&х` K1ztU g?cpU~Iяid tZ8ϓ7ǸHce*ĥpAeKgi˼I''=%NyhsϤvcN, :]ꜹϢ^~`ej_~n\gEBb>|d+ ?s$-ΗEcn.ojb `3ִI*\?BrQ̏|Fo߆zj?º]&OO ѽjaGeg5hFK})J[1\mKdz<)ny:n+c_76[)?Z" jxl"]2sV ZTm`$')?CtJiDm7*ѕ6dŻ%-5e B8c-Z=G]&d>ߤs loq'>IC=DJmLyA\ tE^,Ųͻ6޸1W)gMU[IrVx6}\:YPA S}RL_jZ l!ƔA1*.껇O%EܿFtu;1y N48G'B{VV>ci WSQ ?X`l (I>LsBo4ڻs&[iFAntWlyfKt=Vj]<F:Qi$C\l1]bBJOڤO4fk/"/DFd1`N ^4t]taS#"#/h>K8q'#'7fMRȒIeG$)zV>@8pD(Tl][W ~A鞈/IDWFU =r8eUCC"V߃+UyƩ#DžN5Cark` l^Gvh-^kJ 1Fbgf ?X.w[Iy"O|F̍i솱>/ \i}} tl$?c o|nbC AEI ׽&1x k q,t xrocxێ%VwVRK4b``F*b.-3j ik2άVlj{R @ܓº S<v  VQjD/JL?%2 7^.N~@np>g bOt:ҷ,zMNC:Ĕ>IL`7NT[%P&Ip!J{#DayX`3K@GN- ҏyܡԸѫyKȁuk}8МZ_~fȽɾǶf?G; x)\ s /qQ!)ӺBڒ%,M6U$ūo ]i9((Mom0=5%K6)'תI%.~i.uԠo)Q,PwR0HQC2{.@놟fv\'GcmKP4}={x {\pnYiŌmQ"-1O=N˙~N=Iń96墡 9 O'2*rs-RSq|jU&㪒9qOf X0N T+=/ !ʲ9e>ؒK `S=% U-cR]9H(tXvp'؇`D!b`ģ"Y1Tc)#sIEq>qPOl[2" ӂY>-|śJܨSoY j-ű˸/e3G*; g kB;Kmט8\^7ՙ:~pŠf;U8bM|yo.8 Pl`L+:P=%xnpAxO50xKLXы&1KZπLs=%l|*%ܕ4reʑ`嗾z53pcV`7q,|+.ꛃl bB}C %n *B4kw`(LPUa#e\êmp7 i{ncbHXg bY)E>L D;}^@I%o~>!3Mvlg611I $tޚsHJO?ʡVL K~֠I4]g&OkmLZ#^>HAWGm_B\} ^!!yy҄EK7s`(4A|:D[Z%uqbT97u*9}QGUJGsKL[[> u$sѾyTY /і Bőt u`ܔT~*aŗNc_l#LA89~[HK~k$VZF5HuSv:)m^`yXSw"8e:q^tf׭0mDqY"XRx *o* ҿ҂ S *T"!Y #r3˗nOm|):Sl!~bq!V2Ic7E{y3r yE6WƩ*ƙFC(1>Js2_Fi~e!WFYm/UQ7z~Ebثu;RsO hYlD"`sBlɯr_ Fo^h|GAd\7͇AZH3#Hζ!"xԀM0՘Hbu6H3j̼Ln>sYf]dWŰIqHsɔu]A@}X|_URqxU(";e&9|WCmnb2 v+t9IRoRRuG>"ӵ.&Ch⋢:mAkfFdM,7""7 ɜv"lݭe0 |w$e? NQᅣxG]@҆Lk_ Н&~acX45w! $zJ`٬Ճ86@F 2Ђ W{S. dnjfaHak=^Mt,dxoK{Uܢof0X/^ɼ$|I$6/@{5hcIb9mYfW؛yi'$kbf<$րΡcv;5T7pq~Sr%J`09%8[SE ҖjA=twq+,_őNSǀ(2d%hPufC$"僤Sj ΒaNn^x6(C5`ʞ6&3 {ZIC-TDiM] ۥ$ԣm:s#ˋ"!F^x3 Po8iYsZ y>Uyw91SA{aJ'#W9m[dQ/2mnY|").S.U#B{Ϡm=N,  I: a#Q #ڶG6NcUW̬Ub-IϷ#6V,7޽%b@ .h^|K <)F-ԲO}XDpr($w_JjG5gQ4be$b>͝.À} c"#f*;t1;V1-:TQrw'6Bl0G t[|T ;FE2a IK;h!E bzm7'<͈i'?^U$uR҂|j_u2T o$?ش'$n5GCeчo\u˳t^ov\`kŰdA_\M-L .a ]X}]OܖwhVCh h iT,˯Std0oW3ib,NG7Qӷ(# iܤAB*VD&8fƹ]caѵzIQ#St|M2f&+kV q9aL}R7AMAlwԕc5h\n/,)I,&72TAR׉2QT0[ + M|KZ<2aie^r #vDĿo,??aKhto8=C)TmE| ݴ)"ywأ~T&S#FSzqO g2Ů۔qXrW0ӝQIqm~doq=/o٧*+jA/{;}<{KIB; QJ& KJ3 Қ>׾_p3ܪm|X'bG|,޷6 }uqYi)6HX$Fc퉕#> B^n߱HO R֛̥br̼fsP֢o1{ʲk =D:BqnW>ä2(]4㴃34<#'Jjbk`R dKA1DנCƄٵL$3:D;LW$c]ak塁j98ue|kQ^}l\)øp댕VũgY4`&VC9lUw4H"uf ^Qx}ܝMدՐ%S61opMG ё`α'\Yk1Fvie *mrۊG~F7AF[8-IO\$ Cyu_v%T†>ʺQZ#+.3x18X+YiUj*!phCX#5BvqͶuxվx 3MU'Kȑ* 7`5 C&tkl?Vh܉++ Ã]k"4`soo Jzy6^ȤMjT,ƟmOB~^c'zU/7vd[kpثtyXz-&gOu^yA"< tAf',F^"6fydF;/dtAE߄8> (>s悫fD دL礂܀Z*;d"9%oGbh9ԏ 8HYMµYCmp ܲ}N=)g .|ʘ-Z]$7_f d$ \iN6GXxݹ$d%\0 m+!*jfX QH^[ln%5N*[ȾQ u5FOzh=Y_o pT:1T},ֶrHOo+ڭXДl+t20~ 5sm*"T h)кar@'A։m)l.XC r(eT "jw4 L/)yl\Gݏ%j qgE;-DR} ZT9G?8e- ΎEAܒ Ь%;.܆lBi7hIp{%+ }%SwCݼͱ~#shj˞\Z"(LR](G7TQD~ oDp+aba]̒u;`#*=.U/ FEU);W"e<*RomAqz#*TԻ2߇Ȗf2D.Vn5p?hj 8lxCgAެ~)@Tٲ ںDHG;3pUm÷oW7ylApVG%H@b NԊ:amVl+~s PKf1ϠQeECGt c sXF2TduTlGv phi#ABdqQW^sRPv;N(Nma ZpkkW꫱YMfM|Sx:e!l0ũTiܶƣ\, y$懱FE۽Q ùBT'{ ܐvoh C5iѠ5US*RIJSJԞS__w`␢|uw!1IQjz k9jUxkH,FNǞ9V8fvןFuO~a{wIgJ]7j۴3ÌnERauKI.+= I߸ψeroT2Yۇ6>1Dat%/cVD\ li A9h Fv,;qq lŽ8] ~SE{Mgʮ_g5 b] `efR.êϩո^:޲03A*h@[r#ԧ0P4|v\nV6̩(+ JάW!Y),!?8D Q,KgBg* e)2@l(> B\ܒ1⃘=ƪv\C4yzNngXFa6wAHH iN:yG:p /RS,ygNr.K"Z(8BbRT6M0{8 xҘtzWqpr] Md:"hI5n& &3o(Y3U{60ewI|v,^SVhw|z6pKhP92%$8W!nTҔC:!RX<-g I12; @K5#m%w­Y s k@ v3Wq$Pٌ>nT72UEV aq-;$cNDqu|שн(P^0ICU#뢶<ok3l`;y))>`O|n'Vԙ:_b(̤3ߙ?;0uA5#9mCDҟ뀑ttBƌB%{F8V*3+uì_JrS)᷃Z,1n eisDkRH >ږWSd[p_ +!te#⒚S%5䱷?#"1[/mR5n 6㤞skglsP=RZ\-5NnOFqz}Sl0ԛݖ 3vrI4BsCZkJ{~Q_'X)R$nG1+@UV7»eP{ewYr-OX cC/ˇcã; _e#+M\v]5c$pG؍$fM"JMI^H$S=5=T%\̑/c0xx6(,QKaT+m/}PҞeǜ_Rt9Idv.1^0OT!bOu;TPEbk{ـtςSdO842qXG AKI }'c Le;hP'ZT!~ƫ78{S%X.l(i x>w_{ j3& 8#Jh^wt>1* W+-? Rm)I_OYDs > BwLY}׮pQ =\BK!E;p /#OV.^?Χ쬿|bU+..zQvjtTj rBLRvD..e95?$?H=".ʿ;)LދN:]PW o+|m^?:ɐ`Aq<ƹt,bŝZo /vzB1ryuVr\7lcΨyJ}c8]mfR3y_^q՛&a7RxR^AºO TsհqU]T]s?tU3:N͇ 2u$xenT6D؞&3KY2( ON;xH1Zx]Ng o|&gf%#x׷zo$msH*fh7{ˋgHx?!!MG61ϘrO& >@KUM :Bt+*Ĺs!9^, '9 qFCJ,~M/mLx}[x@pJ{3odeqoábEl -=m#ejc]o[)M#΀WȾ)[dIW3 (g2Ӆ׳ngA0ͯXne,)x"`>;Ȑ=19Y)<_4qw#L?FgDVilas\ [hOFqҪlc3$h΄8@SQn[ {ǰu⡽8*׃* AݚB[Gœb x?eigR5 >t q+}$lu/I?õ^)m^b[q0: ,ٛGIɘ* "Bȼp,&grz"jRX,-dǢRQG01Zu}U0 ۈǣ?75`0EWH⛡$6{8؇/@Gd=&jI uДv79kNQ Wпm)Ņ 8v9LȒrn~*(u4_,G&E.c$T j8$/ a*P5RϧKLR 0GHO/zZtjm.Jz]}v4VE~LX0@}" t  DK$9i^AFNPWHThoJPI*aڗAjث EX\W 75\>U{O vLsug6j:NKҮ0IkM7%{P=EhoC-&@Rntlj '? nX-V8c?+`l?{RkDLJ=;ϵT`ת6@X{0Wa.1@%S`;5]Y~K%Qk 7a$/\i"?YS԰%ɚ/|W!zi.R jRP]y [A&o|jrBe_^p:$}69$9'I(*-w;F,,֑M/ᆂ[diJŗ_NrOdPפגbE򄚪f+5NA3q3<:6@s6.@Ɔ+mZ=03{t::mUM&ČC츫蝫aN3 o.?"LȬزcˑ' dFI<d.xx* z۾clBgdD)E# W՛.2i֯$FzB>'V(+%O6V=p (w`H~Dc)m D@ *=}RʁCaPt GV_ZNAZl'o^CIyD>o7PeugTTO+)L9xWuxVHfƮ.-i!OBE.o=+0l#z^ϒچJ#``5?Q/#Ʋ:N%5sִ?4ޘ_fDZ<̽7.]B #AFML;x/,ħ֏^hAGLݦO<]JȀx H_nƟDYBW>5oA}; stg&i`~6ޖZɹE.VU܆M*jO>z,5[V[g`\s1F` ̤B?"?h&b?nt[ @^# J%#`0?j"._'lPASJ[b9%5iOÁB}}a bhA#\Ku\J~%E>\}q c%[>vw$a)zਅt)B.r忘2wn}mRpxR>QN3757VX&¶<9)dSg7zv]  Ф8 EZԉɾ(p*fh(Ft7ybJLMaXVӆU'a]ng6s4R?5&oS[DĞW_*j,S~nxvCOT5{\؞W(>#)ѴAٵ6Gå5m.otrC q"٦-ӚDELc{}W&2t"B`v `SVBskhU4jW>< ϽdV&6:\t%tNƌPuJewN=$uȏ" H/Y[Ɣr|3"A *RVAI%gVZ,=QhP嘹̷z6g% R6t 薎UGYV^v,fe7/Ȱx\mYğWu *|& *Pf(ϩ3E(Ix-zW/C(L94CՀٱh&66ڊ$pHĤ2;mM%y:oʗ)ؠg.,="5&n \y1hWW(?ppS{=0EjD5DzApPyX|Ol;X wywS8-lZ^B4Hd-(7rHebuoHCddcr U䏿UsޥhGזQO{8;"#HҐԊK MSD@wŕ<K){xH \ްn 9hm@z=g\(<܄1f<tO7+s0e^ h 2^[JwmhboK4-SZ;ݬzª>^O䌖QQӹ|%⚔'I&C.xQ!6p:!m Qr#}()vc1TuëT*oMO)+ v*ʥ-c=4^|wj1ql͘Ct+a< "(1r6 A[S8rNxtRUוpJ'Gc4  K힟e\K7r]M 7hB%uf{$UN7"$Y{&J7eIHIcU,(`);+i ֻysIv*M]M_0v8Df@zW0f1؈yx -=JCEk'dIkh,da bNjø;UDB$WpJo(ſqcJ/w. Q~nTC{ԺKe!^7eͫ#\Vة΂AqݥL.DwWa,AXCb >Umsss S-Ղ08+bwrlo G N! |V`-ק3!J'; rՒC"sə3X͖m`i%^]~-Ĉ4Q#-_Q k`oZ:H>B@7wP*b :?o"C`rk%} KT峃<5.AFd/Qɉ.85Tr[r'<@`Ah1\jX1O}(ӳPH\\E YGUMl@^!˕_F]¶NC+7kU@GzE}12>?AZOԒPҬ7\RKG-O*Pƻnj%P`oEUR7+@b4ϔE|ƑN+㋤R? 6(ÅZn\ڈt)y|u=ⱕ"gKt(˄mw^ǽ i~څH"EܿU #>xz{,<Js|_!nbw@bȻ_<^#ȬԸdOum4}f/˒T ps;Z:p5"{  OA¢  >XHBn| k ɕ_{&@Ԧx-b[<>Om@Ƙcp6cF5S Cu.LN޿˛륩:"@Ȣj_@ a[6Uç\U?9伮7P KJ-Q̳ ]Rj^SĿ~0}kteOAHr8 `*Z ,D$CvJ@R.!tpgHWSE%ؘ0MӴRCxv^~x-O ,B˽hs(5fz14xs֏eg&!9rUov]6>%џG{6Bt4v,j5SXq&m* 1_ؾcc/Rr  V%K2?ZQQ+& _7#$qGfظ3SLR 7pUOG, bWJ^vŽ5 ;Q8E5_!ci3PRs0QA;$zK?DjUj9 @&T Ln -Κ=' ;NX)/@OAG2\n)>]6\^\iJyi%W͂Di4BM~&.ond7zIÈ+/'_%'F)_AQ G\দlgt5OU\tjy/ME_I's` Pd-CpϒU5u8[F2tt֗0K ۜ{2]h-m-t=}MS͒}3$R%oL (I{Uxac>uR,Bp/bU}-ΚDZM<.b@%":݅?݊qt`_sw8wm{c }VJ(xIAi#")AxU{|MOW݁gO<(&{Z6e< $39%]&@hPCm:DE~@|G7[E˥硘N.\E(PMiõTt<aJ"L$Zx!,љ^heߜՀ/dBU/]ϸ 9oZ V*ma(pGKr!жmvĪ̉GZkpZR6 M&=ߘ]τOku&LbQӬ((bX߭K"N!>\,iF[ʺ@څ4(uR>x~bթ\#k*>y]VD>Q"̎Y1yT\LȍiͰd$bT~s/ÅcYu3MG>J #9T ]G.Ms8)dD6(;>#*(ފG=s<Jq4;k(qQH{#ҥGž{UD Q3R̡gR j끛x&K{u)$W]eA.҃8M$/:FN!WCc噦nXBSI,ڮK{$~Wv$8k7;:~a[E 3?L=(Zq\.BAvW 4ZdzGA3\LL!ޜ'7X#ފo}4+x:q7BBWmGuJgb'WQ0!%m%dҾ&XۦkH["m]J i}^Q7Aq80|$FKd>ͼq])z40c`ٞ68@`A@g]PeC6FN#SXv^ʚFS Bj3$>-UρCekg(=`nuX>tsc+_fPgF<`E67-;gG#GU 7cJ Q&U$YJ_pYz[:G %uaGN&[/C{9cm午Nsd2 h@ U^2DRUΕUweOØ:P0;}4ato:\$,]Ŀ[yMws;203Y.߰  ?ATh3̸+GRO!#3RE37-~)"r8{L#\=r\s`c#0.Rw'x$^e0skD:1dFIx,[<7A]]8jR~jAq,w@h\$p֐@ѳ^!{KV`T yQ|n-k˾;KCn#6 "%l t:a.ED4h殤*4=ߏ#N)*^![sɦGCɫeVCP'(˘0yJX9@mse-TvZCV)GDr",@`;I@Pg*E5@-3K8rniB8_eOPg)DwʨDAFNd+],X_Wa:e7XNdS{f} ]FAm:fVW|p_8 KqSNh6&|tYߠV\/8AFG}%Dql/H)d3XDžt9^Uzfj6۸|+g,Ăe242)Hb&/ov~^Ril Lg ߃y?gmb=n&.sN0;—{IC.~KOj4}ԱMƥ"3N\y\Ri1t甶\<%<~1ȇ4|O6 {s鮞H=n5_" ]|Pb"#SGˊ76GKD 9زn#8=w-Y`<{?ґ+q# tk* ,cJuI(+JYئ΍pb!0bC7ҹD0u& :fTe:Y3Y)xWmm|_u?Ŏ΁in!D 9AmY٬'̐YKNh )~@u=h^=s2w_6/S'c;-Z=$H@Dհ==1LW`C$q:hu¡~ 㛮z۽XF%eIf')AN!?5'X*j t ,TYLǣFR[DIH%\8'pd6KG[.na?;:9P-\RRW8D:/슒?gu|= @XF=| W'2ņ C.'{pnT3籚]|pȆ> ]0Up؀%'ȁKA M2MKm \XÉ`r g@]jr}j~7n--S(Ct65O1VQV,-5 S3 φj O:ad 4"_ uH `j?-xӘb͛haWϘ׼X󗆤;*d; 3 \Rza\mN% YZs}yޮ\Ϧ_zd"q ! R{^roH*F3 BMQ fNer53`;M*ke}<3Rf3%۴#hH#H"ӿna f%Inoa2d#h!_5au? γk0i^lQɛlnZ g!WkGs4dGiT.WRZ2iyk IWh !)$kP쎋+rFtF1ik"DrB@mT(-˧c;M~s~٭ 0^MB#yfǗP U,Q;D$纯UuX'(8OȗY֊>E=B߅& HИ2)Va&`Iǻa)5[$%FUKP9J,CjbETxuUr=ޜInEHP5Z&ҫ ܴ"JdRp@ _BTKep;Ӂi6`Д ,pNB(oJogJ21Yj=3rl e֋f]$Vk'"Ixէ8 a95ҋt,Bl? &F ,t4+cC ">뤟h QޤY8.* 1jbs|/ub~l-)䄞~kIaD_!oAv%Wȯ6 w͡MF3 ǎ1] ZB&j[݉TPvQ>ݟӚjpC zR6MV$ եbnKK~960̜a+{b}5_IiX𑐔Xh< ^Du17Kݓ*ѷܮi;5 Е ̰9n.cC~d@HXjۇ'bxkl3'fXa!DP*{0 t({vbAGfF2co {[! 0HgA8wBȱr.$)[ʝkoe\4`}<^ԁӝ%, #\4x◊L#zq-/"de2\/ܧq>дUSAXeHH K3X'cXHuR l˗0.H;SıVdףT8paמ(ExG.Ǧ\II ,#sLGnWV {53NÎ "!Oݰʻ+4 Ь=])`;F9H?(ܑf{A![?nɉcZanD]x;9+1R8:#c ) xEl3m+dO wAFn;\JHaS.&ΫӘa(!\,hku v:m)bF 'j߭H2KVݏ3 _ەD\s0~-.<G#T5?˜nrTkOt#+>ѭgK3VҬHmX GmJ)ʣD HW>±}qӶP[> &mFAx.zѰnP!6'~ˈ:zikcOۿm+sý\%ʘK>$4$r<`ƨzTf*^wĮee)+h 3PSp8<+#ǖ†8̅:/aݤKx˶q'IVq]=n>rلx\y-㷡 Ie( ccN+q*I cx`e&\,w Z-_&:Ob4S)hD,&>jmY^=-d0ǀm9jhYϓn̎DJ9 2/EgoAٖM% V\uǓap6!т6Y GPn7HJ.ELq CV6 dTsc5gCfmRdEiKX!U= ̮ '3GoteTxF<;EYc"ol [+sxLPtpݛk@ELu?aK;U;X0;.T(MU~TadAR/N`Þ[8VYZԮNJaekSc;B鶠my4F0; bX} WW{jjpCu`z;U|/`[ ^UBwOǦ+}S7N@#nJ; ^d=n5U竵6ŭ=8MQ9۹cAۂ"NJ]ls5khX}kG6DkZ-Of oT}YHGA 3 bg_tdh\;*x8Ӆ7H>&SOt[lzWBNNLN idڭ.KMU -i j*Ky;NRBaZ)?.KߡZ+p^=trQėpZVø_896&۾%o 3I.L8#i,\xGc.^.h裡Ivh.oj.tNatwG4{S} ɐłQYo^w]n^XZL8l<: Hd!`_ݎ^Xw?bggRLC/'*>O:8΅<^ Q?ѡYo\1VjtS\!m"V5*`Os+/ؠY>7^`x啇[$[DRZ);\XNJ_ѼJIIo,5/^ҭ Cr8, TFG-8HHKq΅9g^r.*doPF3WΥ-A̎mp^*k޴Lvsh .fU3)  [FL~{?ƴq(Yvb|s щ]{քmls,&b'gٺr/Y F-GOLljQU 9)nW&l CMG8!yķ~<  $9 +Vr,NAٮtwTm3W[QEΊSJW8Q# }vq͞C:;co}Q g5Ǐ?nGO?~u:.>xlЭаl.%ȹ'fșzao欚[3]4ž6ڸ2qCE`%%`BSYR]c4O,L֕15"B멅(25/h1,|-wΗGh{ջJg9,X.C%He?s{8%HUD~sWIӏ[es~,_$,/i_cG'xa#vs=v?^oW$ߟ'}rHPbF DD&MܨxO rЈื+̙-Vi|ocթjԣ~͢,M:6$Š`ֲWu'0+ր"tn82<$k66Q'd#溛`sHP=H.^ʎyD+xQ봩u8[n8&a QF^L\Y4}?]OQͥč~a!P (%U*6Bm[ 69 ZcT}D,ϋ=[e!KƋ *n%;vs r*ddΔ!@ Tמ`Ȁ @NO|0Z!kjo a Ӫ>3,Ràz kp$`ڰu[A3D%1>p~ˎ{!ù+)NWVO$voר/"1n =AgFI1Q!N䈏 Zus$_9T1P?ȼL4!mCx{--J@С$C Y+Зvv.I'ꛉuˍ:mϺ?-EÄ'syPSw6]tOEF>[[&5&CƧ3Iccw-&4t6q? ?U獵Y V'Be &f4bsn.?mO gۏb/Qe(ȘЏ9w+2/[zMwɈP9{z^OIw 6yp`PQqc+͒e~`')'ʋ#[QWTH VZ9$~1PHfUSf" 5I'$)eQkb#E  Nf/o=br\c ]?|#)J8|.3aEiIH66s$EǺ}K҅,>Fu6& p\P?@,í1$>1,spKdbxh4|_J 6 IB ю*;P5t:ƞnqE}EeԜY"PK“]FkqQNTOt$1]\1R&V]!ؤSsSD(`hi!кMsH ,b I'e (F2>kW2 tF@ ϒ{6D쬨47E#o.doQۨz)>dU1]E ib hZLu\ $kY)Wog{DPZ\fU6r5NL~RI5K&3AWM Du]Ͷ(`r =L0LmJgKb+u~cjs}r@gR9q)@ z}G f#"` By&B '>K~(j.Ŝotp{*zΛjƍ0.Wm%) @4h 2ƙO="Oj@WYgmUnAc/ROL Alr%.^h5MRw|F|\&%[?KgMTGo# \;tT_}o{Y}6z˜s0^y:Fw;A}i?=Mw01 lASI-I̥cK( k/#|E4ZTyo[u1if 7 j!+<(<^~f'fw{^NjCf "RäɊ ?.^b4=_rg'oǽGA8!r}Ɔ ʁ]G/[фJK<܈4>a@ΘU%OuFHil{빉s#bNE~}%S? !nϨ>3`Q]ҸCjoz%gܕ d S%/|6fChF߽4uFK彂 cjA Y-#Qoy1t]s+yP,Y0yt {B} ^hyM pXHuHW8Na]L.~jkf`g<B6qGG҅&>YH3WeLETIoF.'! ٬nnze >{!;ʪϚԹ-W皽Ü>u]ۊ50,U%$X#}h<('=r4V;Zwj(-=\% Bo{i\]cq$,e$$mukkgjG|r q s.]s-a%X &?ّ,Xs~ q,!oML*r\:l<A)9uGlC w ١{˳h~ #DFn cȧ,W~XGi8߷hd١׃THhc'30I[dҾhZ pS;O[vnRq ip@˵m!T:.eǵ3$@کِ|&-͜C)g //$5U%1 x].ov·=GN[ q ^?VS HQ`U(ifO'6'vg'41{i))'zWbrȴ<P_eSpi@gSw~tuQ #n~ZkWζc#91gMT_Q<@SI}o`y@2A4gt-c Nd)44A:ϢAC*X ڨR<#,3Np0@L` T' 59#m hg0Z 'PAZL 󄽮ɳ 7B /<." afi/Ɛ^K4uǴs<+^q"&hyDs(?J9yBƾp!]@Y9%fFHn\fFV<l7VKԿCN") [`<6y[+.\5muwU*?-0p4! `b7H>{-Ts۾LQPKUG *ߌV&i:qk .$x#WՐ⒢[y:PG7j֊ex߀+Zjad2 e( W"T75:t2*%|gS8I:?<Ɗ!L %6=IMk{8_9ok}M+ cѱի,勚iAU:7iTu%,;N n[R`pqVH{ށ9Ϋ'cFH oHm54YSb[^J˿Sr#Ų_Pٚ-IDCtHD#Mo#’56͐\ֆ6B4b<<ݲ# [?ʏu( 60K9q9]_viPi:1ӦkSCՏ,N+ż PM$ [${A@ f柴jΉnʙ.F lN ]/ե-#t2[_a~$!@GfȶGےJx K|}}h91V8ۄVDxlkUW|>_aj=@Vf4fBX}$³xKnT$db*8nQGÇn-"_(Fup\t{WL-Xr d9@VҶ.Jy Jeycjk E{ySn.)CZޙ'.7O9"fv;W0=B_kkO'q4|D`ټPtSYs.ki$H|iN Ii.D>1 kpDZ~o7kݨfɜ _rM==OkXj"sQIG)F C6lP;2>|#4"Hz\l{1s8@P-+r`?Xe~{ 8?&.]7~UL{" T' Jj/VxçF^Xcn)2%l+(.@A έ*Pv~̭!(g腘A֒iu?O.*ӱV!L*5nhV>kq~tWIjl"L6h{* O2HpjUFm3˪dETIk5#HAB*N7 fq%J70D]wO>ty,X34Ę"K,oz/PO;׷ɛH޵4=lW澤PI¤[Zjos#S4 ;sNqT|9DEefAЋiÅ4VGP OI8/Ա^&Az<2D&`KT1xD'"$8\p<;fw 48яnuJbgM:J 1 Ϥ Y ӛ_04n9reZiqPK>XarFa)rk,SЫ6V+eZsgk x4)ڀn9œRt]y_ps"!;n"%f0\DD4SЋSw߲'185Bkhv7D!QBQjF^. !;[7 }_ictљ*ӵa__G sdۄ-ަN:YڮmC 0IFz87N^UKHnBXXxf9{GczJdP7wCr3Ng;ETI[lvWYk 8k)u49DFt,WQ+M05V}n^#fIcjRN>\b&:" ЫK ,=J}n'w.جl{}v/)\cJ"܎1&a}x1`G龽T3 ava;$AVA 7XL'5&Ksl7:2Uӻ,l@oz 2fٜ'w8BZYj(©lPe_er$5$~%[ՆU&x`)=.8*䆊di-Y^1&`c:$_WQpCiqom 0-L OlY[R5\0b 1" s*f?PbP~il52K8/lڷC6_`-_vu( q\7='Ð1So Xmb=ďƠXqTz 6~X,A OyGNV`cdJ^&6XrJn Ҍί Wɹd19E(攉IZQڊf>z3`Oskv H!@":7ݳ~$D 8``y)pn;>(rm=NǛ<2dͮG}[m[*#f~*E ݫ^ЪiOTPh9֯lG>^();BH]~d0D\1󔗟0a $3S ()D}T2>}}pn4̑)`#9ǶVz0bJBFI.㮰 hX&=㈕06s?Fo})$wA.dXJ~aP ?ptLAN]L }5dU^ia+zBݡ7<j4@YӮBP`E1*3C| |=%jjQ{NbLy 1a%MV)O΍oV ^+c@\JiR`΁BozeǬq [$NSp^gU"HhI%&e ȡI*a^۾!w n W9 >JoUiR\JP*9cd=dfSCCw`%*κsHA3Vm>3`ͰCx1sx._}P:*\.}}LlE=A ;4ŏL1'2`n<•ctH1-[C'͋쑫mΙhdcɡQE !mp- []a nsBowݻ%㶰UYNaBWӪ41(^qB+b0)rn*#oE m^Bx,mNc2#ӋM#?V'5ݰ1@GKkBOW62 Lݽtte!BiψYB;)6TlQyWJ̪XӰgy-MIPlTҳ iT>L˸tޚ1q⏦c7DH_Ѩ[ B}/Jө|+6y>Y5k+:p"~\dS'qHOT5`[y8YC?w*35P('^ĆwЛ&86R~-pb0qHZ}PI Nof1N0,&,9Ӓl Se flYy?mmrC>˩ f7bZD"F/khT!:c!`?ϴC$o0J ^&g; O)җԲlAr! M~΂?_Wkd.l1g;S]/?-Xʌgsg/@pA5Sc/cwnS'<&1AfN ϟ1M8]QI{ \kNW 'eH PfyK'`W8b1]72' R /C{ Jxgvbt- EŲ%a<a jxND glj/ֆSR?o6 i nX_=^/ BY?*5^ӁK5a~>2gH?-*cYc+·ю>w:7S& |/)5aJlʍel|+X?dQMz0nò\7ˤ_)_M ?=v[56)Gb?,Ag91n?P-Cqy[ajwG e?rؐ&~~4K$*&Ν}.ոinU8$O* )/7(Im %L=^}p%E2*S)# pҀ"@AĞ 9U+ "dGSw(5XT#q+Eygݺ?;۳[t8HE"7)<(1.SE7 A>EZ J~TzAOL=d ,KYnՄ,NnQ\m%KL])@~5JB4^uP"7f㢲MXg֙X7ibĄ{ې$&|(kO&LGw.렓3%.4(%~(2qm !U2ZK`h1EyȺ=-Z++[OT/:^e`e BuћGjsQ(4 0+]VPNVY;HctԂ=gO<-KX~֯s:j|T{g, EЀwgcWm P "ĻAͰ' yؓli8ᣩT@)˭wNYq5ljtf}QFWOf#RkjwF׾,$C"xDy P<7}O۟f{O_Hm.# Šd XKDqG(^LC@jva٭* 3˞-C)#Xw`N+wǓv i̼hH%PExt܅s[wKD^/:CtI~92 %Uw&@e@-nd%E+[Nm䒅eΔ]|)ZFbjiӛlKzȳ[lY>@Ks\f)rOҹxfK~Rt, DMG9?`)-<#Etq (}N?y8tQk]i5>3-Q&P-ܻ4l@תJ|˓,tQ t !4<s+6F̤e 0\^_w5g ¨:[j6;XCBYԎa'98ާz;\[`w9w0ť`6&\NO">` qL030%u8S{SYB!ʛeIWl4\h+",1q,x5JAn4v/ӝqjAlB{FxTNnBC6}ΏRץ}/\b1eoQ8 gtPKA#VSf1QC/Ͻ C'> _ELSZxrWNO&}?/fqPڜ$F!mU j(hOG'V9Oϫ;ECڛחgQyת1ʮX1 0ȍWgj˕'e(DqTK%Fy@L Ʉq.`ݐLX I8DF@C_Ὁ_yNΜT:R "2Fb6/*PtN'JYHb3hӨW`Ps^pEXxrml~$\2ҺX2U} CaToG?1.ԏp.4Jn6ѳnDri9k?1'  't]nNzꅚwn[[;Mm#za)yfl>w##Ih9 zlZperAA 7߯ͽ}= 'NQ3oO֛.p54ETxWQObU uw;@b4 {H/ xn ̞ |́Y$A}x)|N.;l>Ob%C#鷽uP7U'C^䙷ӄոS%uC_$8vHLG;~*A;9/!"cEa7}Pnah#Lcņrԏݯͱf=zT`ύU#4Ή$ܿ;E/x37{؍WBSXu 9aF|ɫw,qUP2"݊㌆`zUd]b:+˕ŽD)E'$#yTƢms- ]H8R#fuUԱp*{yuv͕aJ :=ADSGo voEP|MnXeV-kFppm$鞏]8kbV:G`<[4qbQ&8}_M#wў>K9$Drczǿô‡`{PQa؜:X(F 1E&OƒY 7S/7D#L^M|!pZ.0Ilg&8K BYQς@fWq>B2sU s.w[IM ǣrJs|{"c*չ|.Z.:~Xϳ xĞ(n­bŴOhZ9Kҥl琩"r`8q$ޖx|ԼvOG[ F7ӝ%aTud"SVr(wDTe#+ MRZ 00㵦>c󫉉+B9Ӳr5Z j5ߥ>nCaۚAtۿ錞}[[ @8SQB F WGL,.X?h#V=ZFYQ!+ <ȟu7EVUg:Nˁ!68J7UiXdslmnyF,\ 1f(3/e SAzo-v8ԟ_f2̍sy%bw'"#&TGp|/HP R3ۮ [=CjNt 3g&pfG9<`x#vdUr>A@VG[,0@BDe F6u[q3 )|^ e_/GnVxUS 肝B}CřH 2\61nG6U#[1qpq*2H b`Ջhp#H!f"PҩS+ TH+_; C΁)e?XGa3̴ %SO9gŦA=aS"Q% \:{'X&7CS]oT2Tg|zDfY-#Hl!u]" s뫋Z;kw#DDpIw IHW'7ti?I20VNp&)-d*Rw?uo3aw-> 1S6܋}$W߆[@1AbWP``#~SJql0+V-7bޚN-tWWhlύ"$ڄ݁;}.%~.+ÕB@vZFp-fI ]!R b&}O͉=e* #9 v̟(dS 0 Tɮ[ϒe8|u$k )sAY O:}i:Y4^gQIn3CeJP֧Ig)0pޒe?%JAyGy4PfB1#j^p%^P_i"KbӏHiѴR-@CrF,[KNma~PJ`0]X.9yXPȽ*@pPeNA '{8m9 ixVkF#1>䯝JЃ'X -dUT}Q Xf '*9z_qY1μ=ThKy8jF.SϓRS5))()7ky\k CD'A2G" q9@$+5eM7W=bbu _Oݫ0E1paElupYnIli%aUlEF^k(%6խ184kPAל&Y /CQ8UCL׷Ѧ HN"{ QNJ#MiRԶcdV1'.h3a#m%c4 @ Pr6sg+ > zUӽ̨ڦE!][sݥx5g)o"f:Ӡ89Q{) WDdݵ#K>jAٿρdJY\6&ZHñgVj~Z~<{.5[K98F\x;Je1+*9lϲ2JJ հcJ7kxfd .鬿Mn">L|;p0_*^{Up?~/&^vJńeƯۛj|^`]-iį:G0cv_ ݃qB@q\tѦMfTԦzs!М. 0uٛd~t4WޒOe}p TbU3)[ °!_WAP4\Rg#Db|*3jy\N~$gع)ߢCq,~(y3FSC\0ijaīgxSk PM奋ʟ|^6޽ո+Ph0nʒ*؈[oYte2k&f'cIUBŒ7U ܓ%H ^C:_Rת aD߸&9ɁC+Lj{G"k%|.^>*,%v+-flp CwBQ_{_*ћD=N,p`dTJ" qG7x zTxk<MV'kfK UL Oz$&^5q_~FUkyMeM9(2evq49io*K^ Np˟~s{YIJz?qnIkT^PMe1eu>5=^U.!!ZZE[qڍl7SQf£ro"AȺt慗ރHɍ!_8Džpb_;K~bٜCLB8PC(}4! ߞ"`wːqMʆMYتyN'~!M,`,}5+Rk4`3Z 3=I X S5Wgl˂/;{젪L$V#Iɽ`X})x&m@qkjRVg>ӉX!gL6}.ºwK#rX@SaM(&_[ Lpgpzfx݉]IL !g"Ozt GZ/t4+m$&$g@%& pa6Tbe:ܞOĵ9L$ʒ 4`>;]X*\fN/k|Y。pDHh rЉ3{S0U̐Q7HyU j\w\;ahYs$έ+'c(|*R ~`YwEk N";90KFaln0^nfDB7ε62JN:/8KC"у6W5{FDv2Ӑs})cjHs;,Spd."Eᵭ HtMf.J>QzPS 8ot!T'_54 hD$=zŏӈQډNH7]'Ò/tGdd-CYB,oGC'OrW~POfߖ+·Ww]%XA䕮D fh+Mu+'IF`s~P{f(.Aw5ܭ6q6QgkشvyvOPkJXOɣH\ݷ zVf0ft"%\xmsS$Ck\j~j~=PtGr%6C܀)QKǮk?IȍuVPJМۂyw owx]_69PMo`LPWܷ֟* *&ZO"'7mH4:ɣu\HupfЗݪErјiFbAju26)_D$D2v1:/ep|-۽G$"Ƌ8O!`)@E9TcgR^ +h3,ꆉI_%GZƚrqWF6lkygGD˔!=o4Be+DjM NYm{XfxGj0{O̼qJ {YH^+BIIz-yPϘZ UE0="#p"V]> "Uֿx*0}=-i$Yjz5#zV;H7״C Oޫ4]*ӱE;vkPy`YuC(xr2>uB٨JWAGW㚉M+"f}%s>Z߶*@Ԗx{ȓBF/L b_3j&39 vl*+꣟OOD!;p#XJU[mQxc]8kȺ=Y^ :i[U~ ULٚ=MW'`w)0RgU{f^ʏ(:1dm\4_ز[ce8sv/fDuPTɛb' 5H7:x2 l H9XDp50wsTjVz0,טA:GUv/wMl5=7ٛ@f?dzVr9(j"V9 pttМ鲞wS1#F]ǫ޽0ץȚQ)>KW#ڥeAUmf\Rn(VelBg]SV*-#'VϠUMnD q3eBEGa&I묜l. KPjւ# рF5`ѦuYꂏ%dIPVCߵ;W]i MKLGm5&+,(@JQن_2ZaTdK4=;|9Gv9}YU E(1";.̫[&p !AF,|`Oc uu`L.Sci0rEEkSy<ǴmAj!_c '_5%bX='Ꮼ*rԊG_I:㦘\[FSոp<gM"s%qL c] ,aPlIܙ1w6Y@6.*񓏺07v! =.C|O "RR;N#p{O> i11A(P"C3.z:o[):ˢP࿳tlBu1M(k d1"m,.8b'A SN<ځsY213Y4~3M[q[g)0q|c!'M즻.{ ߎ/lY$%q6A*2#C教f_d=Gſ1n 'E@LR9KҶgŮqߧIvhF_dXD3ESi#?zg.Rkqf];S$؆Bt/Ҭ ECu9H<9nR 8 YF0kAs;K|uP=#m;؈aO3sWS|N/x̣k{+CkeM[xcc0OQ#(  0}hyvnE0iOU3Qzi0[N%$A`"{ëzja5km6- BVcHVpߔ- . b5jI,GŲAIyh:*dI M|;#Nk]QW'|6edm{'Ӷ6ʺ$WU`lEDMߤ*E`p jn{&[FaUBu~-zjsAU~K3[+=1gD-:)2%p&@ b CKTAIcrы7a_ZTE_#E&/OdmAy _8 ?ދGzcE̔2r=ƒhv7)CfSXmĹ.L#]lqkYMb1#$^Fj 9u~h@3 @vY1 .A'4ŷ'Ӱ!/Xe3>(嬤؅"*hzW 2a3S#̃"^A46E0f,eɋiK*daas%ɰz*KZb0S,Hwdm½47i~I2?Szt,6!~p!h1 ۣu"p|c%[$A0l)%.O2,:^JC>a)UϪ`1ه\JOx존uQ~+Ioa|wŎ4`ILM~(X dl*GHyy543rtP8ԮxgآhuMBtNljxh.uVU$E5Ǥr4z@QQꒈi).jNK>=gOErk4 [@%'$|`e6<3( TDHGg1.3[/uФO1])?ETFK%Gc"m֜mK* ̸A=t(7j1] VP 5$dSZf>!_LpNWT$$ Oi돯dLO>xV؈X(kg~@ pf>9dvFgoY!Ԃ*JR?>'kj_ $` [r>RTڥo;C#7~N"|"?0̻˽o 2A-[ ib&*|*wM#=G;us1l0X_>D}!]],n>508(cS %zvvsmm/Zz tӑLtbǁoUf79#ӸU1x؅rl  KgkAX4>D`ݹb|1S@G+ЈoM&dd4Y1fO_^tQ+|e7=Pz3^oXHǎcd Y9<|a s8/Kڴ[Gc=fQo^Mo1Ylc3w1Hyݕ8|L7zDoeslNi;86q\AdQÌh|uZ7nTNJ݆1/AQD׺pf$`< f`/k,٩BL&$k#˞' "=u{t[m#/7i!rWVHUZ~Oۏr6goDG865R?)J6h7=3vm;KË=+$mQb]'䣮a$+@3=Ⱥ) r2_չ-bD K(C.N7,KGF<l]Hlkۄ=g?7$Q߰#w$q't3Tzɴ|pӐ֣X["qfx~Z '\g&?uy8S's gMBK6ߣL򱷻S^ؠR9jښ(j ,o]^w2oK?'xb[{r %oLQ%y(Y?y%LÖL#6ͪ22ӏ(=UoNƻv)1W6׻/>pVo/@[f- 09BLOV*^niz2c8n^`w^:Jx)ヸ{n]KAYgel ϖT͟.HOrߥ̔VVTNEyk8ݤRS^XYmr~'JI#2 Mnթ!SQGvBV [{>Ds}LaRXG[jB(AP)*d\UG=#3HYCx4I=i 9,{BAQlk짃5l (^.NH)c5hlx?6MBv@Lo=g9e=OwsE\EYvu? U-t~܆oS6;(0 -"5^g=Hcn;ar4=lvfgDO< 9Wg~k9)Iˀ1Mf2TsvA8%g~u9I\C')ĵHvWڢ;g+CbM#tY|wWtϋ'۵{C*_;8 ړVg <%&?Ce"DktS~7 zB(n٦brPA k>AE߯,I -һ1 9u^ک7WSzi ȃb5[*$!x{y-qε1zqr Jh=$>MQXԯ~Vl!9 d&_9Z`{ۈ;7sܭeP;>JQ ,u#q'.MnG-t4*v!;]Ӆ2!IvE_*) M{7 .Og3@)n˿گXcNhhyA0Z0o`2Y?@'_-1Wuc1>|E>l)LP#PQ6T3dTF} `z9a_n7vv7 ,Lo~zAԓd"Vv65ݺPwXU|j`NZ~zDUK{^s8 s;C}O=\f5)Α&f n{U'BvJXc9^Ö>];j;P?#W-scv1R<PO5!ٙ-8rh &(q- MޝzSS[FDUذ^ (({@Uʡ-6,%md2s^DH0mt5I$kʥ9 #(U7%@ Zf~hj/nrHr6Aѭc.L/7@gYt!:fAXNNE#Ԩ[8K:0#Mra`S x%O9 hb恖v|* Te%xtb%#uUV8\ : Ou#7hKDs=6\tacєE]ឫa: ЈO~kt WUtY7EBZXӦg6]}+nyz)'E)ܟ=`y R( `Q䍳Mm %ΎX{ry~Ÿ71KEJ`ZjTKRJ,)b )#C[CZZؿ8)PD, zCu e.]9K ƴ%Ǎ ]6/uY\yy<:&,4FoKkaC Y0WX̂Kw]O.*ΡJf@is12;Y*;\fg0} LmiBm7:֧u  WxƝ3NL qW|k^Rpl0)>z,;\ןv_%CZkeLyXZ |0F,oa>=E! !yP`7}Bpmjb&ۃr'r$b 'ל#F6yi_l?ߺ#>% qCW<yOMmBQRq$pm`+ɜ L)kԏCس0G>G/P݂;8YG;JmW IqخK?B&Bq+Ăi }~Q$B"1+CZ+E~ K0/vNiao|5xo0Hw6 =H JɏRGV39)%M(j5輍ƿb[ǘO9VC2(;%Áv)s.syp]J06x[̰w{Fm1.hF#eZUI1эBVDيfa0Y`QPv xv2YȀs/r.Bxߦz5zKχ%zTf[kQy6k#GVߥ47T?tfO|*i塷@Kgi0ʈ z)\X{ʽ*Ϥ1)qfDX>X%bf *oڴqM>[7d$M483vй4hF0YYN-!t:tߥKeoS}(9ߺ:)4%YrW7ID~qPH̰&m9J#܅k+Kdt`G`v % ;@;C7ܨ 5'{ws$vyce鹗IN ]g&S:՛3l8f}%kc#CO%E x2w9`e9Q)ܮj<ѧ%D{uDn&2zV}Q؇ ʨ&)=ݥ?۝s?SZj9WS.iZ{R豐F[S-o+nkdz_v!YxhL4ZN «}u؋/9xV|v]pgg|m?*lt[3?:CoN4DO =gGHyuI.2k(5^ڦpǜWCH$?/E}"ERZF{wv4$$ECPU;U(a]ՃMSBxbtu t| .0?[Rp;.ȟw(U)k'HxGڭ}*Rז$*n4g )`VkJ3'=Vom7Iа &mz F9.& ڇ4_Q3. s[*<;21?X\jBIMhsQrpO@4fUuSjTRR³I0EE"2YXAfhW+W-ASxxN";kSTt, r跛Ul %X,;*TqAAYFЁ"jg4 26Y 6h}mad#5f97U:JeL0|p!~GrQ%o@Ur8x7Sg1&B7ptIdm];+gq3=>|1l :NlUFmu[~~i0*iL. Ȭ3{՚M"pV9R\qVc4Iz2s:y Y񲊸,nWx P;ݾd ԛBƶ}tz5 $PiټI/-[wNߏ}gr5„qi d)u` @ P~]!6w'JAtC{ޣ:̉ ˯"]`>ZhOt~˦Ҽ%QR};_7@'eᄩfT3vde0%[W^X@J)S'N$9R{KzY:F9\DHFq/&jc+f-aO1E$l;(Aɾ3(ˆRӹE Dx0"kY}h^,d!Mg1%%ށ94Umз8z]C5AoG00_9%BI.)e?*Kb`Hf֧R5@ ̘Fǵ:4e^wr?ܭb9'S͜i e6XrS (o䉄X?z2Xj6*pfdvF@IA,d?+SNn-f-ͫJ~q}3 )0nJwC !Ǣx ?.SbAwMV_J2sTh̠>H5oDc]H-fȝ"($6(cT}"GŨ}B!q%[$[l-pAF jxو5ҤP]'7yo|'Pdry]6:)Tل{nED#s#Yyitt. ]u7R8z&vYOWSA3OW3wEB :)+وqC.9[xsJ2yV 1Jja4^x.  @K9NݬEYXRi>1(%"!T9^sܳOaG]Bo='C rd9ՈTY-g[d,y|0fnڹZNuL<{ 7d%Ҁ2jK&HH"j2</  Cl/ |2 >oW ntIч?CH d n_QY&Z6o˝or<ޯsȑ,CgZQQ5`NF!1"P.,2Ț%3icAKIAm(pX"B ؇T~l]n 90l8m8O֜y7;qLi( Gc1JQUY4RsDQ=zYПE AG^6H=ϐ_Pn+zz&6 &uOYjхWi'{Yc,0M #7ЍGZǻ6?7-p^$d^P&"ÅQ:TAi>!6a{+]SC늁L<}JrXC?ߢ0B-N4> d8ELue C#oy&.3OekG,N=s^Kxgof8Mr9=U >WEzs*6 q&ٕe>]]90g 8ÈlxZW?kQ)]Xy WBf3e|h)_-]ƏW1$L*Y-{-@}6=&ЯD/Z1.aHӀ |ur,.Ң@u(ߐh8A0NX[֣/%m_ُ͢P8^jjY$:,ze"VjxƃD!6RptW,Z*w:c.+sjgm"f\hўE็.*ã\8bg"ovyB $i(>s!L+ :\.jIX(cX}qZ/k;H)$DW1*[76Y{b"9(P4`:}od"iо@GlמVy" LuEN@n &\F{:[i3&;!r?فREngDS9{OʳAM?@|vx =4a Y}T BuR,&\Fe28~xj Hje }s$ ~Mg/yf6kίg5q9-նxJ+rx򳚲Snx 3[l'z1V^P0h[4W@tàe9Uv8JG RMxЄ؄NͻvesWބk.$&)'H8YNutUIcD䠚$:,ﳤ? ×$WS9P5OwTefķ_b_ߔvy|egAwAB$Qn%OEG "9Pij +4+ }Bsx&$P *cxGjDLXFj>ja\.OpD:>`=w=h;fXaowpzʞyMʈ=vA.-#ë'Q_1 @>TNhPTW͚"J"&XV- "sڿD1 -;atU7 f뵛՞MRQb 6vz9lx p/΋"3 +>>-'SY@H,R]6~f ]yջUI},2acnRէ1b 謒;Cy`"n^8k?&$-\\}( .f]P! fk Nf@Xkx(rda2a0:f(p90V 7#ntK:` J?dh2!`PO?^!RBC~R0da&qB TΥR}>di),qV"QgşeΘA".NO6fJB2.yݟOº^]IZ޺ga.ܧc7~q(Ya XO%W$ȂR%[|Dr NkK.+lS[+?-7]E-:}T-Aid93tvI 8pfQ̴:ABLaS=wThI,7WoE1#41óSդ4K0:T` ЯBc7Σ n,nԹ4hkUj}5Drӑf8LFR-W&7M2p>+NCm~^3 i}sO uM,qL/8I {N؃]yʍPv+@#$4Ee`] 㴲P\U fZQBDLzMHz:2$ ~A܋2~vrpXۈx/ p.}sMs/ P~{Ng\Hw+TڨΩ[ҟy&> @,wb>",'Mlh"$3iv CQ(axM;ӕ+$itr[ 5g_B׮ϯw~KbDp `c}Eu| ֜T11y S3 _C&ɫ"S"TL9TE&G htL ՎC+ltT}'+";xǽ{UONK!3˃sv{Ё6'VOM31וgA==pB#@qnkvȕH#91[LeJxvrdX޿  Es-y!hƅ2K@r*3{n,9I.\oxFw@δBq% ^oBc~ *ĂS%u4!TЄj#cy|U5ӪtVCk@+4 *iXZ:XkYO;;QBS)sQ1$*I-בM4G-Y(.$,}~h "5^ `V ?g$s O PB?`7Ok33`4w>%KkpL0#Ӥ?\YfdaI֌ywlB?LW2P/ch\8z96ŽwpOFr)ñ j |=^]qQsa2P OȤgtU,ub!::온p9K*D~Aҟ);aɠóM>pDׁ8?,nl+/.]˃d2SF;;UНЌMЧbM܉g6JbxmqŸP^wzd4p0 KW0GDDm[6LP,Ґy(Pa, PluЈ?aLɗ<@FXKU$ۯU)=pkM-aD5DYlL熷AZ8l1a!0YT>S%YܑOyA8' YrwnLVHT'@q(Y|s_:6cq^dU U̜PDy9,䕫&#uqOf޿tQIE`1{V+9\Zp@t=_ȸ2!l.uO$Es| cTR-02ڒ-8m*1CB'tynWHRTD"Qףx ~q_<$,ءDK@h"*|srM  H +?!J" TDJYY0VXЄ00c'QW 9,mwwhlV8b&6k{)]x^)$#.6LZ7#]"k';E3YFR--Q.ziZp|38.kcW G&LPvniKi&F'Syu,[W}ϼa^k/k-swPn[%o`loz8# W!ry& 9F-~81tr˟uaڣ>Hf_-GmĘ9|t}aN禭ô|(GxO98]%R $eLJtZPGE 2ӳlک`HnÀV`sNoeIȄ̸榸|V{*w%5j4݊fo՝&VTOn:I?elUJeI [OG9 ,H ΣX84]ƨW >Gw\ʯCrf8BoOkTc PfgE0`a8CZFۭMwz`C=`z~.xgyIz9sx]A8S(D>ҵF6BL]^-"Z| rFE(<(Dt.CԵɻY5TA Y \6IOPC:W0v*%5P@';Eٿ,s3$9(,lîTwu¾o-IFD$U'0YQ%ck6ǯtZlbv9L :]ؔNB( $2&蒀m:L5Lvlur:')PuVDXU='xl/EDܶC!7J6"DV;|c,fCeHܽdc]M}1""R=4Os3;NrxZdSc-a83 3JN1I.0̪{mJpQ) f,oBWR_=wlgqhܙXſNI\QLzA_Ӷ*Ti"V~UDTgeprGwdVF65fPeG=sU'14V5WߍS TYTR0k 7c%33X06lkˍ?7KַN3R4%|.E5m T݃fC yTfT#'F`eхc֢2eCT6XhZAM U$\Nz!043Ŧ]*F;pT5S"rkw>d%GJ4_檃$fx33?$~XLcH|_CyO)`B t*'KT~3G"ypJ?շ:[:9,n_8ǚYo+z^0yE}M9NL0hL7\Pļ!C^~"w*#tAuźJ}fY%ӿ`\yE8~G˟qkNz@!P*Ԟ<] m <֕ 6 U^|b)>F`?&@ZD7&D>^y>{5P>_s1,D#4 :4xR9_y8u?`T/ſ2Q+>:)K-DûbiI3>n_ \>ͫҀX‰QDJn2%)|Vꋈ"tqêY66/)u9!qqmʚHM@aV6tgN1kD˱d liW FbUPQ-xalOO7ZWT UI?\B'eTzih9S\KBgDb◽ݑUE)~Vsf< z i3E9u~屼1\-6S#Aʪi[2LrYh_~X[t)7q3ܦF &(gu"f[bx)ضIH:mBF q4"W|!⮥Pԟﲬd8" p PWX:IyswTS)nT}5o-UZY3Ñ(Kr;):CU?Uh t26%R"Ux)gLOqu;1=qQKWNg +x5"=P_ytQ)), Y䌺-(z!qL$#7DApI yj.cy{g7 $ CuSyɈ »8>(e6N& ZaN6 +8xs<}~dQrۓð&"'AB?0".m55 o V%fÎ߼Hm/T1 F1`dMJ-Bo81h mj* ZmLϪ+zIiVm: y$½B?.5I.ڀ:o;Bp |瀧 @>>dwȃY7iudvv$!@i t0zH%{[Xoy'r)칀`!bLTם`g5Z 6cqT)9I#@^ H3PxM2KhN0 |z'_e܂&,(8H^.판ْ/. c׃ɸW 3>y2A+74t 4q SΎlO"b [3F ;Yz2oa=͍~U8Uaeuz0V"\7yS'`čs Q~;ڱXȢn.,Z8NC~GaZu yOT0FSHAa wiל+|g#{\KÐ.>xN QT~e_G r?K_3BW|%q#W"g9&)]_ ƆZ^E2 {MU!hS.ݘ򷔍h3Bؗz|U 8Dt-:H{]_0A{(b} 0ZsmTcx}n,{@1$.|#魒R.&:0 RV!R|CVRHŝ@d+g,vıC.n+Stla2J)K-ܨ _Z ]J4DX e.By*Dί牀).<(+vn*G=^>i l,&v9& VOj +PR{(b0+.vshq.*ՍCu8Rd._˄Et8&C|G t1X,ME|[\5yDX,ʖ/Wuͽ\b'6 |*ہc}"Ȁ5(GR# H&Xc)X&. aջ̈́ϵ)vwl]Dc+ 5-TW,4Vˬx@^څo'La3𙧠ZSu*A@3iVé0 o%_T?z$#*kHH䬃1"kXod :V1>r?DvDw`Pzr\>׫yck {LzNke)kUfV.CJy.D7dX>ZSNl 9!~nrKv0X VTjt#z$KG[zTdm0̙5z^xl(l^!Yځ%5Uu#Z:LAas0%%&DJKJp!trV=2q ꩯ:r{6 !r`i/2{Zf "v`TR-l3x[ x:$ 㱖u vm?qt 0ڤ̬$.e)\8F1i_og|$4ہ &2r pBc* CXs> f1P[HʔjTlT FfmrA:^>3b\0P\0 ra{*Qk{S.}~7遼Њ›MsLo8xb}paS$Ŗ#ֵ@Bo/a^BB.rԍ񢲲dSlc |+}+s>l]ݶx'HP0|Z#O̞=`x wo3m*(ILuOƄlg#9}$ o`S*PSjI/ qAP. 5's?5?A3 pS׏*㏦&3قk g@Z}2$qӑc+R Y=yiqZ,rﳽ%u190* [I|.C3 ꐣE|;$thrUQ )jq\׍}dgRWP{}$ DMyhZ QL*ظtaf-ѽbߡA˼?Zcc8PV52~O:/?;SНM¯kT<[fDˆurFʚu1y=w׭;'SQ3УQ>A@6m e{3M 7D.DJuabC앮J_F)зzXj 9v   A(4póDmC%:\ƣ]&=|Kbǝ?xE}ŶU6RbUdfo!;WH2wL xZjߪHDV;E5 G@I(̛MKRjP.X&W3"N GɕXKUjS{')E1@ 0yqжȓSrS snCm>Jvd}$-SMf-SJrtdi)wJUO2qɞV% ?.ǰK7G% a}3m+!U U/K;Jh{V ghpRrs喁s쐋ĩ 4 dUv(Of?Í*ER@w )~iA}<`E^nS [|ǩ\~kXj/<=B/8'.faRtp]ȒKW!{=hO[d e9# L,!&M΃`$>qE Ib6sBdxiRCij|BGAJ4|)5KMia+cI9cp  fl( 9> 5@6'ޑ@8-abasD0s4=Т3$r'v?WX/)-h5osy!)ϯq_ڷ']ҊZnJcp8,}@*(/<0-<o=zɆX*kj.w=8\yH&`T|r3:˂'tfqKV<&Hi.ACʡkT%BmSIlY-mX 6` 'Irjb=t p0Tg'e ǁSIy3N 0gF4J#zl)`rqTeJ[%JўqTd,MB3XrYz/lVNwˠ32v5q%CGp'Դe EI~˨ Hk߫|.H7lj&U lt66SdxD2N5`&huY^QDϝg~Ȥ%]U!I}-m_ H)/QC>U lLgvu hO;dK9ۺ}@ ;xGv9ޅ%۵d6~ڧa֊m1*L̘ 5'ߍ S)U_Z3eьN 4K٩b]ac M>/~$yC r|I, Qç44UGCr9{kX:F7;yOGvZ/eEHnRI+?؎b,J@ngkatiy8 nNHk6۟6me`6L=\xI,ӛGⲮ1E9,7G(eȀVV˯W/AFͺ{Gǭhˇz[E0DmhQԟV$0f=3)[٦ZkK;A!6ubiw[Y$Ge=8O2dxj4cL8eH>KbS[S{^rlڍԥ}y&.TE|Ռt|lTGV]*7`,5D˟;5Um7OE )4t42_{bll2'!Pƥ&k+@?>*#p/Yj;jUt 6 ǔyſUB xcEKΙ EC"gYC x"} j.)/7d[NN Z壮ǡݰ _ !;eWh6VoObُ_1H0l\3j%4|!=s ,۱ TSYj*nΏ/&/rI+ vfHʧvm">Ĉ bEqAQtb9%-)uLs=I z!Xn!+.NC:h~t,@}3Mϟɠ%y,brBXygMyj x&QYڑ14'd:5$a͔hV! G' [7Bn)Ϯ8K3xXrD |?R"=\3T-6j8'OϜ˕r(e-[ڕ:X(B8QT͕|SL*=J,Q{v޽]7 +m aVy^m[1 |Eݧ;md[Wi~B-K{C.X^Dlu1ЬX\q^H)>-*v3ecȞP. ,/KUᬖ!;T%(V9Y&\#w} dJx 0wz?>0̈́CVYJalFSMy2C4̮vdh^Oa 4U3X0gC/qJr+1S<5gzBxVUrV9!:Cfld;"Gj^˽Op!6ƉNƺXR9@-ROɹ;$뾺@*N6;F{[g}ArgC Y<~]Ai>Z6 v-ݥI+?}Krۊ_JD'M.i.KC6iEϺ}p0ypY7\JAɽX#Ҙ9p`LtO l: !QRsBʍRBj)8R JnAx$MnU|cFt&ZĖ­s9@tii860 jQ0qg|kXUVs=Z5ẚr4+R0huR!ԯA Ir0%IEřV6B RZCU/=bfdm5y9;` K~ijC~i 7^}q9F]Rǜ ?zkV`r>-" J&П*+Q-竅g:' . Ѽְ2Ur8Amg1`?zPo!kFt~qFq#mW4O|11np#_(˅ѕ~*'uMدՐ;v {Ш#zDf=E"xecM;7Ti3^O EQ"]qV.MoibteƼ-tة"ӵSXL<Ű0ق `b[>=g߄G& 5/8LɪoI{e3ϱCCЪ(QƼ.cX 6K T K7Rͽ@PngnUVj:-. nP =*nX` jI}=͈ mBJIlЗ.θ`[|:46ȝ~Jur:Sjhx㕨|YmH)ZJD@UA6 (\HLv8+w/a0gZ4<3V5rm*0}_I<12G5Z /إ>E]j} E fm5cH+zզ`8+ԃȷñT"rrvB#˕t6g!y{]Q { Ɛ{x7\XYpǶO'}aϣu -cD50 ˷m~,%wo-*H˘%ls/94SV3ka_(\elvsR@#_UfRDA+B"yQ1)547.Z*R,Vqi;dS\>{G@vOUd1#6Wxܧق"N"V>@ŐG0ʠW(ĢL `UD?OV;7LŸB3nˈT;ʎ9>Wܺ0؆Lard喵Ԛ Ҏ511q^˛Q0xA;]o x;Ψ\쑲$\==1|ɾ2<쩚̀ нZmK^0{sE'ܦ⻩&n4PTԐwV>\,t$=d띾z+xGPTiyZm eJ_Dr a6S\p&B Of=4ga bF&[M6RLA2W}9k6yEOhVzK0ab@!ߟh¯c_l 4UCt+ndcS,kpGqg˽<`E"A(Ctmj -X6=z '.;\bI0@/#x0OPI0&$+;dm48 UlΥЀܒyjҌw H3ZKpG sA7E:49E8-6%@UGqY``zMBs-Q!SQ=S$/kT}c7kPfpiBS $(x];ܫ/Qsqb'}-D-s0%:,bYtFlc4ʿ ]ˢveAF/E)ŖU,3H~q404tإvxQH%T t|d AOi Y@]r z┻W CYcTc E≵ERt!by֔ϯ#V9nu`p/ :|g8L{--T !"q.?P&|1by.Utjl Tڭ)yԑZ-:yc׎*5ۅ|"aEU~5pqDxĹNO}d" 4Gz\;=,ntRV#X oQ R1Q)OɖӮIͭOD BՂ黁8MhFd9thuw0xl eRP7<3tqU3;w!ya舦8WsuBz8fcYtRt!i_1@lzc3;-I{lu·VK{Z7yj41`Ц2b[,'@z1+ 3G>@xIa]2(E$hױŰZ4/}=_3D,ʿYb!hb1I-z%CW8(Am  Q7b$&$+fj6&Ecb~]˛n_%l%ǭŠu>_*׆wӸ@ƃO3 Ua"xe>>(#47dz71?]nkS[za./r5ݵ% wdŲD}z1'H6(4 ЅL(ߍ#'66~OLfÂ>fx=oZ0`?л/MD[~m9 64-w= oj_TJbB_iA'Yuwvw\Enw&6+JKe6,bm:w 8GS#$q_r:f%&T*Z+4U2 ꘳f5ݤa, pW!!ŋVpS$*byrr<ѕM6QBIJ?*gWٔەޠx ]e}T.!* A+1z:8VLGhǯV*%B/Z5l[0Hee{%<߹+f?mnh (7Blu'Fy v!OXÂ0J_=:1xlyH!xK讙UЗT6XԆ\b09RHZƒ,]B撦?T@LBM</嘱ʉ&DO5Zǝ}UAuatf0$i ZP VTg;qa@)l[+sÍͳ zvG,EsҌ38s!Bi}8{NbԕVQȼ{ @9&,#Y@6Lkȋ<<˾RykvA5=ZS/yZ!r@=9@B|[^#$[ piR;tFyf{vȞMYֽmOµ34O.ڰ^E)}`㢤jX6g?—@}cڔ1 G j6:]sB}#yWbG5I~}"l^@28J #CwtAnf7&दb v:ɦ#{HV$v}+5M20)*"[jֺ`wSf|3yjE&y@mkܬ$UzVn!)L;(@ Ht5[$? ^ @ ToJ銐/hxgDI^ ]0{~VV.AG'ƩOgeJPHA[u7 ܳZ=tiץ>[7Ko9{/`?hs0ZaaPR-\9="{ޝ{H"ȹDVYKSNm,'IRH&Cix(T=Xu#8R:!'%f+`?/tF\Ab\À&)ϗߞ5wgdo$#:rH=ǐ ָ|x^jKCd\~#8GYh&nOj'0e ұ: q+"$o=YsPR|,BcC2_ ʮ +s6Kf<CwggU'g :Jv#CsPtxM"& beGGiܰA> 9Bi/l>piE_j0RlDA3QL(TډgUDIdUr#K$x _Ckѥ|P: gg~_VĘB?K.(,zI[:uΈ xwB9b{_t,S[61 !)`k<=M#ne׀23ѐňbnO&xoZo~`<|f s~+nD)G܌h0^$2O+ F )_$}#Y=n*$cxűO'R9%J63HE^MgBn3>+o[+GPw!Ļ >:JȮ4+ Z Gk7.9O㓙f"چ\lza) gc ?bX'X o=RsEΫS@rV< Svx<ĵ_݁Y> RATǐe!Șӣؠ~B?.-RfQNL}Jf]EGKD(^‹9dJ(}vK$ۇS " Sק #N"򉨗wRUsȦξ>ȕ)`.xf~.zFk=OeDB:39Cw72DؒYRC4C"r.b RZю2: }{ fr"cZwc,kS5O!G> wN?q=na#_Hve4raRqm$/͹UMs>Cy ji͕LW *FgJC¸?O/L!"*z(N<>ȭPx biy* ذmcx~`;}moЏKp:t w$һ*;'jgR8ճXfΫu ʯc5&X( @l@MXA6e !ACvIMlq~9v۾2w! JjcgSA.e3X"f0ٲdEU~t8l cw(DfG/n(,!z h2mki QsZ9* Xg2~Nddc|ch?@n;&ggQHAtJIx~d| Bn̋6`zd4tDN_S]77:Zin)!̉3.55O U즓h^kG`Ekۡ;񶟯B9C[۵"E4 MS[ l:XnzLq e0=i/wVӉ/+L%s,ukFMu? XT]+]Z"7]@LۦQ'M_E(`>)+> kŴo'cd X@uVkAC[EfNwJ@5c/*$ûA MĔG?Gqz`! &i!% `?EĽR_ ge pR( z`!ZA¼*|hvlsâI< u]h:ٓpXXR~a"ݫD9ىP&:X&Y9J*0V$C!&Hehgwq \{Zeaq1e'DHN| TjϷ}/,+hIʱP9&&[np>n2vI$fMPIp·v+&~ZS{RΪREoqc$w#0y *C%7ulToGBh\8y$,(7lw;l&fb6 ֽvr$Eej}ii?m^? 0MbS|nT@DU^FF.:؞p[ qi iM >iR{ā=}J}^R!$tʳ~iI'əӆ%eBAG{XygVk!zq n8 OhŴ0h'95^ vdd8]L}!3tc'#.kbTf/}aĥ|d/J+{Zdw>@UlFK. 6В+֥<>yISw<K=!Vq-gc .W!/lه b/'w׺K qAØ|aaձՊDh*9?dmL>k\/9 3%G]LKhP 7vbK9}LϘ &Zf&]ZZfkj۹ 1C,c')ۃ'?ahMQZ+3K(b2xBW-x< рbј`.LfaMs.=[EReoxE\T;`nBlkzhZjWh_ MZl̶<- AgozxE /Ԭw a6}ӥzFC2 葜tBT/Y F$TSaKi/Yu2ȏ 4u,A52ow)AtZJ40s-^84%R ;Eo(-SjkK9C.\rL)!J /Gabd̘uiԓVF,iz7g$9NL!B bd$m7n4rC>s{$ m˞(;`6 0ǟ<Yԏ#;.ZXӗFiH &'SRux EȐ=X['57?? Y>qqNⴱ}(W- %DlOߘ 8A_g~C 4|#\1cO@hZ'(j=/?TW?!Z,+N dO^ Ʃf:lm46vg(Cz{>[rmW0Q͂݋ 9; t[hT<,LA>批=ILfߗ20@>!rCݦsx`:<O $ۄY(wMo4m-tg^aaoeI V5Don€[§aK& vl||ʃx ޣ^26ޑzEc{o<KZnސ?9\{o k6{xB5vU&RXe7k*U80T!)[iLY911FKSRq=;`HMfrأ/+'ect0LjGZ:S+튔%CU9b=6de--`/a7j،h".A (vw@Z"&p7,j2| pWjT19``S4R.qjDMIy8ývwH(ʰ_ܪI) xfPT V#58 !K^=_#n3ZRB!0b r"R&"өȶu} ٰV@v['-s+.'<f֥ƃzQ}?E@ҧz'gin@+QyP[*@Б 9SMi`SvS6'~ /BS 3K _N yBBidهjanZxKT{C j2SA15W*ݢF#T]t٪6MUYx([+SdB@ *U>a2|7|Rx8Kxga|xb%՜<ӜL5uh\m%!e OǷ!HkL.604q26iQ4$דzrIyZ{ #50ذCPě7 yhŬOQ#IC[;s7~Wl.rЅcz@MQ7âKIu>;_3AvCuc5SK~^ߒ~a.q\e^WJ,YDjnE[\!W蝗MoC'@V"A핫+A>m 3J1f6PSnRw1cHۘ5j>șCЏy>ɹۊqSJܹؿŒͭιa! =p;M.} =rsvVǹUyޕ:A6Eu!VJ!' QÍl<"i ;f{ O^3nQ]"og>%\diYbb~_ T^a5M," ryh*zZ=PD=-XSdb;:Q} UsFE> KsdO&}-oHӟܤnuy(@1@WlxuA(2cK Ο=ۀpO΢v\kUh}TX?EFjܟ3\GYqI[9p4}3꘦T@_½vf_dk1z"$B2:e?u1WӪP?xul!ݬ|%ZhV L^E<[$`')Rb;$@ȅd FogGnqf."{&b Zôֈ9F ҏٷ %J(mԆe-As7=@욇ѥ|ʒrǡ=)~"$͕OpU뿆hɷ/V_TP!'nఃfG g_H*[I|myli|9vp!SK6Va6eR@64:g{$ϝ}ٿtW oSF]-{n#j<͹!箔t0y YN$>A)8BOKtLf逴$%edk4(~(,e?lll#O/D` =@g|:r&Q'F$m˔]2Lh>Z:4N87OZJsb ¤ί7 N }FAlR~XС?xks29˞3z;}aD};K*=RlQ(~`>օW|^Z7(g0)pz]uC?%_Z6,MO5?ʨښ#;biY\7&P ޜq7*LHP^[#G|c#s;QddsiJw{̥n}뷮^S)r7TS #2%0f&RPȪ%j19*W_U) ?xK۰TAX,4#. ami*9aQtp6=d^{ѫ*IZvbdAg堡7k; GdBk&j@O鶃fWナ k8R; , ŠF$EzXIU &|>ଏ9ڋ@o4gN׏a1b ګ)c3 u'o7 pm7éZ}` XMfu-- 4mSQZON$܆y33.tMWk$Sה-%ƁBnTxݙDwM33o+5W4W`աЫLPTLVW-AQzZ^ZWecG3p7=p"3p-MPץ(NF1$q-#]NaQ.6WO /h. :tjQQ_|8S>D :yg˘ۓ@Uc>$Mft 㝱\N#ҬKKn;j[kU:+ F_Q!1Zm_y[\_s'4Z+E}B`!m|QK9_d4{~R*Lc D2dՉ'uL,eouyUvedPHT$gjK[At{Z}Ud:P'',.غڹ$iP6)vJ8=9;[NOiFC(-'t&P=Afs`skYnzx툛Ψ 0 `TdO]]M}Cؤ-BrT˥ΑbE*WkXbDzbdZ[ֲlc,?҆ɟBլ4MkX^]U$=BodqP]9ATidYi" h?Q"QG-@=_X?Kv4w;)xaJC=TOL,Y;rW;اdA#z}p f*WFz Ҟno-f+ E^. :yÂS"W! _PLP˰4KO7>8Fj^({9w!ŻF@_)XcLX,'{!}וدW2<^d_2H&Z,m,S抛ÞvqʥX࡯E9Vߎ1dH@cԏ0dMHA)Ҳq]-_ՖI:"qY·=鋨Р/5/}y)wKA5O&p{ }ح![-,𥅾: x!]&Zэ0<*eHB0h#En@~nl\1VŢ1C4BB(7L5r絹\C2ƴ0|0gݗU]1ሢ%iF NJ'M/ggq}Y1qP^Ņ} ;QMwR+AX7!df$A5==~=S/O}y'lK0xKqs|8j(SCQ\۬ /PsK{jDoGjrX<ܩyYb=F07>To l۔!pvLMà+n2C21 zYZI~~(LX9e\L dv3bA7Z>ѐMuӞ9Galȕ9YU^ HDFW`Lq_afDYGg.A;GV'VjڊaJ.cj/Z 9Vlxǁe6Zb83vS0KQa'a^ @:ҷX~7B6 V߀p"~2:!%`藯w!rUNllmaJoU1{ԅ\M/Px(V j;2n ,Q>c" 5zV57 1R2bThuiU9 Q9Hr9 `)5k=NҤK\Ќay9D=ىIzCDtҖgB'H?x-&Gx_~\my̒ zԱ͐Ml`L Z&RIC("uJΰrv. й+x<3j7~ش5:x$zGVYa/y09*5c'Թ魩an3M =Z^~A 'dʊҡ j|f=x[CQ]ŊZlh- Wx֎t#>yXLe9^5`LsU3ml }tf yVle0nĜp6cFofFu'ɄX*M@hh]Ĝ f)sLȺw4@+gD8;sPwmxuodԋctO .UI^PP~( B4Ljv(gԊf/6{Qs@Z䙸3P}uj€:O&K/!ꪅdy`sFWG:UeC,S$J(=;GI7_:iyrrLqN4*/}y_C S@3dd P55*$uKQ |Ae0 ^Ep^e :#m$ b&PpRha<xSwսzѹl, r P!}M 7,LRH\j5Hm+D.t0:lNcnAtOF"SXqY5q+QCnsQ_W*Fo+Y!Ts'@>/g:.fNR¨!Źz #llm޳4bme]Ω,6?nO 7}Ojݣ`LUfһ!ӊBzQ8}˻7)>TMcLC l]y T3VVvVډ)Gv RdOip"[iQc(Y׈oqIbuWQq ωVEM "$ȴm,YW gΒrivǕQ"KD.2)Œ[t7b:w[]~ `^DXi?dw~~NJ~֯t3KMA5XU@+0s7XڊVo:ᅆkn\do# 3)N- POF5ز_:,,4hl~. aCp}f`t{8FI (83cRVjvX5ހ?xD=5ӕz8.!f_y?bP6IU16!G $a?x68g[VGf),̥Fԟ*D6q kwL(U iO]Ի wf4q<)@(G˲sYfiY⹓@܉p281f*?0㎡M}[O|gigBVVx wq3PNhp}ug,OqO+?A]܃4yCƒ,d Y=eɈQc.eILk=^ۘ># T?,3)L,cqx֛䋙b3xdR6ׄnS3^\a3 ^-DžG,zJ ɣx~&[SQ /} ^\AZz"dzHxurPVK|d1h GR⩋>HfEM1Mw-B& Zk#h,6 soGUBp~K רՎR0t;G0ЗG>d_@j#"3mC12Tt!@@c̾a am$'c> 3 o2@FJ9l/9t2e>1j/4Nx?SEYV='p#ɠwZd Io}&Yz}$ߴL}=,|窢Ȉjc]X ާzhϿ 8*D1 շm^74!yuZkm-93# *K7. 7r]دs q%}8"a1Ҫ@vGۅYW6 d8퇽!_Q[ 7w9t4pybWxY [ b==CoX}L (9\s8Y!vH8x=ӍX+an)mkߖQG!x"ݮz`z- oev3𾼪m3phIyLš vӶG )*4Wu|ZHiE47 )-z\!9YՐQOcb{C.kl2feIx#w同1iJ^ļ̝t6c ~ՋO ؑ#K-\4D3Wiv2vI.{Iip6_8m'X1*`|!fW;n}Doʷ%Q7yZ*AamXaǯx=nL8OW*ANX_`(mLSmx>3 20g(j2q!@m96S,m>.^c' ڿ`EoX9hQ|uW=ș*@+.X'wvU"vko:?7J=p:&?&53Q,z֜"F[-ެCLQoՓd N!a˂sPuA )]#iy~hj#fMRE)$"]@T D()<:v4Ll~~3|qi~OL a}>FCza; [M98;I~n/b&ys6}KWVCQn0nTxv-bIYˎSu|?DOLR l֖Wxޑx,1ryS0G>qbMAqt7^`Q!4ͧ*н˪EP &H Д+M|3e+pPZ&/NE;ڑS;RW&th%H (J<} y>{FBNa{:ÃZIvTc`h> 7? ^%xn YLcяGΘ'ikl{.J 0JATjݔcjտhwF)O83kd4(^4L}g; B6e$-P\C]]RAEBE:0eiV) '¡*4XG̫Pp`j>Rx&"DzVϸIocG=1W ݽ-fSqܳXZ["TE%PG$kd9`eQEeח+4yRR7g"mHYbV)~f۷'mC F|Nc0P{OuN!<ҩ4gG[m*UM Z"gZ!O 02Wgwi "A[ :OęEúA-ѭ/ȟhdLy'+$<gL MwY sz6y{iY ^:>!q`_C5@o]\090}W#X̬$aaa. q3䃿ɒުKcL *Xaݕ6 ̵Kp'q}aeJN]ߝ9H [Y@^GC˞Lg;g!CI3oAg`G-w z.^CM+Q=\l81bzj|h&~[ & _ \#B7ƿhG *V)HŨq{39/o28T>_GvJ_~KbmH4N2lñXc7+Oes;BF--^h!3eBdɺvafEw/!qzv͆"@^+|M?$[+‡y4w۞[ޛwOICj/3)>G n|1;@z;C S?kCl9K.['摈؋st ןP(55.  vN9KQ/GrAst7RyyGO6uf_kga+8nm'u> ~KP| u&>0E5 "~ BfP^8^?JL~s*B.'cFQ޹ E w["w9eɫ"'U૾#= zԠ]A{H,Kr-8@ڌ{bPL9 `[z\g펨]aV]+{ G,F@ȝ gť_R2H/:[u눫x+9t{F|N2y<թ٦8-.l#,YzY큱{@gLQh >p@ë) MP篟XNMN5Jի! sww̥K|)uIst}';xbdױz#1z;.ƀ+oX;p kiHAþH$)µh~8DTI(ۂ[rB\2gCۭPYW/bfNįC;=dEIl"Мl㍖vV{5t -}5nqZHs~UltV|Nݳ@"5 OxvFѫZHP^?>>lBaBXv Ή30 G'P `nԤ #^M}~Oӊ* x t (o(M&8KlR΁"_pB*I%4v \ΫMdC g)\ eZ듬uB OIgX2 1LDz^v{^3"Xթx.jEK-̄Ӫ_y^URT~Ų %5ԕސA*X.|rgm#D*̰Rf#h܄d8FQ2,R%SRQ{AUݮ ;zۨ볷 Gco`_ v&Cew H$f$ѣpt]h*GDgJ*I^~Ndg>ٌ]QGmGMrH[4ULB۹~fQxӑ"ӐBo[%ghD=()g3$Y]jQPyuyuCL$!F c;Y|?Ni;uUn3ZoY,WbEiwjJ,.7_:$NsucѺ AOe]iu8Ӱ-47eÙY(W7ȻIC\UVȇ.+Ce\ X U$~\ߩص[@VznŊy ~Yx||)s[.ms  ᫘XbAbj*;_PGy7/E .GXZȥ -WJЇC9PD2GCVAyoDF)t:,XU _]Ga ;ϸ>\]WJh_#6RPǔk1 %ߍ2P5@tI*,~1"oOδ|ۃZ<,Y{0ӆ)@tu \oPAá8b i':lKѷW bXRs>!"FpN[1O4h)qojDm!7'4A7Ls8onˠU Cw@x:0x%eo=_/sb lmAoI/afhT*ʭ/Ńm(&2Bf\OPNbȒcn#xS "f{:eD* ~cR+$蒏 CՐ9A Ku4r mᭀFdB1U~=DNE3 >~x>z^Zs2 =;k$h&~~2ʕ-o\ER+ Nţ҄?@*uE9TH([ \tFĠdh(/ yIolW#M]4osЩ ͵dkl`1Z)SX 3GŁYIa>Jaq=:!/3EUb C`w ^06TRښўTIlm^&칟(H2" &g" 4H^-[owkeB{m/΋guH9_/%/q=@̶\tU. -CWuc=Sy F} 06jSgʁ`8&b^ˁ J4+oTKp.QFm݉;[1a^{ٞ;ťr+7T8 Z>pu2GBaTs36M٤# xJ}cDb%/pBɿ>)qVՉ]b&B$3yvM 7/fdmVkQDay\:ލV0i=_]RshsA~fȨ1 x)YV}nQ6}'&m9N.Yaj@XFZU[/ ?B^ _yG*aT ou}u !f,LÔ4<9g%<b_4^BlW`TUQ^o,vV*©`fʻvqUC%tVsZvq#! BqxԱf3 "3K6L*&6vy颦gc+sh,|o'YBN U;ux=ti\X?Pe\"6ok:niX"\/s IQ$qP,O U NܜN A/{F$v,^A9ۡۚfAOp='5oz֋EE"rm[WAy^E>f( ^LQ{lsy[0lސ)u2,"Ӡ.~Q,>/Ғ05?(0Cݯ=9r_YqDɗ?1`=yа2Դ./_886 h?_"l6ABþM=Ei(a t+ThtYbˤ*69`+ezmD/ޫd`8UNM(Ao]~OC1Gh)˶$ӻ/]h!| D ](9KìL-x¢'u$&<$mV 2IQ iS[p\%A6^@mNUwaK(S2ia 3\)W+zew~ t]\&yrHtz>-Wa Z An)zK/51 "'njWeIhP8 r K,^=͸ >r5sTc6Fpx7jp遳` GUkn&WJjR5[y' 7?.?ql'uh}v kH4p(Dq?261C Ahԙn=\dn)W%좖 5FۅFDe)cMwpU-W<;npZPSG4 rmSrAZ+>UH"lh_7^5ETd!M({ ,.[Pz xUq:HB%bPp Զ*@Ecwd#]٪KVUB qk1A np*е;,rq^٭pNq Xǭ]^t렽&*n%"oCB;N ¬K3-k70b ,Z XEK0X{:PB}nA TL♣س@1a;wdo\1t.Ugې?\¹f4FN xjv(`&6R 2"Є!~`5 A@ɃުtKEO1y`HAk4 BC /gJIj6Ie3ʮ@3Y=$;UT`yXbs} +jDa3V؍(b;kq ZSFnŝ}~]֝G0ԟsTVgbZ_0Noۡ3բ,[5}/X<&V貍njPݵ=bO䷒}sG⥛-T v|sA+3ߑ3>0t;SKNzK⭋7Ύ씔<685GVBtn _m5Y PBe]b`P8=S@gOoBVsBZ&N_09nȫH˸+T8#͛~t].X,{ EVF젢zBS1+Ae:MsI n~w|7ƥxX m$!P.h&Ysz>9AٓЦ"Hs!+.0#iO!Tw}`5øgn^VY.Օ=M*j tZ; FۈH63W׋N+N|v vcfE+G\|{lrjB@ v.!E hPKVwC'֫k|uHE KV2[-F쑂6v8 |?oUƢ,k m: FUUL@/y5{¸uI)SjpȬv/(HIkVW*V7@&ց?09 b{={|Tmhm%!gD!>9`>SvdNY 26ıw Hm/K_XkT Bo(:_Kۧ+w̦Eß.9ʵXe7!?K~ RV w8ש`8^!үV!LI5' NR'#1_4 N(Ts^%jyB R֠-.5ǎX5Jh@yhi.[G(`*{ 5zAo/r$jK~6o̝sGr0y"*}ǐ P GdͿq <N D-8xAQܺ1Uns8 R7ѹq;+>Q,/ ?`Bom Io7ady:gpV[i6l=M<+W2Bu_ wg7Q<k܋~_*v~i,TTyW&1 }~n+I_~]yFJ)~(-Z8 )WxKpLbmo&(!,ф*nEm_OW5ZSޠuθVnl䇯TiiWU I^AE ^ʤѓ v.U02hJM ǨھoR:@+\r~A \8LH{wB8\JrG1s0G[dJU2lRq| _:IΜY9uRӽEK1r)7,[tp{zlIֶ߼xݟh%KҧUȤ"jO_WJ){WWn^*l%U{2ПȤ˒~`ړbSoQP "vjTqϔ|r!k<yeOXͶoxe70Hm:TŬfQՐ;DI l~Z["XH]ʶ&,]Kyt<fU6x({<5}AIN=]TGA`E= f`9N[!uWK)c $ }!y%f<eºPFl!;2GZ2cCO3l=JH1pwLzS! Xl.;zrt+ 쀩;1x4f]8C |]ǎ+w0T楿oQ9r\U?}8Q3?^xX#q q :"{75E _2Q Oil=Cuu92] '5Dݕs`1iO~X.9c ʩša L{N86Ly{M[IE,nSf'+3T/,/ok}zl||RS kJp% HR+ }1,HCsh}YRCaz OW3݌V&h0H/#Y^dZ"c=HkERԋ5e5J'1Dݤ [!5bC/FQ6r:dOPJqN$y-=yŧѢטi|Tq-b3@Hzp.1]8qSܘ I,h [v,w9nFQyg+D\P-CAq{A[>1D &f_gXN$[OS70P$@dZΊ,/SAd.kƛp \c(,WVtu;03D wWW&*AL׼_xCDzxPUj\]+PvX#7*kBi70$g`'Z,E zYljmoX4D(y!Ιd@ V.Z[G63>{y 4wZ_(7"tr5(k쫻0N( @>K \?IiI[[:&l5*vM ~@_#m,+H_9|*2o" `dgzJq.rHY3Vxw"1o 5F' ʯGW\YE9|U/,pXhBs f CB](}Rh[i<K+U{ׯ;#'|F,@]q|0]$&v?̝N,Y^డ=ÒQԲ `Kic .S eNp ]tUbLLgq^ 'EuA^1]jcdoZCjO1bͿ?Oi-6oGz2ܪ:GmSl8d;w2 3 %IiR S^/-= Sce[z[[KUSQQv6*sī({vqsh1鹈Ox.̗#+lk;=u3^[qaH id<,%ڿKmB rNMґ1q.hx@gzf7+ƷAvu,g"omc9Y6摴HU/Ekw)R~X!>x]NtwdWDTaEo\l\gI*P5i )-263m(Z9=&!CH j5{,NS? +cla #*\@85@޶ޔ Fԙb5gyM]'t-:ӂƦq^;mD$蓒YNE$u+cr3,6I FW6OITד;~ct:waKOeQW!cRnvJpN^°IQ/,MJ6?˦e G ":99mmztdhAÜU/l x,XzX`sg<}iL&bX-"ȘɆeG Gx$Q@%G +Ai QpinKQ3xb.OA >jTSd' 'lrQיM-~/')1 }(Q]s6C&]~a ^` r:ݥfɯU8CT qjY[71!~20Q`eC i# Z><|Uh[3L%vK;[+okASL~LSNGj iRx)05#cV'΃9vk^8y~W3  }WV7(a5=`_f6 `74.m&oBǙ>^F/vʪc>/̢ވĉuvc`RٟS,  ]ȫEt=rE#߯Itx%(+dTn45EEP8&!)` ?%Lvu˓鿳x c s&qK,`l- MZle*`y6}r-mV8ugK˥ar}gl,<" !cL&aLXO'tY磱x轁'4%*"n|+UܘC|1a<Xϫh;B:]@1:_+Odjd+b&Ȱ];pi\6 qtV;e@1D!qj.|5e' C׮fr< z Vsًp W6 6YnTBxV/N_nKih@du#8L\¥c2l,݇;v,f(M.;7㭬HhɩL _&qR0 44{V]J(@(8 [4)I]:5\sckTokC7v~_[.OFh5},9ѓFcEՉgT t[kie9~b &499'02H& ޱLpߩ(Z?01@:)XGO.?LׅaTa~h7sX1ƒ /U<-rPմݰuFOȄ:Eo17pʌ++Kc? %Kګb&EFv#fes|4 %R0 4*SD$^d(݂鈁:;f>̃+zŜij W^`;Y(^vMv籡4KҍgͪSw.ߡCժp}݅ 9UY# W|1r(hg$B0I)ֿ*Rкg5M볓bK^K1H/Bypn7]dEJ~aSlRkbԤy 6*sw 0Q+qo+׮S-(K]Lkcsvcs a/Q]-8?/cM7<\M#Gst9lL&٨_ 5gXcڛLLyZZ*)tn=8In/(,Zx:=*Zyu"NGh?Chzx(?W`Zk+@M7V"jio]RG|* `Ξ$mU*?<hIoQ @xS~(HT_ZH$E$}xuċk:馃ۇeq)(<9 QA4]눼$`K̻(2b<SׅD{E5DP7VD}TxU,Z볪~,D6*K"YUvhTF7+_!%2fѤ%B_J[-jWxuJCE.wkfm0YD^|ʳ\mNJ$l/}Ԇ8b qm6nUÝЖjlWK֌O&g0-tB4pjpa 4釫c휪WdF}@}$K2Ʀt̞2_XFb˲:MQ!ԩp4=kIZT3nU(NXkҶK`3p^4 )Hg]<ò&>LЁd}6%gĿSi ?=j54V@]`Q'^d;hS,<nwJ8UeM!7,ti"fv\ ݥ1i&u_$7|Ϫ='S~}&82Gæ0W`hÔ47EZ;Ya_ ϡb?Q%_.VbRe@td2Ey$3JtXN۟sڻ. ׹P" N{ʣpRn?b֬p ѯ S?n޲p!Cb" ?]t4dVhdz]ՍiwMtQ,rT&;AB{&s^]O.jt’BsЍ}yNU cO_ӥоIx`Vc3QH&x CA.R) CNiF/NY;Qhҡs̻c_JMjݣB門f!SʛnI@ՔJK9ʟi[A/ ċ&};O`5[jbڬ8=E%n}gdo1ozÐR,)-ԑjn_bmR.\sCh:PD7d≵9r^(fC{ 4/`F送dJ@зi`; Ӆo@۸ּtm*Os9tBzG=,x0N]@Mkvxjݍe#֤Ytx +LcK~)ީCYIݫ /1e9GiTi~\f2}N"0A d v L'#ͦO\d*g/E˟>3Ag4!jzkA1m,1rj)l홭7~9FP,*f:vUO$!?t$Mnr {n <%] v9NIsnb0u sLAkd8 HBAhu^K[U{Ԝآ1\ug\uCMLM[΋l6⊶r.x:01&-V )1$CFi0XSK/ WpY['8[os|P=_ʊc ѶTEW1AN8u}Hq:Knv>ϭjbs3=oZ.Yd)rЏ_ 94 2znׅ_lMY^q =&x ^pSot,"ab̓IXѦ+$2##4OO mN̏&a[hTn[6y vn[IL>}5'Eo#s}߮g \4i [ki:-UY D Վr,ė#:Ny:w6n>lքߪ@q$|X͎LӍ7aN7K? |G0qSf6`]8KDoMD9}<.woaٞƝ&nrz (~^X! Z|7ip5ij}e-U4 |kr<\ K&!q`69Q{s3]9HSDv9^fw25gYkuh_hN+w\ԡu1ߵ,ޜr~ WA@d/"K]SlQ01hG%@q;m#uX%BUд F}8 sjZW+:$\0Y0cP- M[Mc.,qgxFtP3NjOOsЊcH6O&mSD'82\mhPO j@^ F )5*3mǖ۰p#&P>Bܲߔ=Ю)UN:^ϟ3."z"ZmUI=):buJ'GgΏx#l}}F 魹%X~ w: ?ܑeg55o \`0g:S4YtZwO΂,׌a89CFY88GGGu0Նd8VeĝBL-.2o<*<=r;0 Wעϫb>Ϳ85bo^YHw 'Gy+cBGML!O8N&'md>@~ՐW'U8"M2_Cp!@^ piXz B$X(>IIki4M}Ua 6H{@pmA!jpˍjD 09E؃?wt0}%v1;ioB_ OP<)ZJ$Gy3)Ǿ>4fb֓,J!FeX,(-:-euV^Gam*Mkb} bpwW5>3YކqW3}Y-P퀛 ~X؊Qfi>"|lJ7 O#P[:#~ϴCb,v/[w)54tyaaNFEr=MkTXb1Q{L'3 5/8jN>گ0|H0u8vZ鑚Ȃ0s_L|,*zDy:W"UDuumml;wd;/6Qd~R^}˰繈YH³h񠇕r*$ܟSij&7VJ;xUXR/z/F 0D?C"!N(w| Yse)y8@LcKE7`F]ű"kK6ԭjL=[E01ye³b9!і31oO =iSd o b|:Q&r;nm)Hc>nȤ|Kv_ݘ\!ڧƁ#轸b6`8c+<grwdb5^j%IaDM;V ߡſ]2] :GSI =lfXUZ 1^W1뷤71Qg`0d(/X rV/hk1tezʑgHr\F !{BuO{V^j%#K;Omkmt R"k[E)3]FF, DFhd_;>rF! eI HRSj_pevbH1[D.yD}MyVn`_ W[IޔGj{\Ȩ:kp&z8{t}ͧZߘL[}3prm'\qR[905Ixz( |H.(2QkS|]^`q:p}SCj~@$7)؃@9ZEf{prv~əyы@_"jnyBwؔ f#%aX|` ],@,į4++Vͯ%qhPk5ar^9"*<@F}[xԎh|3BMڈVSTUЊI/nJ}ҽinH`!ȜRU%^Mƅ:|(OE) 6@EN7e;?3)lE#@+Iʄҍ쳟kVXHz_rsn_I$E5Y}g "ll@8E7N—7{*g6ne )IO4#^dą\q w4GN~?(?O]Ȟ`)u-bamJU_2^?F,,ԇ%~.v *A[NG;AGѪ=y) B āP?%b7 N_oxզvwY%/Qݭ ~MC^No/8J|PZ+SLxo^ (j&@u zՂ^^ jfWml5 _1{suWZt5@hdH /os@ٻ?#3n^ `YP{_ϐ]doi7J8z姩4d]/\ gJ5eto×7g<(>XJc}ڪi̻-vl l&$wgC9{eu IHZp4PiYydFN{H =(Igc̡hFj( ʖwS>V+^)Hp FC !Y; nhBTao zL>Xnωw:N:OI Tn9|Xkvh)Ⓔ*>L)?b;~ ` Jm#jpбS؋m[CXUxl=z+g}Bmgc5d|g7QPq"dJ;F^\ڥR:1KuQfmmlB0Q0td_~艵So^miLiʃuHFDnBb5 _GҲUDfAam0gW05B+v~ǒY_c!*6k?\FA%A{42C,U(z2@-+h6D;Ʈ Lmq2ڼ+1ʾi#.7{k,8?C]N!CA6fXpϿuQw9_-WIB/-k m8!EjF `*'r]ﵠHɊbv"Mi̯){՟D!8*}6+ V0t1ۦ-\0,?4w Re>_q,~W $EcHKѪJ"ތȡ c@qb8wm gE[ 64PUGNp"NR ,եw|ST<c9ǫQdV7Wv5A ?`2g8Ĺq >3PLS:l bZ ]rDSC:/FUd,}pdYBFw l(qbY\]d!Q5Xxꄾ,&Gn o]cC'qͼd.ZiK1ẽv@T]GtFU- t*n@/{lkMA.$ۂ/`9 w*{(D_B__v5;,#$mh߻oQ~"'xL"1W'٬Jɺݲ_ɏZ#W7#%=^eu>b~$N Es9Dk.|Z@Q 0؎vƒڼ-4>/]IB)N2϶,5)FdO*(ł-?"{ dXDІ?qZ0T=P=Oo?0YvXBDyKk, ;}IiUb} 2+ V/|}!^?}\¾9%^f[bZ%ثFot*V_nfXSE(}]r>d9 iYJ y}ۦb7mJl5廣p՗? 6%zǝUUf1ݜ ʁ4PS3*2ٶG KaT!c6= `g_9Ш/a/Z`9][9x:3\8 mJ9go:iVuGjJ ǷL˝]P֔_@խ(7N `Z9T%lu|P6 WLL tD6{<+/CI e@1`_Β/* Cm]PevЬ =XP=#p2~QE:.f$]8:mXK+vnlB=ćG M;z({6m j2KdnHb08(H8A7:}9 dD**Ꮄ@u|u8v+G<%rsa>`! //}{{q3C֣8e_/cdQmA4I}V淯%7z[aZ~8l#։*OH6TFM:ԉ,NXClrNWn!eB22sLGNG?n~O]j6eFNK਺n40ג\X>yhk eшyf|q<[Ym{NБJzckg*m SuC{X^.g}7I냪MJuУ'.WG-#SBl4DXfɷ6q=YA,]GؿdUQa2169߻yf2#upn[6ܕ$Hw)_*퍁6G%*'/F񝲋%YssfВ9<TPӒ+Ąυ6-|J뼙)y`|O]i>sFW:e3d2b,҈fDwH. fm҃+Adx9߄}x?;z /#RcG.x`v|& ]fTL?A6܊cYEQzIkUg"4N0K-E8GЧs vW^ޫ;(Y(d"$^"qI"'V8)'f@0;*n?É3*& |2YzO?p4 <[%ArE$lƩDHc#=~_р5k)b0L3l P姩Xݬa]7`7CI2ȮQg4P<WM\ gU2)iݝi#4#S}2bǗ""g9 m ~C5DIY2\%?|qg!t>M Ra5忦&Tь,M[u"Sjih~ӯxg߃ѷOt:mӼUaAɗIޫ!7v3ط^?dNYtȚɈȑ^!mWrc?pcq5=I.4Wt9pˊ@2wGFJr{)_lV:a^WߣCNX Oh4V+^XZ !I?L۔-!6Qf a#ܡ?#V3&$M|>Bz Y\;5p  $$0ssnWCK{ \ v.!W#B]1Tz5ה6jELN?tmyx2D.v\K5 {c1@ݜ+g&}/tل\y os!~íg<}?:ЂV:άZ#V77G G6h~<"j!hǥ ~lLq[*MWƈAT^SSOu'A}XQ1"P*hhYhz(MM),x jxuu+gɶΓߌO<5ʡ:<ŽY i^m*k@I7缀wZ oXm|3*4Cy𮚃m- ~z3rMpUbfXRoV VX¼Sc"V#-fHi7}yl}s*A'^1Mh8|ǫ_ZESJZZ-"& z$􉪣a&%{Uネ/e/WRRFLq%dv~IMe 5wuk)S;@B yş.ACg'l a5KSB,[3h: k5<'V ]ICq(bqu) /`ž +wahhAeV^;HhFr_D W*7 Af 1/W3}<4j:Hő~-m4~HUK`[j>ai߷r[?E˞:J-:匞H7d..NVu|`4MB+O EƳURAnA5O07))Zdv-YϚ'# tEZ)z#|_$z ?5:5\T;4GψF!=tLP釓4!b~(X= q@{g%~mxgQ]za@tۂR9_"skS*\Nni*@tZl, %ߚ侄ݿ'sU[K ڲ}m1'BE=VQ`'AHj`1-Lq+ڿ9#% Ϲ6XE#i1T1F՟WnFtm8ttdDzǻ(rH8@/HHZJ"r۠F(uhVvdA 粰L,ߢQ{ԧTpB&$ު_KcK祼Yм1_q %@uEi/zLQP7n=$K U19_(H7n|887_B'<6滰Ox)kWPs< wYuDSjyCps"$FTzg\〢Uw]iS'|'؜S=r 6Dk ;ՅP_X3%ʂN5j$:BԻ8Gt`掂]9#zA !O˖2::}(ddkпD>Y|ڠW,n+ |EOPrlĆ·ك&l(:H|#Ė] 2m^6mB! /1"B,  s E&fuyT ®I&Dli4?_h:DEf/HA L 3s$otJs/)iF> OOJ9E鈻d.'&%r=.7Ղ}x!%^!@K|ݷ*MKɋ^!G+ -?,ȡ.@ A+~^N{0Ì%7Iv[NQ[Ȇw2t"OW yY* DåՑn;Ч5}Y^5N 9+3\dPr &x,4zU3%xw[_f06o>J͜lLCO OCt VcV/H1i蝠#C8sbĄ2{\}QaY@8z' 0ryWveP>ܯ),;9Fv(>L>1f>.:S0V\|Sojnڽv9Nw)Vc OҮV*j"u{#|2^ f'\-03MP!dۂ_ZqC~Ae#p^l3ĉob zIDi O}jt B멢++\Ҷx|'b!SwIV(hۗEU'ZcU1nƩf:Pa9-έ?uobʛFW&;qRD:hN\t3^(GGPZYM^&c%?(I6N\RRJa^ם+RT胘g ء?`Zr.%Ҕ0JcpHٹ( cP2'a 1k- wGHm{߻: Q3 6^Ü X#EojHW-(< ef,?8#wc棵ϑ/ Zڰޮ%d$YȃGd_ӑdkuĺ,}}o{m:~~yX;wqMx糀_e!*2u5v /Q&#j@=5E3DfS4 xL*:Kݤ[ f]Y`"80gn97wiA|$PdI,34Lc߇-~j8DT8螓e(jʔA['O5H.$dzz\ғc_Gl'(VR韊(Xg'r@ #/n:‰Jw- R1&q&WuO O6uB) \* jnj8-qp'4lOo1G7^4$k**DPkn*%ELƪj^be:8>q↻)T*8.e36′Cnh̀3:3QʀA`@S4oa#ℊ»}8˻d4Ӈ+ͽb&sX8sJW~T0-AӼJTKtLbDFp*S/BkTj֫[:iP.}N9^ljM,BZ[-gV45K fM]T֜~0{1߈`ِu/JUeƉ.QpȠgQm6`98l= ê+<ģ[d!ST,T|)A~ꀳ6S{%i gMm% ۮ{nEX|ReW%n@@~@~$=`!w07-Sn ; ,5^g SDl?<䔽i *\Ū~X$@WYam6Ȕ=_3c9<@Zo]lYʽbiiWQֳ\4rޏ`"C")-r5ReLte:2^713x9 ϶t*of0apw>F1 ]|+88ykFf^B''+, 4}na+5={@R )^< "8q*]E?=Y=y¿R_+q= a N^/,؂ J&_@Hi0XY 2,*Wq~Kk\8eKlu60;Jk&D- 4UQ]܂ҭ72$~>N0v.[>J%AN&molE^ qpH3g6}hUׅ [peJCg+isB梁L?PVy>όi4Z!{ hde@ToY?&!$3k(WUEhG8F ;΋ϦvPO]SP3,)k(ac +` 3YjJֆuP/i?eQݧ5Q;n#á6aPJЁ[k[F,zdm^(F5$8-ajwGzV1Z~  j4E.kPdWVHH$%ϯr_r0!DsVR7 ߬o"7j`bHb-? sJLѧCݦXF1f{{ZԨFqy(2]7+?``Y1KzC+\ XU2_b MHMHzQBtayA`gCvs 5E`$o&zpŅEHybʅr)KEmq3%މ`S-\ѭFGCkWgwW)^pɔ(DjZxzDVD)F}& h+`n󲿘'gsryJླྀX\\'k+"2y{XGfUiʎiP6N#? W6Ut"!8j84ZX_} 2)i\%BX̏8ŋ^-4Pr9^&}phEưlHR/+ <6{wz`(I 5*l1k+d=PsP]_K "g4y<.lآ( H"0ʲ]Z)K,\`eKpS4B{^{I"CG;JؔBElFAH6̡?r&hKwp/Iff]le`MT l1>@(9g/ ɲ?FFLsf%0)JT0)ʽo+mV}rS6>Ǿơ m VWHSo9:y:m;pײhdϜSIʉ܁C r9#!*e}z/,/<>%Q[bWZ '۟q^]LD T`. JjjI<bKϛ(1y 1䩬9t9xwLPr ]  qN{KX+a{}[yAڂ+fd$h0 وbtey\߈]+m8wdQ{IyjrcBqbYy ^ګVrky!ߧ`R{Poζa]> ,޹<:G#zG :2RA7Zaf!VB™Lƒ3]XVb&oWM2lrlM}\e}Ǟ- BQcX7I~N\]DtݔYҵhk0؊J}rjt!|V3&Z7nBy^!u:(˷-_L$xNTVCcޢ~3a GZ@,$χc~ZTa@l C_ / ;7ӷ.UՕSdԾة@5?W㩅]+C!֝M 8i.x^'D˾`+ ,afbFG~_s+)N-h,YP"ê}^ D=tRq+caBXO#9l E;aݢƦLjzX9ƕ+1#`暜?E*Y39"+:>sޓ8r`3eZyj4 !3C".4oNt9G kk(=Fc~8] ٍ$$YsS-o_3O.}͕'符_WaÞ~~ή{p.p-iRXF( Ղ(AEhCsͲS5U3k2d NKxek۫|-[P9,9PNԉ֠vX? (|Ey[Ak=DF_]`.>E\𓻪_=sZ“b.BaJU %O,K *# ݭ-2z\P&\ӅFm a #K5gG@V777XGX&6Ms„2hHUjNE+bwneWHj*nv،gb0%&d3ngB'y6LBh & 32 Lϟ9}&wW&>wVv9+iN^VDIX#Yqu=Z Ĵ-UA]̈́i~ ղ??2RVFjH̖ As"8*@6qq$-qYH3Z\c@Y(0N$E0Ά/ӻs-F/V5FM7%V{??dMZȬ}vP;l&˟OL 3s'_FNjLܶUI|HgKb̻*B\yh|BζG="{ ETomg.8zF;9 +(\^kM3B4=d#=B%ˢ2ryQ+.W GJIX}zdKgăNEIO(mTWqy_+vG4B5^FXPrv6%~CߐLMWSnQZNK̏I@}R:}m#~eB wRmPǬ:.9KrmG+ wٍȆ^D02Ug4R6%HdY:9ަYњe Od+ޤKQW,Mͷg C9H5M_v T0a`Azs1-!;s33_y9i:T^Gu̘إk0~™LxJ$i5a sEx^?7TpДı~i%S*wr}YQc%bF0oelzX, pi㭲(tb97e:[/ D#ұzG=Fj8A4.'Q[Q*}yc1|/^]ӱG <& f`_fpeE!^%:+VZ*649C8n##dXKrʌdx/#_1˟% dr)gCȧ(",ꅏE'S*Pt^9)_Dsg>49}b\Y"<[_?:ltYP4*3 0]=h5˛wmr:~ߥOp`y-Vpa9S_uNX>f#걝vqW EKbZ=i?8I_g-=VEb 5) T=fPR| hT- y32}d((a.!j*Ff,1kFoJy(ePo$^<)++K=m7^S"BrrtI2`ZN> pkd%2Wmn?_uEw@m-on0,L,T 5'i#]C:}}f?,AZHb=yts\&9XM~<\ }LEžE!Lp_,QGv걠.aXVBOLIƄ0*}d;S ?oO'i΄ >P}JJDByz _^wezOwl,/5D&}+ 8VM(%/tS!;U_m/5/()hiSgۦ#\>qKǸ TVc9{O$۔thM/}ZͨQ海0ͩnϻ~h}9K| 'K6sE(ZFݍ*iSqlZ:SYV wG՟y>'C 4eeNրl~ ᧍ wx}:L"\  'OzR%dEc*Tĕ\' lR< P<sSm>6 8 gb`A*<\1.dQQERI._o7 dh& E͡p{ d+r̗ TYK~sGiQB54z껳n5Eѱ;ZfS#QvNhDi[r=?%b"G:$;X فŞT)?.[dj_԰2$$a)1Q# dcc\9B˝"`ÆKz'!Pś8qRy'8mT&1}^^؈!QLZve[)I@WZn ţX85˺l eޤZŰeN)2 gP®6's> [1E(fI2d{D1~fѿ935`DO;3xCf vAf,Z"uo0NrwN: }lgg4\ݕ!$KOZA_7GBc)]yOM &yY3#H5cC#KMjU謦-EefGrFE~c@{s,G;\mHfZ3/v !O &~ _҂;-Ÿ%ԛESa._qs`*\+-gܡ !љbU>c=l$ [E9ɋ[6k-tj2s},OڪJ[:u̶{<%K\?U8?6JGx 3\2nmB;cT?c[lk3k>bCTb&_b q"ܢ/BP%5J8ɢiQxw r"N&8k)U .ɠ.:pȢhɃ[_qR"ky HՒ.)dP--#ȆɿU ZrQSXdHQf)Z*tYLJ bvd~)"2uX2jv A<IYK@rA&( rHsl\kp}옛C.sR3=Mq}p4AkYt5IG>Lp<Yg][a,.w{nO憾"dšMw}y]Idi e&,h~LiKng3k5DQLdrǢ+zNWyTÑ\k+Z͹!X8:ݹOL`A kWJtSMWL"s8<%)g/YFiBJ=b"Yrxca k&t9.!upa]uD*/Nqgrx( EZiaȭ+?#T2sHF/29ͰPy Mk,o ЯsqI,m[f1[ycODy;W¦Y* fL+q@AXe_X)MF#_B=J";DkL%v ]:5CX1z43NzQIz=zSPq;wOYr )"syy{4.qnAQ_$ tU̎)-/K&ǐ<\ kHGDpw2)We5ϻ/O~kd< x,h6mepђ]҈֓ Ľ#aX)_{W5y@ 2v [hLEsAp8SY-y)LҸ BL^-/!"C?~A-hu5oB୤5AHea3yv&¾t'd#]<+E,'N'_i&!3UhbœT.\3HiXSR(5RĘeD_HK|d:2 / ;ıߗ|7J\CIhv)MTYК\qT#AqUҫD)s>mk\r.k(iBF]oK$[k@i| 0 F,`5D,Sukp7aH|޻ ,/`(+ω9 SH?50^h^w䝴6 G m c(lQY{8j(se'"ZZ,TNNh:}尤XZn@X}0ILNTu)v+@<Rޱ`KuaT@hhFrx87cLZkjNE.ia߂+O/8(SOYƷM:}LmҦF}Y5.N6H}="'^Df?N%,KYXgsODk/!5ߑ%Wk/nhHYǫVSC[}޽/ҳi Gô~ȘA2ۛ9>`#ß6X1DL(V=s{o$eAɕ ѝkk~տ%{ M#%×_tހ4δͦc J$PXc7ö9t+VսI }KK9ρ5ro5,`4)fHE_@ -I?7!@H-7-$ ͔Zdx$xN<]3 6{@NU2Ä,WK .u r*$Ge]2@dWOJKP/QiRUVKx])v>z]TeH . ^N?хSNЮ(G#_cx,)& mA؇~/.V8_8Rи#pI!Lg W"A˸.dhM%pvGK#6L!A9#]î>F0ˊGS/qr%d߷̰^K!Rvn@|ͩExFEEx^C)=Y@ Cex<( }JVJ1҄Lld{Ax'z+C_W5`2pt,+kj=-  =*=bC¿^FQH>1F{7w;r=psVo`H*\?2K;d#]/)8/mtMu4g i*$^Hr%`":ekl^"yN=R^ `hWpܐDTRa5(9lp3~x#r |fQ 6A[ۏ[P7nRpHzBUnfLtMr:ٿ$|!]{CQCR>{r^HE+*k}X5TX 0K^˹yp ; WbW@61x7u%qKJL}K6xe!`[U;ׂI=@ivm*68wZ.+sa;.QzpZ 潽bVZlRȣT} lc_Jz.'x{P O{?GʦOԋzX5ه`pykӝQR1O̾Za#d_@"$T  9,0 gaI8{91-o^ Ս8U,~넳C5G?%~ RKdc_,)\,~" <>͈hx`2 `Y֏RG*> Ye^Qzp[DlbŽhr鸀W}h*Zӛyc {or:E]rCDoKl'1 uxɵ$#Ȫ fi+ t(,E;{Uϵзyqd)PV?#C2><F헟Ӧ׆Sz@]Ϛ b)YG׈N!*F9~B {;ʃ᏶ mUfHz~t'Z&[Fl$dߢ2՜ O oѷҩ?XGDR˥0is0hv-vC=T[Os@o" 0{2Pw駄NHA r5`퍠H4D+0E\^h͍U8 J1 )2#)e_ȗ]$e0ևyMk&2_]m1Xesz#G˺ b5b8bj<\Q2?(~9+RlPhٳR ĉH#=J+'l\.j78:#`]]Z$6HWe*M[ |ٳ 4p0}K* ݞ|kiV& .#wCnP鋮Wt5:|3mG`)?f*=؉ZgUQa6nm䂌Cj%hQFwU4{;ixtyͬpޑˊ! Zf~ әuwXÚdmyp FrЉ1 U焳-0] Bo6w%,SmQޢQAY,cN/]J:YZ0ss6fw*I%2*0I˭\e|GZ%~"f{@f=?X\ u\HsfpTL?PL!@ϸ 8FE~Z!GL7_/`;@*b . Q.SP)vnᲞ'̄NDilc%<``dq$y5 4N|6ƒ{_H}gQ ;8i}P uN[`76}2|SaCS@Ob,"@[Oᵴo.xF#:yg7.U;[%& y7'뭱Sf9G@_MClNUЊxy&?n$@m[":9i7\_OﲔZtn,,n36E׍t8Đ ,_-%odlxRDFm J8,<lvWC<OGe㒑\׹D zf@w-I+ѷɛ8%% Oژ%mKilf``> 8vΰE5~K茉Mk)OޱvPR yX@)m:y(ީtىC9hn֨?.d4EtZ)k"*Rvxb X VD vn~OU\P/,NX% :vE*ݿ𪶷@l5yLJsN+A{bàOߚ}9 8ÿhϦ?póYKi}vh<bcg+ 97Z?w&6 nGՏj` < Z}-I[u 䜻eodr2H+:@(1:x@v?6Sc sroĢn%H,x՛ )滋auq}E_qwcFL4r [ sYT֝_f)Q{ևhMɒ4N  oYy[ωmWF4f꬛؀}ĎC:_O'a GKEȶW)(2ZQ_` wƽ!lEhR4'l_\ơ,;hTP3cETWHO<$&Qp4HLSa|ƀZaNWU,h?a!A7_Q|;JrhrE1t8e-^LI p?r;3Q7+bw!]" ~k;(x )tg"iQSJu"c970X^pYĻ^Trɾx?"ǻ2,Q+@lZ]^_Vf=[ LQ-zB), Dq͜U`O<m'p[ıg5t!d_'߼DDcJ_=}ޚ&Kw@n]}Oi@|__tleG])o|rG\[H h}[NAz)lpΡ$V 5 >vsbBWXBo. DYwӎ1Po6 ~#l隈 Z/ vt(g)*}TG& _\&a G_YxzG: h"r֪-sZ5"޳"͢P@mKnaOJԵP`3vODe(+vl:pڏꠦh 79@[0m;$>'y@Y; ܲ6_@^0(ݓuyBk'CzbL{T1B/2w,b1dIS{mqrkY-k9J(h=ZlE龓"`sFm϶h:xxY 8|u{e;O0#ֆ&XgDnïө$iY^iRS1׆baf/\EHWKX@~C$!|f2pw{JB*v`/LE? 1|Jv53_ E;,77Y Bb3LMZu3G%?Ȓ r!tԫg1z42qBE&"}2 l"qk.8S6^xdgy^$ޡ9*SDxkC53΅JE:mK#n Y=aOH5h!S @CcU 7\)*7p/rŖ%m9Y&.Mi^Ԕ$ɵwƶ8aVD|APkP(]hzbt1$_9gA>$&R)1j:,MTC7mۑDBR[;Y$i>Ҿ0znRV ,TĦyzD.r_2m[Aa~91BnQӰpUbe湾ISB Q:P= ]sݿ+u@rsrIp/~Hy= c <\~1:}zB>S%0d[nTRt){4ڃyChmD\ecjE%O "C´)òKG! ۜ۶^D@t(Cc"t{h\xu)fSᗑ6 jO쐄tJiC.~J\VN@ODZLmvq / o>]7F$ n!\s^v;<("'zID8B~G[Uz([Ŋr\/jmƫs{eܢ6&;W! qGIh<,B9SYjw+\ihODD ʻZ|Pm8an&,Dq5$Tmta]q=a{M?Fo_:trBk@q .M|O9=TrpZg(CHv'FWQ :+ =aE8oFe *̟77-21pjl`p+ \ ov`yAƪ9Yֲn9k݁I?T7ux=EF4/lA.<2禋*d ЇhmVdGmomx2 ',xd5)TmaQ#\^ݕ4vDiۭ~D? ]RU[=.5a1ƪZ ~iJ$?4j{>{(Qɦ!X~מGG7h0R./,O:>` Q} $tPUa?z>C/;%}~[ qJ Kort8>o; ?>>\cNe bezF2nӤ&<$[8;Wfc7,!FǤt3޸:c$=OW4w80 Iuvkv@{(jPt|4@ |xq/Ra Ѡ?F5 Y6w\h@\'c<1+{Re q1*.{Sݣ$5:"ͽI'3 Jp'qE"{ @9o^Ka߀JKڌ2Ĝ6WMcz;=51,f`yxg#X[{CD _ƅɾz1ot;I_kۗ2X4t5i}?;|h=o1cץe]b=pLv!tBojs \ًEvF5B?ezMKB -嘓2hJk@y)B<_ӛKh`׹PϤ W;:0v߯w4>l~K r9GuJ }bst@g,c UVl}o77le^~1>9A() B47% |,Qw4 ]\t2XہN_hn ٖ@-y5H28bm6WVGƪT*lO΋#!  n_4)yK'LLR ,-"BZi;IC]e/zH)\-_ٍ/WضFv#ndJ^O`˟!=,EkSe /IR!9Dȣe+I!^ \X{l/C&[Xtv:E33W|fX.LZv yp0-Tڌ ̓i!T?g~/024`;dܷ$:?"Nx 8v! U]< w u|Mb]PˌH/N|%m/ڃ3|d"J51#M#*DEy[w&ޗdLԝpVv7t("6p>@$*׼$=NCӏ'n*hP~UChରUӬfAhf^U};C3S[8k5 i}rۖ]}5Q%++(MČ[:hBp4 u1i$: !3fl(@ ٍr8AA'@p<̷͔NwE4Ul ¹~>Ί@^ʒ.!vQ. xxjptN pn%:l'wd.Xm#1@;ܫ͠F>sي s$]I-~I < 28+)G0hk+UI469̛uHat0hLI"Q lׅbX ;x1c<:!C 2<:7]FsOgeq+~ag:i5 3%12ԝqDo]0TVQM}Xwb#߅F<(EMxeՅm)mRW(d23aEVqTFpGq0U/L'54 \PG(q2p2zv&GVd9Q3o2 <8_D%VCG|?^wN!;3^{ԭ ;K|KRիTGZdu~\[YA0BFn̢t|,|%`Py ^jd8hI:G𨫥zi?Y>W?Z@,;`gr[*+ra۳rNQҀ"A@0 2M p(jgb{ `3 cT wAnIm\ z ".z%mJ}6L04Pwێ-nq@e+˲B@ɣZj$ j:{|Kk)3ſgp& )p/bjzٓ) HЮz51ioy/kȳT¥gnb*#;^IJCcPN ֆŬTv>%xt~n p^E1\UqB@vY0 ,|p+w IZ_ӯ)sketZ_Orn~ydO\S _3smm*VӳQwCEjؿXa@}$Ք蒠[W Ibcm$?BsRsd&Vv^5Naa;}9Ic.1iwG FgdHĕs$K4hÜ6M502[-B0Yȳ椊w{֤kF}QY"_!m| \&{# .f *Oxrwun_٥5 ,IL6HrysQd(54/-u>˅I8>JeTք tlLk"(.%Ȫ&l6w}A[l\d| O*urFy+kDd.xI7N<\5}'I:Y82 kHosDNFٌ%:IM[6]a6LP|dl8Inl5'\i^ M !/c3! ^(M_N%qBz6:ݨ_fZVq!^^ Lj敾1W~sO=:vm;M^ {QDO/hϊwzs6ʓjZnK/+C s8rSOfAi(m9N[R3C-!5̽sz*\8 ҈9Ӆ4/}ǻ?zOUU'maOso5+KGygFسqf.r;(H߈uXU[D4dt:kZZzn@uC帮r>5n(FX[CLdY,F3(ZnϪm5nĞoCL>a"3n_i3fܧ5S.8h*L1B5{Ld¶ BR:nrb{FolO:ފ^&+wN$݅:[ rS? wÖʽ9! "/^ <]|dw.=YFz9bw* %:5o.ՠX,Jkz Z5rdb @⢝?X5%^b1sރ2&zrP\Mcrv|N>SV=4 ".9W>4ݝXG].% O7?kTMN]:4;7/jҍ#53#3=ǰz^!xD,?s9"-`?$D^7DJs]#%^_|/uY]3ߐ>XPef{qɊ7M/.S!/(X/?U7rˀ_dIoGŇgOm!.\f4UG ,1gsr]TKL棒B&) wy`Dz ڨ4}dʽi, fQi{KccH4¯VcTbHU`sX0phhnhIXɿ ꨩ%a&&Bl8>e+7 \IBOm7z7QK M.nAǪ6*mɟW{OA+oE(նd}ּ6W!8m3&uS2hAyWQ(K5<y (D_[l"ܜx 4>\ Pm*FN!qR;TM@Vtŷb+-,3I_>K*(tavK~ыݎo&iD6zLZqnʕfYI>sM@f3 tIMYC"-h`m1[΋/aW0*K WO2IFyN頡36کS5f#19\q&ƚcuYQRb]r _lG,+J{r6 fEf}/*TO/ &YCH&"%D4gUb84XM^Tǫi~h ۭϴŧL. sT37S#ܧE7 g :btJd^ sie$e &gHhSmOŴW3W8xRnW)M>Xli[^Y2Zm)ȋ&&NYu8z3udl!xύ:YJ7|=iҥ܏QNZC/&?R >C?j`}ƾW{vyuZ`a]+w1o>yچ;'> 6;wxuc.E'Q\7;cƓu {*~'EU(b+By]H2ҏ+|X^=I4䔵6b{}̾*# Lw xB.s>w!\ԫ/* O8 rZڨ ۢAu8%d|WZ4 +h vbƂ>f APdQl_[&U6qamk6*ˇ:J{ː8;|LL]how4bͤDL KrOt7IPlvTNxP@x4KI+|@A]x%|!]Ge3S`Uz)J7MɮremwXVS,U\GM$: Ӑ''f./|N*xG2c纔}r7SsN{vnOd L;#?/ˡa<;C J6c]KՃAqWxR3hwj7hJ(.}|km]kdI([|Wz0`ۈȬ٧mzT9RV:Q΁j!Bt۸Ҵ=ݕYTR ߵxn6Z…!*pFXH+o''`;D$]PZ3$ @,䨀}^e0HUnδ1شK-{2hܐOԞY$~=j/V$&"Dk#I y15+]]9<( 'iNpOZHx~)GCm)>3kOE#u*C3Ӵz `s/r&-Q8P;!W0 I hqg-Pp[HrCߪ9ϐsˠjY*O|1y7Y jWoY! s%Z}`re8:.tcZlZ{aF{-y:#Ccs59^GV@oc%g,Ⱁgrdv Ȉ]>\x#GyI P%_c+3(apc9)+yP 3[wOiX2= 7d̅T#E} ~΍]%ʦy~@ikZьd b/pSj#+$^GJt]Tk2{~2E]꬜q_xsoXk;,U&Ǹ> 6 Y̠ll*u`JnEm0t)o÷h.~YHG̅<@[kWd1eB*xS߭|"  ~U톺Lz #)(&2|LD/C Wsxфq%6ڝzq+D7&,u0t9>-ⴿ(vV}V; 6ʳxE _&X}H5E֐~Jn"dg"o|0bس3: ۖ,0w*+{)Q Yإ %D8Y:@Da7iy; ι ㎊5)udxƜ`V'`ȋ" %c 1<9t5E-Drc&Ȇ[9FdX#V"M wکx&Ǻx׉3!=lC`ŴG?0ʎ_0퉼YAQ<ڈK}c{-\*ަ@߂ctRih8]5 y ݤ椼NMxkyxѥ;-*Ջ@ՄۛHmZ*/~W.YO9#PΠ?1# ; oi]wn@DHx@YZ>הEGd-g'd<wutKh`a֓Yu (dp݀|\Fi1/|2#*'C4u} 1ds3r<8ZL@7UI . ok"ܢ+",VLܟ XܯFx ߌ:/t!5wD4{nCԍ?-nbw \4O ڳcPCW|iY=jn'; c)7֤Ib_ 8{ЬQjQ'Iu\+T }T7# $,U}wW3pU^}\zT.#`Sl%u ecVFOoɯq5?OX +`&h>v {ʹp/ȉLtAȱAr%ezʝ?QW ]umL RPE$-Q,dEʾkbxqx`zF_ !D{یPl5i58ߊ0WGE7s2Ic*8/$yu9?'cfX.ڶ-ڃu0t5z<כI\"TJLbbuqLWEX%ڝpHuhiҐXy[b@U\H}V,ۺ*QBogF?L3VDVfdKG!T"I>2%3J"\1z^@N]Z ?ceR)3N)ը{RRkR F1`p ,ܠ `^]UXsPU>믻 X.~+ʳ8c "OӣSz#x7LӦ:ebQ ֭r8kN\7aYaqFtsBEBh uoE|`,|Sf]ylmij[_Pygm]3(&eP;M,-~5p؉l|`<'-×rT'\ˌ_YҐ;IC&I@f?6Isav;cTbIlfȜ-o@#>`$kG!jq.o%4#RM@1Koa_ ⏞qT g&MLv3ꙇX>;'~Kp] G#3跢fZ_NqQvsx1cT߄õ`A<Roe sFg uouIc۳åVnBzQX.:;^| _ELyYyT F-)s푝VJ= BfX&<뛓\|663'l9 3D+?mAg᡺TRy Z{B=CCI'zϨEbTOq NXTCcsOvgy/Eo<k?4jD7aNaCzA rW嗴(zLKjeߑmjF `&53i=l[\'v$Db) Qp܎ދ+C ?ky틊h:gyGf+9{v<t`@PK*eǕz!tщzbAt?co Ji+3 }]ЈڰnP5HuvwX(Պ!_kN܋弦;~F 2mxml3Ϻ˯}&Wfq% R|2\KY;epAkBKFg@[^R|(~*1` ,=ϚrRR) %CZbCidr=_J8+DȞAzPD3 kԬg |Œ!2k"赉 GjR\!DϾ[cdz _Viur U -ٳ3 n]J8`o K&FD6qW^0tJ-֩Izzz+h@0l%> E$o hil >*%$'U pY7|^_4@Xqdyt? iS;rѼ`<=`v%z0;l w}ěژE<,dؓeK?\ͨ vΣii3q*HeDiԈ5 9`QB(G1J@`F[r9I7#>@Ԯ MH |0$<^Ն5 = DT@X/Y$`O/.Td~20g H*$A{h~EC) yyF!FLmQ7 ,@~?Yħڣ3/|GT9KdhpPb \v A#!xb!]yPx gEyj;UyXD%`^̔(e eU:7D:LŝoA>dif n׆:q`${̷()蔄m.yc ͍h<0\: &qk"K7]k5{Vn3kaV-N -͗L8|_#˒n{52L"vK3NcmfH0炤CB^l0{m*=*DPwNXtoY<9i@H6/e֨ژȡ,b"Kd[Y dܩG, <-/Ol|ϳ;N#iєnk2[\2E,|2q9!"j!&/3^+5kpjDX.ȣ,Ww 2w?(rIE#2ep'l;ۊw %|.)#r) 7&1U?eሠ*K'Yu|;*k[q.%Yf}vr䜢֘oG2KhSP;{'VdR5]sX8uLjg&+Z![&Mf #}Ӵ` j%ٺ C2?ơ4 ;U~;?7k*K%GV:ld̄vܢN3;;=TYSj}+)G<)hj3 Azq ֳKn-Rˤ暮&bWw{lp\kOx ̥:U]*?}]2q+")BfKd|@)=:&¾p8lMQs43=Yb!'2QCD5 Z\MàeD6^{ב]kE GxBaT">k0RqXJq\$? P: px 4)w3aׯ~Ϡ݂ uyG9VC"S+]_P~`]M5SU?˘;o:t+X1뉕??xi? ~Wt/%!z53g o71/K%=}H z:\%Od&[8%l2g8)a> 3xǴj詹+OQ:xh^\Jjtın 'vs_eS0BD? Q^֍S}'-"H<[̸c@vjBEpiy@%]| ɫ -U011ī #\ šMK遈 ÞwUI~pW˷/4V8>E Ĥi\PE-,P轔4KxIyI=y{ݚԍ VHy>D'v7~LfRj24hѷwvX6OnC):d)C(q,KSUu:wY = ;[Y,kpn:^0 C1sp*ܠPV77ЖoՓ|:ay˄;Mv:{@@DdL4\y\R_KW Y!3CԨ[0*/-4LBAd N 1su5rw|N=ck`C5ۏbe,R! pgm\V"6ŘӼb2_m@`O)IN7NŋXg6ѩPŬ)0Q;-իa [?K_Tޚw?ѰPrǡFIUpF.8("f<̌4_m%v!Z"yk(f+IQ%@0R-`-}a饭<9WNd Vķ{@宁Xv?X*M fgօ#v nFfY g3 .Ξ+F`x+<Ekz#GtcWӌ&aM%n8@L/m*VfLحS!?n͢3W**'>ǬXPH`KdXy{x%.Z mF@28ETXO `d" f zW֘kȮz)m,+W!4Mo:JDkߤ?e;!=mgk^h+κI=g%*csya4:vXy~4;ҴATK?E*ţO.\wVfsG/!8k/$Iar ^Peq,5N-jP$iOc-U޴]st2mw1ʀKO1!4* &E(WkG aNbpwRQ l%/|Qv)J%﫝~guRp3=6_Ǟ)1<-|Ġ|Y`3f\3 QNTi̕;]ȑ-Iԃ|glm!Fp꽿ڋ~3?g:'G8Y\9[AȮsxIE]+Z\9/ݟjQQ3U )`F+$eO:l-ĚSS% d=߷\JZ|M_M\xr=t H97GH$n{vF@Xw]DK swvs7sȰ#)FޝK*CDt{+WVX?v]5#Px#5"nRH|Ke 2VXci߈<ԔQ 2up_Jd#6*57i {O](EZi!?yPdHGW퀷j[Gy; 䇛7\=b]/R|$dE*4i^msM+Sl\׊0}f@cf; b؛KJ|S_o9v_æa#42C'R^bu)%zP|h(J.i⣉#C3{=[HdTΖbB%ɬnGKrc.ﶰ'"8mKFHv>;yGIN{~:B͓RC&"D6&-`jHzZϧ̀%"K5GȈitG3>X-_q®Bzz=Okӵ5NىgENx{}Hx 8Y2=S$)2+},kiUet ݕ3Q~ȑqbw'ꎸ35IqޯxL%Vױ1ݞ~uVz#JHDeQ1]*lxd7*Lf. [Emp!amBK4Z<&V><|YGu y0˙ @Q:P,Z Z:ۃp֎e[=:А8sUbjq/LRV&@!XkpbSH;Fs-|$/?ϯVFĔܧngP]Xӌ[YL5"vY q?| ? '+X@1I&l~vHt$,?򬜛V{UQKPc:=߱ʏOkSE頍w҄~0)\겧`{in17 "Be"/» FrqA&;@ Oga<Ȟq >RYII/ Z-}#c9Tj{ 2ce}ʒ[C\{ -;ɮXѹ3G3h(}V"ȇSo3)*­!^m&((m I&\65ܣֈRi,r!BnANaPᕐv pujΔ.W '~wVTM-ՊgAxJmk'΋KNoc;|DC:ϺV@dX\k~]V^F#͸e˖ӆ7WORpk&#kG h>a1XG[u~6#*r6ĄhuQ8~5oS!b4ZArJ+2O" EOQ#Cӓ'+a"ڱP]rF=ˋC4k.C-C]jl$Godt@8E ׌Y =a^0 9S|*;3lKIT!d 90o8R+haNdJU MCԟwղWwmZyf݃I޵{0.4Tפv 1[(` 0+MB HGCgʦy`>L险;& @p3ETaXSOR9'HS"+ceG}N aݸOӐmۊ1]^[b8S8x?P r==4\?*ns 5dyߞ-|nGU2H0-wL>kqw9JHH1sFIe$ 4@q^7 r u=_aq0z.*Sֆ0MSyo {{Ak\濫 ;뗯U@jvsd2Wlx 8/!Ø#V-a& HJKa-jPnj$s+|*[#EOTwKSnJp#*uݛ|5?e$!_^uU[0fhe8?OeU*{t1\ܐ{ 9b{ۆKQj=/tf8RW\op2\Yʖ>oy.]:~5IdܐڙDP~F؟7 *r^M^_f~@eвMALvŅQfqUqL!_?"}jZi,ږ'[Y 5'iN`H.s `ʔ<;,75.T;ɠd N$&f$1k&1y9"H[ 2in5Q2276\τ<9u31Dxb(&cѵf:ӥP@"baϙ(1tU_^ϓJ@ >jRb8$sbVU8st޾nbq遆s}tx3 . uᥳ ߙ, .q n'@ITWZ6n7^ 3۝+%va7Nv:M8lAk?;PTV$2MaF]`}lHHăЇ!蛄LU u|d1qHYu3HBq3PJ@A(iAéMtTȠj|v $MRV|77gڶtf<:v4SFzU'y@GrQ[P8X(,VGeٚ׊vxJ9/ÇDzkYV*T,pP+ce :rVB-PD ;4RR.LY@ K>c/ê42O+%c, 2yYƭ訣18$#|lLbO}zݣ{Y|n:[;"n;8d J-w$C%!8G`jP zBM[}D5/^l^)tظ?̼GjX$*&-n*7;8k(^)r汽Ȓ4*ʢ x MX?v M~xRfw<ŞVFrN=\2e/bu\jL܇wA#%$%LvK:@3h5] 4?#k O6;mr42'V>0"x9jK=W&7&Y=OZJ²qqq3ǔ0^mt+d8cDOHe7_(ww.ƕU3zLj7E)N:оt$E"A6'߇N^U |,t oX$. @ a&`VrY9H.]L`(]ln%Nzf*rPODP5km5x+A =M|*}h-H81vk-H֫ p_3Qy8ꄾ.YӟU WnHha**1uT $jR@ã`x6Ve_noiRmzQAlC㉎˔xO8.x{wzP|ф,n;ّ| K_63nj#,?y{WETJˡyb ab燴 -c!u ~[{mZ`+1O6 /VWnh[tĜ ~xI)rE~iߘK+Bwhkdpɗ{e}ONĀ s. >,{vrPn.$V\kK*Un7b RǗ;@Tʠ8ٵ~&o#M;oMGIqtO Q"H0hQ+O} +,nA}1[w hp+iqJA81TepY C'l*A5~&ۈڱ ؒgZi U u1F0 !M9~)JY'HYk'"izʀȇQÙ; [O}ʧckŀ&8b\[%BTDS3%K)ĈCS%Pd5b«5qCQN쇫3/uؼ8XsPnudzAױA02-Zʲ6MsJ8MiR9]x< *E9LE%.rϣj_b׳Uߖt՗/{C EAeIy2#prw벮NN"߱Wv%n)'{`9ֳୌsG5;o^n3`T+0\U%i5XosA! Վ$Z}Z1 ƽوkؐ0_nzkT!s֩[mU0 ՟qߋEzE'B6wwAQqnPb6ZSBIvɊbJzT ي;PU, LL:~$iNbyݱ~)XYFT ީabg^2dqHtFpV$Hpzhq߹]|[${~\~_EVm.ز0mB=E @w] 97 *2]pR//)&"bH.-[gV]|*5O:z)e*q0G L icIU&՛myHb4' ms_{8T415 ͮ*% “**戬R 3Qxs:bi2)ZL,?y+2wtPQD&~S LJ`g5s׭*a(s wr$RŊO=/SoZ-9=CJ~~mw5$`]뺛;+-ޖWå~㝹0 wx*L:!!xV_fgW4qfF#TxTD+quRUt֎5 ^_6B~Uq4} غ&+]DcB¨Ɉt͝|sRTZY2n3^p`m)z&U"gɫ|)m^ @B mDOY8V3ڿp7f7CV^H) 3m?_IO~,FWφ t4ߌA^zk" %X $rh`/qR6>29!/y'| |ttﭼ{P* $Rqdlz]Kn EɈp)Z 3鎠2,U[UH5wf*JM=~;1pU[jFɡv¹둽7|){89NJ5}"i_DyC܍]=|:]] D y6~i @e_)Pw"*4 |}ܫ<=bb_8sʈe6XɜJeDᕉTg<3^Fy;όiXkI:̴fj.ɲk1VP+"zNq?if^l=BЌJ!3~˿<<`=B8TW5f*u묭1{V"4> &U恭*UB>Ae`]*aFpDN_%֛:Mfi8i[<zx#\!9Է/]$U|02x-+$vδ9;PM~Shv[ " =z)ሹGeA1'nfJC+˥ruC5<  VM\@D擧V+V=ҕwQ(@}bYր1VnZdEP~WmwjnMM<k?޳[($_is67$l`\co#o S%:;Y~Ti WӭzÆ(/y"%%:Ojj#|Ӗ F 322.g?5^B>BU57D5!C19`lpԪ 8Q^\.D:|bIX]O5oϿHQb. !}8mDi2Tt |lo0K[_!Dv ~>`bAa{[mHSiZlJ<qL B (Mݘt7֡: 嗉fXR{aeۣ ڍOCFи2Z蛭PYw~1[=nڏT4=A9 M^DCOkMo|L*y[5 ;y,z\JpqFقآ7 닊.[bTTSj㋯ BmX~1S5IAʺ~[us׆T m7~-8Gz4<@rU󩒨EO<'AMnP9f S';\ #r:5&Kʴ6(tgRI$t읃>n:'0 Yӛu {T Jjݜy!f6M%:(lв4K˸M R_)4I]`/‘^{eIbnkN3oe-g*i9t/z~ں#0xӤNC zB6 .!D؇s}0UaycNuIz3^=yHnEDOu. O C2ё+RۦvXxd7p9:LC/+MؼڮmhJ?:6'U@t\T߀BԿ#k)p%.*I8f7eJ+ymc^i;25d0;mu12ig-ރr cFsۡ#.}hB$KYJ`WWs97MwGMBZ h?^*gyA-f󻆉p:}1 #hEc6lKWT#߲QF B*l޼`ssW~g8Z\N\ J K9Ģν&=s+}7_-.0U뎈 q!E|0KL| JYi̭t"N=LĘX/5Ʊ 8J'#T,/GJ34s^p%&'e`b,T'\?<aº7#Օ.)0~Fr߆z}qdYdH(Rq/"f͹K=HK :q^da8?0Z2` mW:%}&]cIMhebiEh'߲=fPVV051o|&&@jU+Nhso۫ UsFݎ$hD<ٴ8? Gp6tL>jT̼+3,nHDqy  . $B:߆ DsodʥhOgwwSSX;r83 <0$%!},Jh L"Z/Iabou yW :?@!. G)JEMSlH]'( MPE(_흁'O K}E0GkS^B+qrAuS|fcZta XAxTZ-sy!/"5\TV]UW0\0֎ZH#2f$|.9Ty. !JC"dnèQ.oqKP8Q b)򪲬j1p@%Ǜ}b,AZn' Er藱[FQ3 w LzoG.hˇD tt7IO/l Rg2rP!::2qޢmXS-,[ތN|8 pc/87eFЃX*у½: S'H̹A]MtӁ҈SGsc6Wy-,n2j^01ɜw䈝Tw%kUɑ~q A pDh-6l;XG_#ž|iԱI}A8]{dDugcփL8$H$ZpȠڪL_mcJ˝R=Q V,cЩCbl|X7+2gטo\,C&7Rh>U&HU> Bn վgrkiQjزբSʓYq0l֓z(X wS7B@f2P/o'v,3^G5ZnPe4Lշ~pnn mH!8ld@516%V:jE&@!D6_q0h5/{EVnc65])KMM0ʿ$F/UL(8 Wp<0'Dn2PCWRHx|`9\h|;UHD'燶j>$qaw*'9ܜw皸eV ClgC" +M[ >BXq₪RgA\>  d,FbTf |jM&RlU4D' 857͈j7 R;ol|Nщ1:Ze;ʗ\uHp W1-mnZ IGʄ5\u.t &Uq#ٕBer`4_<X HWs38mה3G BuxΠyWZvcV$S8 <My6XD=L}4Tc7=y3r㯀;Ug2gmBC2ioH6s3  ΰ}Wb?-i)W(Rѩ_i L7l*Ы]dB$EJM'8k`݇lI04z0X3]> l+ÏMK X9}䊌N;J߱NpT oGAKoʔ{'!H]?F+|\6^B+“}KI@ٛ ^L{b KaUJž;?!N#"{xu֏OWXaB'^yR  |ftN3`eo72 vاwd͋?E*h}V҆լж>.%-Bod<7YyD'zC(VzN2خ)ڷKS9B32viY֑M޾4pԤpz科>ns71U脎VX׎Th RԪ~jz6^Ha]?mwA +ѦTBl[_Վ6W#ER&Y7]B~E"qM)&m D@~NEG7.syZG*n3b^HcCULa lԔz۞b , q"Ҧ3]Teq:k!h{ɎAب&w[=\ElE0Evg37VC}FþEKM輳cYKm!kض5n14k^jG ^GD,)o,xI"$TZH6$Ֆ8"ID// LplǁN[޲) ];2C#JJ{MQ|5-[{u/*4Al={J8y͈GL8dj-Xqflp8sPq鎢AV8o}߼UZ%[%I}>& d l=M?=R836@#Wg!? =FШ60!k g[Mi_uྡྷ&D5D !n[J_i4WMjR kvFs T8X+mjB{jA 1NC{9h&EF nez1򣯭v\Y/ vkp8]R^%l`qk G@f]5D ~$K%CV wy&ќ(TaCnh(_3=N¯-(4a|RKG -Kb me n$IOϻFK?qfVv d ՎWi0MZ$5S(`;_jWttx`Cef,Ozg0x3~߃F.-BxOR{&>Ip;Es;Nᦌpdh=s⤚W#4EytCZŃTE`^ahN2@F {CRdg=}I[7Ɏ^HY @wa"[|s"F??(2d #g->`5s7.Hd_yXl=à^#1JwрE,7!#2y| AV;{h#eB_Ay+Dqu[vmVܲ\QBi" eaIF0Ƹ@I^ϵ}t6]%Ɓ^6};-,gsygY4Ya}#^̡? 'B4Df̃rGOv"Yq3nK BE5|Wn0a}O=VTT'F!dB=mVA90Έbr'&oCLi}Xʸvx}gdf|_k&U=F!˖RJ&jl:jEJ8%fU9n)uĢu1=4iKLQyrmsUCg%=>ٕߚ'Cϑrp^tGo Ș2ckQ={i .1-I 0 4ݷLaC:2Ult1"3E)DT`'f!:2^xȢ+w⨌~@7eY٢W ۻ;x 9Nk*=3i g7n //|ϓ(RЬ6= ,9EMfp~ͣnϙ@q!CBxggnڏx;a<+ zԒ4q["7xN4H2s1u]w)[DSBXw39\OwY~J,0L٨raO4 1Ɏ\;,nop59ah+NϐY*4d/5CZQLC ;z,9}QX0ZZ b\ex-\jKׁ->jk)=߾N*NCadA.>Hk9Yv{TanSflB>d;)z_i͏~U8Q"yw>tI0ha}M؟L︩TgsxJ1EWKr\3睟ٗi3u"^ Z̒k+r*;u]42V|UG)X89c?5vM>2$F_TVhi`>>4ifMKT>q?@ڛGֶGRoгGIwDs~@P?ftTF(KF\%ꚐCFp\.1P܎mϘd!B$Hfv<pn[|dW5캘Cy,x&%d:}lCEgy/` 5gOT@]OQ-5U:B[=r̉$މlTF=\?w]u%?Y^[ RaNHik^1X}،:ESm>U 1ƓsIIתyHX.i#ӻx;c{O~Z5ynZz(U^‘erXeiL-`Z) Z2"~c|kf5-2kk++ syƶ8hraYu+w.fJ^szq (24ɦB֙.Q1@g! 00b%@Am !3.J+o-'S/Y(5KVxĶW>gLgk [ *Z>@nwP\~QȉR-> ZdP'lAbQy'[=57)qL8ө7k; O[P(n)rR1I{n -V j8+ͼqT-rg3u#A}cQ|^'9K0z2 ge$׏-T`]\ ĩZ#3|goQJi ҂(P Iu,HUW!2h8jT'zģ% 55:7مZ?>88s2p6т_]O$Bdnf⭉n7?tz'}5Ӫ^'os`n]/>BfLatS!-B_f0xiV {-Q6At*Oo!N̈́t01vtIfX̊W*z :qqfh[=ZabTyT匼)? _[rvJ I'-l_0X۲{<Q>]᱅׷Q*'@],tr |:zb^0I=pY@,6ԭ >P BS48I#c9Z85~$NU L#z3+>qv}ejPw}c+ rz ηNXukj3آx1`$~=[R}íQ$u-];sā2/5U+oJ +v_pN?#}FQaõbءXe$ t35oH~L[qr~ll"v9iR׫بiC0]͖*cW*}Δ6JLz=:CRgɴpɹ=84U<4*sHsWؓkyE 4Kvdr3SPuue+5ܭ+Iئ̒C6q'9Lrf56(_ⲕrkMޡ"OjͯFVё2T*U?^9Uh(3U(S*B[K{n~wE6rX6^]RGmel'Fv"`x> ݩf75*n=$@%.Z6OYk2[y(*+{sR7o# ٬ ˮG' ܍m76,ukDuF\)=h1t bcEI~;A[yIد?ldfFJfm|GoQu^F JѮI*0K~_d2 (B:jf`97v,^[e8nveX+ Ǿ^̓SDXOH$Px,OEI. JIYv֨ɞ\`7I=1o-@vjsV%HS}$;X)F}Vz9(\TNݼPˢEoɅa|zn*yM|Y lgX#MKvȱ5ԝa> \jgJ1YA//޸R~ u,NP cI0: sT:w=ѝ~R2;.%R*ڞr'VīTbW;0AN5Ľu O4aT|/orZ$WF;Î; Xz{:F=l-F9Tcc W+z\jm髎}]J,\'6X0YU6ZgoNp%5cC`~sl ғnu+:]]Tl{ t&\e#˟q!{IՔv'}Es dwz^?a*J쿒VqQ$h,~c/uMG%MI$sF`^MvpV-'([ Trsq{p nk^p\_ʒ ;)̊Y;4orx"TF,fbw-_}3 kGkR(JBNƒȞt8/'{ϜP!]X0{:.J='[#+~/N7f_D0Z_;F x|8J񦺇~+ZN5F_q1`5M,pʂ7Ł4s"$=M|.";^.a8-(X!vEz/EGnwؔ>jPj*Z+F!K 5:xCp5%CpMו5\:ZKlډfdvWDJG[". VqH24Qğ>7+8BԪ+q5_LqVrce>93gܬӮYʓb})u^*tgmqC 握o򂳻+x.K؈UKxlӉ C5r:Ka3ң{*siÂR{ESn9T1J$f*?;ߢ3{|;@|0ۙ*&P#e`Q0QIr+l>8<;~Þ00 t%oSs3l7^iW0M4>>=\t|4R|*'>[xaІo=Îzj}J ZO#J/fٛ*$Bm$YҨ SJbP滅lDgD/y&1}4t~D7߳ZH_Sz2ŅWn~l)%( a͘Uk?- j'-D ¾1v^ʌ/>H4JLKV>'V_eo$A;w:6@|}PGhAlEtݓTF~bhA)$1bd3{9R0d:v:~"Y BN*Ԅw|fCMFib'PV:j fb(V^ |>{Hv[ M-1Lum,ȒRQn_yFWa'y_Kc;s94Į͸=\`&/:CNw#92򇧍Hxmlj.ϯ( Uux$7d1:,un;Yjs`\ { Qۿn:u|M dK.$~50@OZ@y]bMyeҭk/ գ'cFcIH| 2 2!}hEqX4/>1;$~ "ѠXs7vu9DK \VyXO58c焃SmաuoEOyk|aJɲ?G@7$@ͷd]Ҽ\j1l?ɠXUgc@'Y7;-b6**#m+bg1⡭Ky_LH!bJ5J> McNbPh}af[܅]UMj15G,DUS~D&E+8ksL^*ۺ6U/y+>>i7$߻Ypjjw.X\wDZ}Ǘ1&61J5"\`ӫzLyqޱC1Q_mZʿ3'o.S +eJ,-, h5MF!0gզ@z1ҳY%7lN^uÅSZ7\:H%9.v( aߡr<=2ƦQ!G~$vuHn6q쓁d.mfS8Nfr1<(ףdpd!-uTs3 !1TʂלalXzReO~.}hD(I{-leYhأ:y ~,/ -26 Oo0_eeMPHȗ)ծ" !x"nCh԰X7%UÉiHy _,v r$ HL&ʽpu"j99=2Ui-/;KsAkN0J0t3{y& Y{vHm+va0_fnERX|"A'Q4twL} iHzpv?PJ(3瑥켩mܦzn,>"~8KءgvJi26Hw_^K{˛0#=~rfKȧ/Agp3XhNG 6d񓆥:4չ $[1J{8E"WJ 8?X}[q)>cR-w~"D^n;ሩ;:8>7z72h;Pj(-՝8Q*-)*aѭ1ּ=fд'4iPHlX @U1xgCN;+S Dl}WP:?v;u<#{V<}+PŽDJ2/@CxD{$xP0n)zF}l_9a6v3O&&N[焣0Aec,%:nPFg~l-XsFٷ1IܧDR?`a~Kfplkti~0q."fNag\zӡR*!m6_*6:[m4-TfsSP_j"c4?ܧ|KXT!6o"}cUͅL̍HL(x\ f;q9CnaLR1")D)+N_.5#O{`0W+OŨ L3GauUy&JR H{g!JRYLD ȫ 푷:g]]ԃMURQ)`&Nz].MnIT﷦kű5З?%B5ND"os2{N/#?^j.' `ROA]]o'G t%UUԜۘ1j|2 8 v|:c+ ' wWUD#0RlN4cGm-{A*Rz!s~ģh75@Υ⑄:;Fo6GU\h=cu;UIoAca`r|.ln>QɌ7x⛞mwz"S̛ur+!dvDW.P.FOA2n,SԜ>uæpd^$yALm⸌&iJx"0aęoFu x3n&!ܥ ʹ(<c5ЂPK_Kov,Ӡ } 淦Б}6gD.hׯm&(Z&sG.48y&Obdz_G7 q26 '%Ε슗u$ ifAB:(C f[ܨn2Mh K$ԣ~reE&mh8&͞9bq;Ao+ >p,MRq d)brKbT9ٶf4I Jϔ!hk|~X&sTjzGޜ|Teqs VQ{rP0]MA&"_}Q{ihXfTߠ|N-~&|Gpao42-g)IgߝPI\ N+R Ȧhga,KURQ(gM_QxUzB=QuzIGnM*PI'Nu7vWk lJbCCxw oR:cax U(F#xɾf {{2oqֳHvHb/Y{NpЃ#JD,δ~W36`ِԝG>: <<-%"`͟y49xGHP\! Lb~A+HΗFb(!,ՕQ [_lz8d%:6HjE|Qѹط<ӕwA] }k|QoIv9vHD+gP=B<|`z0=4&lj֔  cS^K\pd_l$ Q? 2AƮ|9GFvMST:L2-°Ga-ƼJtCVU)~3eZ~/>V:YW](X=HK:Y7g GQ^ .GgL홌 *,)`ܭ9 ^W˗ 1ÅL,7%O;kqZ#݇uƴBCߌS&-M_:|7V"(zS $_UԩK=ZO;ו u8T0wjoXׇq l?LJ)Ɏ]>vf [э-)]$!/wtRƵAG&mLnJ:2.nM9 k;qԭFcw0s=Xt|jl|  9ݬӓ3ZeW=]ȚoAOɧoz?t(کj/txT%}#Pe}k''\٫y& ǣ躁ެ^˾$oZXT3:T;֣kġgNmˋ >yR""OIgdbBmC[ `ZBbfV/d8l\xWa SjEgv;%NY9=Fgv&հXVVb$ V˨7NU]}Z7|3E\ D lRwh,W;>|fLfV0!thXDl1>>hyr o/()$FQJI2ik<|bT7' ~Ah)27\(SYb~fQ۞i7bI] &HH \tyj)^>1P֠/(8 ÃԦ}>xQcHv3e#YZfYtV}f}s(g`cg)߅R Mls<~k Y|C%ȳz>5[ 9SDz.cFeۚϿS`5Ao #?C}֥քJG@﫿x=ʟXE@< >.kCM`p [eH/8?F$ZQA?5JP{Re0 ĩџq~HzZMcro!G*r!\ ٕ."d Ū!m vGB0+\ZwTÜN]b0`*J&Жax] Zy6k gt:FDW* Q0H¢X",c-jC1; {;.Iy6sJ8hc[̲Jk >ZBh+u`je<,"5F@0Y΀WC偦|kh/  Gģ#G hZw< ]&FHHN\?к J3d">I樞Gf >AF9h~hZ5'mɮ$Z>5v ˡcYN;?9/Xխc )8-Gv_.?D6a EBtdQfa9o 5,E]L(Q @p唃3@{Qۅks,*0^`K bL.Tdr $RfP.Ty+l,[KX i{q`&*( TQ!3$X 5H֐m^82Q+s ^D`Ѹfb1B֏ĵenLLtL}dzKў_O^|_Jޡ7T/kQLdqͼyy/iw SaeXs_j6Y<9 ]х.`2" WDE Dhn--\=ʯ>J4Nf* b[w ȅPoiOfPFvҠ<*jhk~6|Wx#r"lCBI_yC.rw/ kQ$mcmlhB'j,/O?gt;ON ;)YAt+ hayf0 ^1CgfV_5UekWh B%$Y_ 먺ۨwd&BSz|UHH}XSa]>܃;6tGO#=똮84^goUs; F9+Ձ2|/v>օz6H+d=V𫞪.x<Qžɚӻ${ɚyMSC2ajzpu&gNJOW\#^w'n8!q Ulx*n(p`@p4q;Z!vɴ_&1b-|h?aÇ`H1A(~c~p]zń&"#@ mvTv")ش!$tҩo<'dW *31sgj[yMّi1HjH695]<ʋ.{n薿aɌ/SZ;SNe# _yBhl(y (I>&S$)aI/.qRŪ^t 񐍢N(z`d՛ʖYdfrP8A HXSYO5 JP.~(n^@j4, 6~(*]нFg^r{2<㧵>10U_:OP5t<ծw!] |NEY_?\࿽@?>h{wΘ}mv/[l@fQϡP7*3 俥M(hӴV- /i-gԬRMWi OE$7A^l8C8-RT݆N2 +c &^k0{A|w(4ϰ6@J許b($T񣾄 bu=yP{lH+$n-n?H$?Eǒ|u-cP"G) hJyı[s?f]ԏHgIN5ܺ  M)`UMtjfhAi!.B"-ǓOv1l!Ep=Ό'56^74UU1_Dy&DfBgς)s{9 đA:$ڷ}Kf[UڧE_?LA<'P 9Jn'myTT,c2ѷL.fn:7ѥV,H? lk(9 Iﳡ- LmɁ$`=[FHU{1,XD:TI[0 / 3ǵp#`r5 Bs]oq7!~<kL85W+R iCnqj6bEtbK?rW4؋W])Nu/6y}{W-%ݡ_o(!E睗 _Q:v:^AvkaP1Iߌ&wlR鄐Vi.|s$IN?jRﺭm5Z_J!F-8x AwM'IwR5Kz5| obi7Zf?\ =2K1xGH*GUPFlRBVƂ^72L%\ٙEJҧh+׿ybxJGҊWY}~^Mb//NyRR%w|V*Λ 1_5e͏h 1$V&SU]xP^g7Iz6L.<4\-^J\)F%r'MK`4yl]%e%|- MI/9< lfigσ8olFxR[h<.8$9"T^\Ynۉپe5s܍FW= W9ƺ>~'7D4:t;`P}\޸54 iӃh{?B^mF@4LւN`7^YK}=ל~Z$N?KY XTeRRe GaZ7r q#uLΙ44x"@s(^igqB͙y>]R'ZTYa;E.|2Her׼ "9lqR [K޴/#% 2InvIT~5Fwfv;E+7RF4 aGkR3%g LÞP5zq1QI5a:"Q$@=0n$254d_$ s {K 7nQ`4,KUjF/_cjmkwVӄObާvR&x"$ir/f/`H8ܚ'(0^X'WbD A 'p/7VIJfC^Tl qiJv}w4~@5n=ݥd9RRuz3 rj!>::y`2N5x#~ŀQزb@υ*+bKi PdT gK4{lU(J4KYA|rjY*J4[.Skǖ2fQ4 7n6߰ɿz >mIkEYzAݰAx1yrN"wĦ2fFu_f~OZ|zVڦ {oqQQ ): qiR{Q6S+M+<"WЋrSb)^k4ŐPuY*oO5éSWT(Kb*iH72^l2p6E$A[,aI] /#j kxgύ3m:.0 w%ZR6A($򅕫<.e#7.:U9@FiNS?"6UZ^rklL݅f0ZWwOyĒ7>TICȐ]A{ɞoiPЂL{5S8=eT7VR$ݵ匦V;+*mv(4bMXjN?`xq~x6daCiYRDohj͚Qj? ݘwsSJEZ_`q^S&II?j@4fX.:GI;ig"M   __"+ K"n,сHcxoo3W?EQq' K>1ņ*r`D=hu{VAiC{+?9XJgޟu9/qk_`Q~ <Ѿ: ׹ߢ@%s2M[6lӗ`kr.gӢ[rD;qKkwdBj^qСxԆD'4އϫGp2r{8i"W Y9ՖxxL?"9`Зѣb{ 8Kx"3ѩf vN<'\blf5Lesۉځx=tBHľ22,4@![@@g2t|0.Hy^\u=%bcIda1RԼ ^aEH"!0# ʋZ"O4BzcJVߋ5!g: %uMM\aڢR_!TT /Og8i<P-Wǯ.AY*L,p՛3 )VD}#0;džӟl5p<0 dU!Ro_f7£(ԭ'Cta-8ꑼpҧڥSeJʭeHICW+~A&add95VQ$P" |,D,΁v~ռG\WhdZ[9AM`_ 81irج+侜D!f.G7!p+j]& a<;2 ֠əG8WXR\q6ՠWKv/`"*59\oJ:wrTC E{}MFJlzQM*4x^Rnr3IӐ:+ܡ8p˝nnHkuC(4կ# UOࡎlQ/Uo vL?tO^4"D_ ?&#C8,G!E918VMHh-ң*IMQQX#FB/(h"EyN>lR]Y 'y4 #C+ k"{jfyu >8;fޫnP뫢i/7Er"zѢOU$b5&4R4*BY9tXX ^p#6{"K|yY›x]&,IG{;<}XewpjB][Bgj{Pzo5n/WJ&u;/<>.S/_#ɅhetɈ(0Ƀ ?PZ 8exL[SWer&)F;mP5 ϣQ"b2}7Yt"qDx\ :#DQ˔ ROak$xvgAwaj=*X[ko ʼغcո`umÎgP :[$S8've& ~VrVۻ/I XA#4AUnoҪWrDŶU5hRs򚩬Px۔3B%EAA2&{hQ(zMמ~]lzU4,%kߊ(qZ1SՇw٬-q6#q-<ח3dz?xK1:)]H; LFpz'âFx[upT",E!ʢr ~z2V$ܽ-T}-eǜy1r&/,{k=~Ȉ> rFui%]P n: cڇK8 otQCeJ&ʶk Vٌ %.Q6ںCcz;@qvV.w mH\58#[ ٧g5( v+4:v_Vxtqkb@%^zs?[m[Ʉl7 ļP5̇j-vO w]*X6\)S {ןwU'ui\[hD{KRoZ0=@W+CIx~A 3ZE 9GVƽd8CJl'c ;Z+"|ɮ?ڜ`Vb1ڝ?F1xNGh-+ ǩKR|rt{RcVx,qh{ߑow("LmBRݕX6̵Ъ1v' {*6jY~QnҎy9.٢%60S+ojEkX1wzi`2 uɣR+ȴ[@s:6H؃]HtAdD>B~5ݝ*cJ rrUph,F\K<!pWǶL׎㗯A7+ e'I;Nsx6k ̂EzHx;Q.of2Ws)ȡIg iޔl˃҅ uӣ:/e]Q^}Z+ᴔVbnLY-TESki+yݤy(;wRI'5<3s\ex+A29Cӧ)x8YsE76 Jm8?|;P3'}x)׫R1F"Yz? 7kKX:{ȭ!8Ært }OաxPn_~NȅÉ_+}-(,h, | R21Ibk)tǏbA ͍J#8ԏ2gsYK܂$I{m+0cWPfs *5ք=CT07oإ))tV0ZЋYiK}d W;^5KMMdRY-ԇHG@@Q"3ϊ6d'ze0ȸ4hwR) N\=%r\VВ©i4>n@$k*OOp3@QL= ^\D3툾o,ȊZNCVuyb<>۰൒|IJ(.'Alw=_dvXI@{A-~ASc[I>z]{is]t خUjh+Ru]h׫-DjjְL`,W|(Irмna}@GM sdzukvKUAc4*ټugiG*%Vݝ hF 8F9,:MX|Hn<47iQ .h,@)݇T|_R#tt/=ZrY>?8dYK_lO>&lYx& +-W]<}l(GΏfyENr+UUҍ(G|H@q߹~>edY}ȔffM#LbhZ|3a䉕 0!$Qlt1C2W4 BG:"pU\APˢMY(@L<uBbapy~H]oK 驠3Zj2:#ͪtnGg9cOSK֧^]lPH=M )Ͼ½ l wه[ C.ilNJxӭU|/!H: +.MS TL|\]_Ꟑ;E]LW`X0Tr5:jNwk܌\b!4z7);\! ,w4q:ؓעL$= #O:T˰0K$$rS'+Ja3Lc #yHG$}4C~ab/dxq]QagD;eϧ7CXH#Rc` )g >@;9(ʇ7rt} 9#q.I?02"ݲ @7E spHF]-U.FĘC8IJi}ɳC_0\hI7p;=꜇U?I8>>iV d`qdo.O2pk ӵujE8óynM?y ^)wq|Jzf&S^"\gol2M:i՚SaN8U7Ұ`pjVzg=²\g=RmK9+X%z@I}Wjךwϸ\ S!j!PnǮy2G6]F'?[RiݘkC⑺o4]A ʈufr.i0]m t?βqFfz_N GN9F%t8Y66 Ulb 1" %)꾢`F'w1z"V~%1fdژ\KUE1fĞ} G 2l#8 FG! t2ȗo7*S8IEU xҵn%6Q: h)lVyTha&t֩ڽ ;#ӱ\K)p"Wi_]5ܢsZ+S>ͦc[J]OY1JM2dȩxFDC|g:+8T9j0ئZlq6{Er~/^w.5! 7i7|0 Ew9db/p@O Fu1yķ@Ӽc2 _j2+t0z#Ѵ/9b[;I%v(UK{ɑvF$RL Mh]Rg:lŴ}'|BR? )0PDسB$}=d9ryql*z@2*t$'zP{{5 ^7DjZM,rKZN&lSIӃ{G8ĕEprrTR!t30k> sqfpzI["0(#e=p !p 'EkHnAU-^cMV[iY[f*b_f٦&_]yD]4126WKI =ǖ.ƼB oJaÉ<7z*1M_]qiR1:ދeWA H8jO&y+sv6c>VPAe2p/W*=xM}!|:T`zs$r3B=~Rl4HP}muEƲoMO" L2"+f mXb0XatñDdc>y׮Jv%uJP.> HKe1gN$7!X0vdL"m T@<4>̠o[1͠`o =v¬{wT\Z騔RPc{"y1\K(cܙd\WF]Z*;eU5EH[=ݨ)H0pRsi+/`edpm"IU@.\w-ί'Z!D^=O)"'L:l:9p0p[>S!EXBh@hG9̊RB? ےV#K`/}ǰr|ngwSт]y?l ADUM<=IϿK\/"l Ou[A7dƃ[41 ^\'l$ XU^m`T{u;WPJk#E`}p |>ړ)):9wkךjh)*nOGA}~ѻSoӫt-倾%@dۉ+lмC_>xb,­ћU+23?-9+ ѐh(WK> /ԙ^:~?%L&vrR\f9;rt]kF9܆uˤre0XRT1zz@˜.BOH9(-xg>xɅm+x5>{_нq{?tp)SqOr1iAUܯX"(st' ҉Kzu@ppO3 C+ZyT[@Xe%e󋷨ODJE[\9Gv .I#"F!,.CJ3?Fz3m%W|vX|!YPh@/fQٓFɸJiEHHB݀kT ֠eRͬN*v>[ WT_4h (E-4/CWr菠[|af&AH%̻!U7k}X>M[^ߘd~u]uxfdE6" fv:̐C*h(Cԣ5Kֈ>P5%OύFU?RyKsoC44?9APBmZFHOHC=PQˈ*F,iT;^EmqG%Sk01FcQaߔy 7m7/ o"qEƪE:f?% f|m~ݿ#LۺaW{s6M ϓGJfR(*ep-@Y˧Le2+3BlQ*deﲙ Y!rZj[u(.Zi[P~ {s#Y|\aӱ싃]Uatٝ)zX\%A[}vH175 .aiz4hF-eOw`C~pN3~&Vo\]Ab#p]붺 shKTAq Ϣr:Ȉ2?ST/Qf g 1lۇUp/=6h y>glvS8/\=L "Ɂ ~"K0]n& H٣(աo[gOl#5$d\yHqRԑb`&UodкYkd{w5#aDOv4w 7_ɟYvl6ʍTM+,T}}YҫU~@nFY"%ho~٠_AS.pd  ]p$!JVU :؛]&= /Ǐ?+fkk`?4|6k"DtFbcۉ3NF Ԋd&.j[{`8[$JeX^QK@osv#F) # 9D TK&axHXA[RU7_KsK{Y4w bmo:%`F1XRߞ8dXrBlXXa,b̟Z+@/|G"|!DoH@Cgnoے8Ss[x貚 Tgkf%O%@d̻sd}rgnvՑ:"V()u*/VvWx*`w-*EWQЙQ ӡ?>L9ƒzlU@ ]9$k1169l+by QQL'lfneUFf5FtCޗG)iUÔlS,NY 蝞,rZe8@|&Hթ;L&x_RVb2|D0\ 1%tF _^d1l~2`*֖1R-PǕ0]Z0;'H+iU I.\G6@_[\ndC4gH ۩?Y|2rJ/(m.sxA*M씚;Yھk౬R\?ҜuE)dgջY-@d_sM$'l*?J}e\'['4)Oj\y,BA&&2m&8 s(p/¼z˶FwgSd۴cj* ZY&D{8)V$ݠɔbd&4_D$Ni rK:@JXLB/DAY79poQ/9σN%E[Druoڍ; Kd{8Jt0E2^ٯ(ĭs:غ[Wː Lnjޒ[ן |?(I!:\_2R{a}eJ*c-Κr@$JZ26>!])"7Wܣd݆:d n7;7̋ ͧe3,0[H4#Lu>qiblvl筂ƚ. F|!RB/sSS5nKRKPS)s[vc*#+[<tӿb3H>ӫvX`j|ߐ'7ASˌfC$ #/-EP08b)#jrbp; {#C_ۑCggԶ>c<~Eq'*PACNU'X^sl9@qP+}:8a398mμA3Ly!Bx}Qr̉>"Zp= rlHs#{CpV.\nNB]"8wWc V$;Zm`RNđ8Gwbǿ^YxDjv7'E6c#;A ouedi+a.D!e`e掝#|VHbmXSV[fX OgD2dg#=HUɿP!DN%J`nUeSsMa𳇊13nWr}xhT1s=: M `#{LpP JcEЅ}fFz+>%0])t'QyM|#氷D(r4sw5P`PRIDΚ7BA0IGYLj72oLN~3}>cth~gy$YSNܹl|d<$xan=A<=DRJ‡*RR,-hvVqWlw- Rf Ju4yB)|?,e qfa`MUi;挼J N61R !(%a$Y]UtqGDټQP~~IB; T:Ѵ+6;_Z^0ΔJl{0ٲ.oM'OWe5P 훦k؏Nvp}?1Ρ6#ATGuGKjηA4^LȤ,6AЊC~eV@Ƨ5`VnM;1-#,%E4$-~L҇`[Ym>Х4Ω} P]{<ܖ t^V/`Fx3PQao8{ 奦m NU‹ab< K࠘k97uq3~9 εb$G݆]oZR Ѡ9Y5X<5".}jJV##'xet}M\919]G- Iw ^^frR-S `7kLU<ħҽQ> Z U3 xZG,oK1cgL{@3dKrQg7`[ 1 &C`jy2O6D10a ZU;հO*q~7D-> xHI7]Ԥ·l+=r^eOE"? oERGjR} Mh<]pL@6j%LОM01z yۅdZ*EVҡ:wgBۍ:oA+ڒٝ䕽kJW9jO('y'VCNEEsPrld_7%@{ul1!\f\ l7,pV׭_[cYt=pT(ܶtLnk[꜃XEٍ \^8Ӯ^i ÷ӼOd WhE}IƥXRmZf>3ɽ¼#*Zԕs"BKU_RlVn}*%D"K+ q)Gr/-@$cVh#6q}f$ލ(e~ nqix~qiNUiø)BWI$GAv8}@PE.U9]ͳK"RTqgUp]4@XoNzٲ{VA&>O]4Ig@pE.{l_poƯ[C}ߝO`2$b}A.<)ǘTg訆e7I}l*!@d6߂9vwY**J;)XJgnXDۮ RMW_׆/n_*4X̒ZM=_>|c^ rCs80Gk)nxQO~v0/쌁%Xt1Hri< 5.FM$O')Qfe5l$+eHdL'i>KJ_ =Fh@X!TϘ W\`'=1X >O)f;z%<3?+~Gئlۤo4ufdw}Tu d/e+Eͽ˵T0u4luC,٠hҵf3;-kQtόlTam͠ #b~snh1vJ/bTjcZ^N%jPXZyyy{W 6KyԌmsĻJ{CyG<2J|/V8̲?;t EYQFtr*?it*F:r}lCI>vp䩁Y"n=V6'*%w1c᮴XedGf]C9Zw'c{ZY%N,iti[RwV˺_Q;fd~isjRfĔ\WF*{x=zQ! Pe×hsϜq0+o*OƅɏP+Dp\lIG`wބӝ6jET3\x7Xp&`n)D kdЂ7uSGXgCl@7,:5xbxCrYح8't;a7ۚ.lp {5vAL:>Ne'yYۺ+j,J\{eVi>m|\1O,&,⺴Lutefk"FC&_W#C>z%kF~`P "9ꀥ8VH@6@.Zc40Z12q9RAYfJ?3Wq6ef , [(L]cX̰YQWPSmM\d89_ pC$t6#聢"=Zܳ3w|ܓvBo"2%5ϸ9!'҆"}=p)'I`˔RQ9aEt2<YW3wb B<@vNʦr:)XT$,]^ sGG}\q^ v9Mm/Wav. ۹~E1IS.ǂc0~`3OcTVQQǧ/~Qh]wP)% 4vha5Z%pSI,#r9rj)4yǻd=;= !J\$kwbQI7~ćr ̛Wuxd5Z:F)}3!U.G<,UX“߂ICm,FvD0AB+mstt5os(p9smB(({i ^#GkyyГmޯ& ]+lR\ݎ0 x&t[X!ZGJ+UTõ=8Zlxp5]q8%z*/~es?H}q9^+jC.O2\dbGc 2x"fS"`|-6>SOqڑY5 |0KBA:~5}Ulh?c޹5Wt) ^l`\ >d '/<>M>CM}z˯c ͈4X֔ B-N$0!ҽDjMP~NQOK(Ж3Suރ0mw2Lҵ\Sd^K14*~),$䦟]]PW:7UNJqRCeSEwlSI8CByKO_!D}Ȓbr> $, $F.p}mtWCww;EiUdD;Тq*W *#d%<ʙGL%~lx/c10/6]S. ~aM ʸL̔&w-Q^|١cAf Ahug@1O@7G2,Z==Ca˚+rW$7L޷U~rI+hm[v&JG (7>*s/8..`(F-H{|DT祲;[lK_s|5K ϸ|^s2`WDl٤1e})۶gB.ӄΟb̮%~8R rl9s5E+HweGصqەg5LU9`:}΍ ~) 1;#`(`gck>v',CO[9'T M+lA&X^):;9pVWf2Z5) vƔ2W<.p{bbLPgo o?4;={yqH"!5l>\A|jzR`bYSE)+ABCĪ?,$d4wsǠS$|-]:Gso';2-[g"{_ 3BY+DSɬVq_Ki6Fc9&j(Jүw"`..n\&s`8JR̲"GE~۔ Qfq5];{]$V?#;J60^0=ڊ!@ş9}ޫjY|k?9f 6:Y_t2 \tÂdA-=L@u&l9ƙl\oNb+JBY]+iu%fQ(\[͋~4F"L~$Q+e"B1nd1EPp%&^c/lT-^t!AgPㄫfQI%\ h1П֡:rxb_ =!\Q2f)'钥xsZ@Uk0nixmDMox (ϑ7 |;N(_|R*Po5@۞:JiY1 rb|=ѣbO=%0ZdF2}C.cd0 A5rʋSAqJ1]'.gMWtHiH WGes{@>XRcG +;4OЬG(O|Dgɰ㶙>\m|sM"W2Wcz7ġ?u)92=#J 'qoO9= , F]E>P"5\b pa~11'shte^\\~:!>?ԽQ|3U6#'5-= Ӥl ;#P1`WHm m!I֭XuGnRϲ ?">z>OKlrDoy.jnw*S5NKhnfm`_xUkiā&CT2ãAHnl.̧o'BpRtEñ;ҿ_7,ݐAEEMZ68眊R]ȁc')WuG);NC@g/C(cX;VP|x*[$L iXPZI+5c1TY_=҅w2fdTЎݩٰtڝqgN}ti QޠXkI8ipϠ1-4*C!M p$n${o<3G[7 GMh>ʁliZװ۔lg~%!qsONn}̓hGD7VDѰӕw4 (,860G2p= X*~}aW09(t8.`񋐳 ?yNn+R?s|LG*ߩ-i~#h 5+xKJ=ϱ;a1vO-ljr!3pI (L?V :Tj/5!ty+V֦Z&fTkL:I ;xN:f UF훼+.k7Ά@bdj%M/ǒ(U~qB6T붔RJXX[fsr9H4!ZǒW.y>uTFQi=QΒ)y{=z=Kv1Ry{\U`ffvrÔ4-&'^L k1!;aSjJ--SM&-^M1uTx"~H}q=ĝ 0-2X,g~wՆsbRт Q-iǯ<{Mvq' 5SG\ҴLb(#2,mM^517Yxp4Hj"Aar~ȧzu%=ޜYb"J!=-ߧ{>2X1n+0:`KƸZf:0 =Kz6$ބ3e"ł&{QU3g#RJ)~]!`n{4YlxF{~!(k_Z*,3(Oqu\'umuS^ gJW蠜9(A}w([9yø#J3p0v/ZHf[w3l#bPߨ?P)L2y;;+X^qpL1gqY)aJ}X((?jźLDUmZU<' H[%N2 [j-ijހ\ nh~)&í޻צ*ɓVt((op0k(SHU/bV8" l"(O{p↤GT8ȹWc[kH#7Frx;. QHxAo `% e{MԂJT2ф}~՗f.NrRy§eJM\ Zt櫠u0 @2u ጊ3kdn#"ݵb) ծG:N\ <.jIoS_@  Y}B3=Qtuj CܛОZLmNB+y-뫝YId.aRr -[e7W]ԞG9"\5 R/'L\Gl`\/}atPkwqƜAwHTHQW/%o4(kJC8N}nMV#θ )<YAûq'G`o`btST<Ê{Lxb،-+CK/ު<@[5K fn ³BB(?dmzVJs_ <& B8Hp7:E/Gmt>xxQW\b6*C{X/L<2:ɳMr%%[2hq$WP|#[?!Ub+b&|ltד7(+ثDf\!_}!Sm-&0}9z 0.Ƒ0c0ja A=h4BPPD*)s*+qos Š4lL(491}F3vE5ÒIyPԋbD*b$  YPk%̏:>DdJ}:/7<0xE( <o65 5KXԃf9Y\?Hq-7aX!g"ư^gTUUӹQuOv5B)1yk =|O1˙v,TXvBďíCPWώLEE&LgEb{ oaKDgmStx]^?|lbR"1mq2e 1:mb W{`[O46Ln5}Hb*oɣ$oDl L0Y>@o 2V&e(_A &.le#}GqfFq:2T-4߁c\1y _.K5{E;bmf\AGdH3/~չHwt jU2|@gi(F|#A| *҈ ǯ巙o+7H8ZIO azu %Q-VW>!7`Dy3}$L.ETTnko5w-e`|α)tUq9;e|bSg8(^68Bb=X;bsHϴfx7h۷a\15U- :Ee;j$~%VA&cqtQViG\Ѭ&XZ3gX-hMQ*m z 'bMR6WзàJV0NY"I ї|akּ,/Ί""+K3@h2:s2irfO"t'Nakv;*V0$w`i9Y=_]R)/X܇y翢xL6xe¥L[8 +MF=t([JwDݰszH !lFѱح.{J50 B+*!_{]pt|"cC ~Un=^PyI{ꆳ+ 'CN͞N#hk(d5\6Q<#Tsg%K"`bJ>k!t#4 ho>o0zzygs *>Dsu)z29R+Qk휐O0qD;r&auj#BL ݑĥ0=qCʒ._i>jh2|fS`^4*/+hS#jIOa>5ySHi{9]MqvNDA)1%s-rф7A]t^f7eoEqZ}YEm~p53G)h!S"՝7soك55lf~(K2aJd(htnA9 4K4'G?2 Ƞ8\i(`-z(O$m5VfF 9t#CݽQ?:{MO @!}XonΉ@fD%uF5[NlCTuT0+&P|M.QEYyg6zҮ!O_H++h!|ķv4IJ9C?.HKk FLUI: wIUt"aI#X0:T.m0Uղ6'qc.O ߻i!w7FsQIΈkR[E|"V<3%ձ]!#Aoڅ95(XQH \: Ğ[fc՛a'KF!/^E,`T\c ߹1cGBXBѬw,vOi XƻK&ƙ!@b3P暯is鬀`tr,f1 wSNP]P^FٖtgɳHB1<!Q(ul3P@e;&Y"^<}DslA20%^UFpivϵ 46Ad,rϹ"Rb՝?pPEa cx$OH|YH=.Nct"db>IdT_ZEP`;OO۔dM {^ pB "hH8 %(0Y;f &1܆8Fputg`Gdp( 6V鷴<'O~($0#fB|b{i&0M(zO/h1F8ucA^os6^y3m,Ɠ|۔O;~ == %Ӏ8Fw!: ռ)6$HÙ)J ꓥW_^2j+Vt%,<$ͺ`;ogYMEU6m Vlw;Pr |Z0$!JKl1XhA? e;7oW}6Ռ2vȉ @HfB7-jg܈kQwBo pWcx~@T\oD"cǣ5jȫ#hW֝pPHWe2{<֮빆~y'ʯBaJKfc3VD0ćl /GdkGAIRUԮ _n3J ȸ1 fɷďrnKTko9f#"ݱ^|ܒZIBeL Z"IGJ'“ByxW_^LƄeħ7~w:%5< q)/7Uv1\$]I9mDb F0PVD?o`ÇԺV[r^3YQ=&*oA97t/wǜv/,Ko L.,Zgc!C 5+&TVqe=z3^اdӽucy;g z1cGz584T᱀{ao( zoSEa.~ּSSӜALjT%HW0n-D\΍D5@GT :A2>}Msf݊Y4<贈*V5gWjU">YAĭth=ԩ6A2X[ #:/ M>7G9dx` NP5ZCwNaiCr,E ]GhBm4,NDWe: 87`}x^#hAL] R2P ͈jm@CkMK簽D"Ho3RXY8kkg7,[U0fNEBkm/^r?]8P'" OYFBKir$Wz SXMU0LJQciv>K=9Q!6j< #E*suI ֛/pmQj0녰?Ytbʹʸz+A Z54XԜ6JACPIZ2ήQrB=Glk+faA{=ʜ,\x$Ԥa+o} kFC O/q{o/@w'dwR)cRbXcr2K<#irgdͲA91]QRzW”P;TS _kz;\Z"īfZ(oժWx_:6_+L.f>iA$ZҴDp$)0'OIԷitY[BA8z!)nT.>*tA@ҏ_S!+Qv Y`6W<5\Ta.eIKT-({dgIaIJv}1;ڕ$2cDdzuAI t(HBI2d3Yv ,2:mpm;$IuHJ١#\z)gI3e( ~ޙPdizhhw6*gIvQAXx)I7E{'cDW.p,Š72|q9'I&d*{e@W; {z%རr q1#~7t0HSA&h.q_.lO`1r$p(Œԙ|bYf,zTݵut"E#L s:rb^RLWZR̷~g߶9q!lO8HH+mEÄK&qb\^U72Dmj8ɶxzzlN0M[-eeJu _ j-o*Fې 늶 G!){{nkahgv_u\u\@ ۭ\jzC7' YJ&0+m饫'Q 6 }E3J(, JMv\^} 0ydi. lnj)PJeحm?[|`ze3mRChJrʲ4OzT=IΓĕYMgCδ? *[>5=铔rQw=x964` uZ% jdByL1HGab}Z%6e%]3b uSjCC6uȣSwt5nb+|/0yݍK&ǵ}JgƇ7^'9sivg[Z^RA T7CCȁ ɷkK!\@;6u;_]i !^JŤ6MjL"@#L{ktcТUDGNزO@0܁cF+yΜĒ!D;g㰑<j+ C3Q7@~C8 6 QU%dZK,NXk۫~9ߊ?#r-@|D:+Ãqq&D1&%O% d!CX\o鹸kJ7/`|WyO\أ _&:ZFd E;؊γѡ$F)8UUF̞U^hjK.:|soi3Q q|Q&M3-- ],~KA%oIH?=4"r5}ƠTRF)BCSr$<,&`xFPs"3R u#0ymύK~s>2|FKh)pc'|acذWPPǫC0m@Ib襻wAhfl%bեM^#i݈}?-պ`JyhTHOo`=cAl;:KhS|zZNo%{ߍ<m̈ru+4Twp(>\7~s*wQNl,P"> LMʝ+Wh%ҧ "[ )_ۊkɧa.u|UHK;ʵk>~QM"O-؀j=qy5_ђF8 I I-ihŊYw Y?K-@1)\P.*|v,ѳKwp;LW,K\܈hK`:gCVG s$CG_GbJђ/C?xDTk~c>qp,'LנM*r"j򳭋+g(ַ/9-Zou+hvt<}(c_<&s %Cû]tF2T jW(Zgw]PD-"7[2GF <%e`r;l$~V#DS>7ڈwj8B:ඵ>?q!cZOy<|"nٓE1MpmրyPܰ!Kܻۓ5+BqoOErZ>3l5<DRIl:w\ŗj%^oa Ǫ'钂NuwKYAI5 TVEL4,"W~$wA$2Qy"1Ϝ@Jblw]Q6>MoX GA$Fܹo&Tc}'>$:F)l?0V{&(TbUF4 sIOWovyahGo{|^! j],%C:WNMwtU˭iFI;y/ƪ<.d쭋?⾧M-2X̡Le>5miuxѮt$]akbe,w닆4dhf[fʬVD`crUe| ~8g%й (eq$qkF h,NJ̒d [{p tX126\(,]޾6ᩌſ{hF-6La&ʩ$U󂩀[,(giYQ ^ BxwMu{>)Y=>@e[= #,4"a `N *pm$I<^7fK/cqB`Hu_!is2ZHQ.W\I#bh4pY7sFhյYwYM犂>QKY5釶Mzk_JWw݈R'#4؅2"c.Gj>lp'SL*K ~ޛ^n1-0b=Dᔀ(.X-в`n-pDr9fLr%lgga"V6J&DJނPhUEX D Xa_r7ZاP긖% 2z"re@\d<5rK2s|E|/Ϡq̈Rqb<޽bmh30RS]|&Z ?ZebvNؽϼ1xqOV(8DqQxh>af᧝8-)oPP;h̜cKoU3TyNyF/D"12q=- @'LFmp%@WMQlt`ej~,&瀅Oa۫t0-ΐRԬzKFz[k4'riaXZ-rnQmK9HE_{t yj*2!E\tS`NF[@R eݞ n=[s(&{–&wAϥkgg#rL]ϩ3Ϧ,cA]8B7-ޟwBT/DxNwk&ysU]`>;GMńa.p)Rz.p<߳B%dN^"/jQ7GWi75;IaoDSY]äd[t"K|c;,h-#{gY)niochs&![*~}Y+P4 2UT:IBC9$K׾=),Lv7ʔ[$eH4NCOkU H˲erm5}Xb@'5<"d d )&L[yR1*#a@b)k"h717v<#!;o(?ە ;u^OM[l(ojy'(1$'+i&aFX`*ZK+*M JL/clٰrO-¡>hL%:ܶ0[& xQf\.r޹BZ~Ībܐ"2}@|P``YD }t.{Z 8SZq3&$֎)ND3 xH +Ii%GN<6˻:=_hcw&?Y2 Qd=&*5*`I|-!Cl`DD H?z87}8\?BЯ-9~bTUߙ/<}?c} q!џa`RxI: #7h$wgty38RY!h| '~[_-Xʪ83~yOy3l0AuƘx#Ɏ1.U =;KY~-ArB`u /ۿ{IaΔ2ñ/Yl(ɵo42/c_oJ}n/&x ςAR2@>4-?>қw,VȌIXnNQdKۓﭐT,*uƞ0I+4aQ~1qEȥ›/ ܛљG8ǢW7pi!pr;u&1سkRm3oΪHq'mhM*%P 6NwFR6d-[ j} 3x,pg\nQDm8P5K&a|=C>z[<9!e Xkw#FCBpOVEȦ̭gd:Pօ,.sV!-2GH|à̖wԡG2 qIT+VYӈ`5D%tƷ%֛hu56&i41đڠtd5 ʌ*M+lN|/w;Ė_-@+넍,"Z'>A4*2Y+ǴRIonA$җzsBRpЫlHd1J&i=;sCݥlZV΀VhS˅3 ٮf^ϒ'p -sƳXY Gi BAt0w1֍X | F]ǘa\6:%Ks*&=MŅPZ2ـ8֥3a1'8'JO It,JZQs$ QVutQan ̿ql<;njo7`]O2 LаQ6S _Pva%*&I/YHeJvYٔ x>p}#/Nju=P+Oq9&P]ѹ/k>8 izH/:澳/:BX! Є'D;ks%-}4!`ӈCցP2dLOG A/Y֜K+%G )B8v6K7dv5|&ÿxbSK"= (%4Ntd 33u3';[Az6 f2j+}*lTҳ@}ׯatR$Ifb 4[({eۯ2 j-hkVOʶYϞNPm#p> N$1s{)Œofu~b6 r{ipf:.:Y=]-6'bYڣ ,# 9`1zn$O]iB0sPZBKaFR[Sk''w_k5+.bc򣶤g]c*:A!%֗#T/+h:@8 / Xk!p'#Mvo߅Huo Z[EcZS6. R8~cbk/[֓=N4z8g]|Q0 :wq UT ,b*CPgm amh D ofTjg6r4~ŷw3Bx@X(Tح9$OcmG{ S=iO`IŸL&6*fI'}i(o#ԨԢ}QUz@Cυ|v3dTV[U`R=J\t{[ek%4R=(K-Hp#ŗ| j$˻>Le*hqך?{Wd2Zs&t.H&4 Px+V0n+ ǀ42l'8;s }[| z$mFk^{5)Ed3ݒt` УY Z׻=P1Gftw9STF:޿z됩>dQD{.♾nTyGD1RFcl! tҌ\dai8ʴ)%.LzufK*w?"ZF!!>d'gVK=KzjYBc ?& g8nӡ{Lc=JTb+M6HwnRgkJa1)_:O$j g"(g0)&c`އ [!hl~y0GBX9A{6*l/È DI(Y@ap0' ٣mE6GX5npIN:.&߻[N^]B1!A܂XGhgic_r$ >7Roe<-o Ij|sth9" w#~9r޸Se*JP]o<? {TT&,4CW͌y5JH8z]Y֯9сf;H~tr F*H@[,IE@{s{X4rxHpB7ύw1mSh U/NfXkd7.%!D[QZ[sNp|_{L6{t!񞊍%k^,nH`l)ZUeRZQF@ MJ#FbSm < Zw.C-!K̹qJ6`MB)zW9ew0͟?2aIjpBǼc>@61wsll6gq|s+{g%`c52_g'^ܨAJnHg@P|?50;0)^pk6c]|6rG)YA"$MU4RYr[I"Ҍ۴R١׀Yqso_x$`epسknlNiptcPct A۬#rr e4PZ-1g5Д.0nϞ"\^8!e<$Y-QNvىu'#p_ 5'ՆAo{u+/m#3u pZ 3<#Tl̶uR_k&Db0#$WoN9lL\O-8\`W&3̆b5zg@Ub=[5@TIyH(؜>>U1Kq:΋?W w9b(\(~f&HyẂJ$'\ةkgrto>%cAyNJ꘲Aw͕-RwsJ}l}z&xcwhDbW+NNY}RT+-7S'Ej2],tQh`IC"Bˆ oX2DoK3v[^iLH)61#5ӥG%Ò9PQ!9ƸS\ '4U g /j lvbePwƶĬ*VwP8m\Mn=?ΌkM']OFdϕ~DsD3؇dp>_'maŠi 5Kw$ 5Bkh]\4PC6bk A;s))t~)c{s>2VG<7Ý?9v !uMਆ@PA[aH$l0~h3O |R\e+j\漣MiA0Ԑ%) ^& ?OYwukvgJ@3 0KTVlo;d2ӃZ -8#jy2Qm4OеqT c&Kp,S-&npd/P~ʌEUu}L;j3g%h ;My8S`.S"i "Q^4ODm:1tKc%%'*Gwo.ѲFhD$椱ZQ?xlb&@M+O,P{"ҝUy =zC!=L)c_mI26(MZC$tN84C;Lo5Zcv?F,h"u:s?qmeNC 5 4C\u#E$ \Vyx } *ԱPoP$fW$`|d\J:7PlbF#|8One&uZQؙHgSKFW|n9r-:-lհh^]FIDyܷWvCucz_Lœx@ڝýq=a6#rR^ ]JTfN >Px9QRL.e߳K[&i_ ~g vZ u z5BT`SGMy }M5(U G|IQ5g.E6xmҞ fC y^LNv]0AX\T}cUjBBk*)H_6OD1b P&8pK]qJ(mQh&$Vt.빚mw8^L^j$g}r@M";|pz3*,B.O{^6;fbe_b/X5COYۏ]^h:;DN$1cm/Q}dPyUz(S坙7c+Y{nU-(QwfZHZL@(R 4A͎gҗ 4r$^yG}z3ۢ}B4fQ+4 U{6Ћ~x ׀ )IRGye̳Z7߻,1ct7H/4c+f8uP\ag`P4Gwp3AǠCszD#%%8t-nkO f]$yDJ~ ֆ)V~48(([>"*\Cq~t"4;?ftts# Rca>sc;TYV5UJV seHtM~xmf% Pkuu]Ҡ|MMyni4uШ4;|ۀG?Q\S#WĨרPw`%bqG'SĀ|u6 mD 5H+CyNXq)(HvԶlvh+ěݱEPFב75:$3XۺZIzy AKDW̊JTl;xiN) GQX0 MO+`$ta;p|z>nT%zńskлF nrd^E@$f.!`խjiMJ>! kjy\ucM~8򲴪 _դC19O+s oWEv,d+RXsoWɜE1L*kljR. xW=F@P.Prs&Zm_n• oSĶHNqPR!tYqlkNgЙa_n$g)((B؀qh}y&d*6< 9- /8…G ѝB(aRgàÿqnwU]*0 s/cq2S|ۢPU¯`l'RSD`G-qh6g5p׍י]|9qSl̜W=oŻqHlg955rtX)_!.L#d)Q8p!n*hyxXD2*q`| lZ dR$/̥wBBu3R;g lfE_uC4ҥnZƌTJ*(v]˷ YZht=G2Lb?#O6T vI`JXpJ}b;XJJJNWOsS&O-*{n>Y"ȭ1'T3W.,;Dod*^q_e_"?9 ? kx1~ J1|a(C!N,Sٽ}SuHv`pFͫ ũ;%f\'Ro/2[pOXG!i2d(Vz+uDX,K)9<6~_?w_zNt"}拘Y0DnLVh H=}.OKVM dQ$wYHɼ`6H{ٝ3OΡ[dc&59!y`xgLjqݨMQT:| AHbt杚X4U.ϳߒ!X>Pǒ]2 "|AJVd*haeAl>z0?zB,iU\$E3KY5n lI^I GNlJIg7]){ڰ) ,dgL5awUiWgjWG.\ põ9!WXJ36-p4TZ=)Ѥp6!m|o8 Lq:m=F1.babhh"#PI0J~6OA=|R3#iI8& έR;4F^uychd|AoE—'w/IJ-HKQ {ѡڀ <rz{#krmOqn^@E%ѢL*gjt?D!d)BNٜ+u}|Okdߠ7} Լʴ j{:ۆ sϰBr_ д/ -0lE,֋ eǗ`'T B̠k;Zf8g +Ӯp SVgR*s 稶Xݩ\>u|MXEE^,'(5˹xH [Wzrx e;g=[gt3hڍ4% 3В"”ibPD3/N|$"KÚ9Ez @M0% 2^,rg5r+sۡOOBH K#C`[!y%Z3X1 --*4y{pW͓a4a)B4QH/وdr$q $x1~Vfbzha=bӓ_ЕB4yep0J<58mDNJNIU6GnOL6|JYJF]fGM1{uI+'?6'J($>0>͗aFb[!1[g{-|Rv- 4:,o'_]{w.6Spܶk]hJ,gjs±oPd"Xx]d4^1GNfbXiZbun#UAVvKx.zlh?u6^$})mJ{QY9@RmC6JJD3݊tEA{)gRS^|M=$sF Y&Pξ=ng%JtLT-.i;߅ziܡ&= 9` vg|ۑF<*^ZṒZAҕ`o:dEˇk/%>O2#q?Tif/oqyoE:Bԙx= k~JLDOС Ds 4^O(#6+ALp)]O,EpXs'J/n4cc@m2Xt > ]k Q2]te7fY&9Ce]a|} ]Wi/넣E3.7 g?zݾXpz i(jcf.{#?-djrKZY<ЅzᓈO]5ݾq26ӁsEhe& &Q[XLx26Ǭ$?ciW;Z3|GeJP8Y@׉7V'~+nu6gpja)YGq W=0AyoP _|Uۄ>7NP%am¦ԟ!$ǜo,o"uKp%+dlKiE1pda nwFAm g!aBܷPAC L: 3b>~R迯1m(H5B-<^$ 2`sTG~Z8T*J"Pw/Tzi[cCV\06pW|:*HY >xy_/h+z49WdY4#qΙOv)IV1zGjj:}ӕĸ^K1rjF൑3jGSǀUmD~ p4mLi̲j!,kvG"+wcwt ޣFɵ:xZM9в0ܨ7a1H(:XNVLoR.JcH?1*._'dH ]dI\F.bܳ\&Az8. xTs=)Pu&AM\ʭŵJ)AIt=CRh1sYΰFN)9R ΰ9t*f&65ՐYhA͛osg%|h&XZm@.*+јGQhyoIJ\ig[ҖL7éXޞ4[E`PVڿϖ_}!D( M䰡TԶˣ3OQjÙ WBc$EQWv6:AU9aˤǔ'X^Z#r875f h?\ug, zި6' o _]t|0<(io>XB0ʙO`Y - GMje'91Z4M&{~4ƃn8FBk0zR6^r']s`ߙzm`қYUa(_/5i4p{w;eP ^- yyϟ(1A=b I+gFAgsB(\5T_{~} 6B~m ={D.\.=m^CQ_uC̰ :L LtV 1259Ibp1pݫl[&:?Y$qT:D@J<[sZtDᣫP; '/tV|͜рx TkO/Ԫ@ .?`YIE>9x{/8<⥕aT8BqӜ蝯5z$BX /[ŗ>uٷ| r4[m^3v_Z|N}>e쩾9034U-1zRHǪL1B yէ]#w5F@pHrbӓQgYV΅ b摫;ͽwOt V[b Aۨɯ_N9_V|Lރ4Dؾ<0u]/KZY!sLR'EJ?ZB㞎j13y)LrGa%E:kb{w9̏:cL˯is.=̂VL֥Ppwtp%54b-k9vIcx;Hg9 9kowecyeȒA$ֶO$uר9#EaAH$eS`Qn ɠ*31B+`ٔ+0TT8}>`KFa69 *s0tp u[iߔD+J|/o~ihVWkʷѿFiV;j`yY)0cQ'F[F/F oWB{L '])Ѝy5yE^?P+ueq(5tFZ"7mYlsy;6pRL/S}ME eSZ(t]lYxS!HlMz-L1M4QYG+V{tF`방RIF0>wZD/OAAgycO;?$ekUG5~Wt) *7IQJߺ9v.6[UٻlsN$aP6ZZ+z JB,Ȱޑ?_ByP*{2УϸhE^dA@v5'c$zN98D]H|y ScgDElZ^!]r0vI~U#\?LާMo $!>+®iv-QG)~ ?%yKvޓ0@Km1Iq$z;CΈJ TFkoa3C(pH< ~'">}z¬7]#RHO{7Aҍ{O^ a)$O熏^ 5aKC*"u h?IYLC@͹9Bnxg`SXB: `,j$U'k#5Tg@p@G_^Vj% =lG;R&^Y׹A{4,;G6,B$^6 x>Q=GX^1.L"oAɀJTx2ܓi[)(u!A)Fnøiqu O/zcOzkI;l_j{13:'\(kLU3sIYP3;w\q7rLA"gl:{Arz1h-776/;FF@#wk <_c$ҭ;׳_5"}}"Ww45So)?/b( @E0Lbν`H8gE<^”\axQ qcޕ2q2ꓙ*dVomz]!ƣN[@ l%0j(w7W;7F9m ſʦ Ü 8#`ZA'R=ezb !G Cx~r -wKr*!;LWY;_|/ :]_jO,2/ NI a-n%nLe_aJ< W?YT-Y#g{Ƙm!"F̙UXW.j"8NnLt= HIiH}2c}뀜$5 ո$~n݉gȓR\0q3k椮5DicpR~@r9&^b׼ `X•b⋍01a8"N=ZK),>Άl>Z jߍ7XI+P Z,CvRcCđ^6hM1ptFR,o =*#"ťLȺTuv ԱTic*hVh-x'<3j;μk$E#+[_y0]CX^:˚[dȂZrUaP 5BTU2l31 `^~@л5nyوC\h&t 7W81!%dcp%$t|\)H]蚣낑a^kThPTa:&yO(lQfӑbqK%ˁ^5# cEW0փ!"Pra(4yBK]`E_A6|*LׂX\6:LXM5|էN6te[PmIyaJ/33PF2N4U I}Ir >XQ5BB~n,-* D"7)K0Lk&_Sh ΊhԨb"WVED'Ŕt@/`{.=!zgKW9Mءx: u̖9keٔzve?-e :-()F<:*"c;4U<9!!"h}_՝5W3mTK)\8A5ZoIx'-Iτɲ{' 'f5pMkyfs{< Eo~Vgvq0Gl3t;D_aCms9JbLެƠ+ 'Mp;flZÑH\r#"hzZ@:X9O2Q l>8 kK GfM,>{H5%Hy5V2@0QAރ2G C 7t;}v#^J rOl&,H S/AFmaFs"qh88 |kg=6ǜ:j`iy#ԣT$KW1A]{sNj^]=9H fWq ?}6!3՟XG۞(I~\.Hf҃ ={g@(6jeeR~u@QRݖYv~:E?\fGbr~8 *1 Ǡ5@kCiIKTHP b8+ ,gxfC+%՝@Zode&݊bw=VV|Qa*bj峣E?e*W'b?mUʼnND2>'FאUZ|3ձ_t)+fO_r9%)=ETuJz)n ֹOiVnnD"_H"4uJ 8DkyS޹['+qDR{Hq9/񰭀xovSYM$뱜HFBp[Yr{/Н!9ԲRVD| W]y6OԳq[QoX,T}5! y/8,YBYyfZB^tjՏ§ fڟ=w(OCZ}h㢌~XzyYڎM0KF3!eFTB@] _^~AIT qgz"/f>= QOIO9}O78BFЉ!B7WH bϫ{˪N$'_se?D!U89*oqo0K-t 2HK]ĺ Y)\!5c#Wqcˑ#W hp"wiz T(1 =a4:*4QU# $87RA܎ɵD2W,Ii`L%x胬(-w4ܑ`*'Exv%\rOV#:K{ekl.?R @Ν<:NӨwԹ-Jp?(! KMan{2b $oռ0|5ܑ࢜JTۉm0z'j/^ wc9uaQSmo#g]-5%E|dzNF: d#c3fl/`/''!6qT54 #f>!g3AB7%QXQ^Vek:Lc>3N~*Rd9 Ģ;{RwVf5a.?E>Jmۀp_ N1ZT:1~|g\_VilzeJZ%b2Rđ[qy=uenuIO^#!z 0i^/HA'7HGDKPET>gb3zYu>xf Q IU[ֳy8_*Ls:9n ۝+e>l V(,+ 'QF!aԡNw#DnM]t[>hu!e$՜{y0Z&S-Us=rq1jk5AzKhO*i1Or6|p% ɸng&Γ}"5ҫy./`"v~8`kJq+CsKR-oEcFl暞qZ#AIIVWNC"pyxJ"iKմ}G4*z\I ɣe[E -)·ŷ ygÅPtyNߠ&{Xrq; QN^:~TBoJM s+NBBם"_Ի 2 CdZ~cX* CUgX&o d|oI +KC877 zLnr-Z8?I]Q4 ҉I9otw H@2[lN65yrW|zTrȢ(^SB B貈>oTjBo:p=$i^kPЭ4[3hl?}"xc'^lfhTA?iԹPHj. I!rI9uUSlT~-$Tv/+Ne/"j*Y7@I.ԼŅ Q$wU(* b-Ap~}+VGQz&4òߒ,e?ǂcm:g4M%U[_E6jV{o o'ό[$QUaDvϬ5-2mU5Ɋ "a'W˕vhR ͹6,yI[1SoRcwPMLy@ -DH(Ѿ_zѬsRثANa# MlE්ѵe?*Hދa 9Θs&a>fY ~3DM@I;J ES}p*٣ѕ i'>%I)JhHjms7cuP ]{յs9~,ՀՙVFa/wke06bt$tM&N mT2w,%鶎\݂ \!.nwSNYT0'4Op#RebdQ)}#3%WsD<-6a ԉV )o_s;>q}<$Q c BG[:N[v @-_OY|q8*jvmšWkL7߆$t{ߐb壛ĿH}X%Iosђ VjF[^R#dZϻ-J3j}:R%KvLz`L<8w9ͧ@xc6RMFlFTum{)e{5 ;Pa;?ye wѸCx*,BaNg.Zz~䖆P:RyÁj%*@@ ,ض:>$YjN@a;9^6LGCW\ @b#1h7,hv02џE-s&mTYAc6"}oz%q u q,)=y}<[*94.pZy Rd](B⪳OfudxK@%٠#M_tr8F\(D1+u"YoܷGX,~u1`jY5"UX19e)hHq8&Z*iV_"ZGPI!^\qbKu\SLJMuy+{eNNoEEc"X[W\7U|Q$H#yn9x(Q6g&;[ku6*kI]:=PIIʧImETs-$ K;?SOS}SBZi D5.gٝ RV~t~'5M%m$l_|L dyIm_csI\\\ BBrǰxB;!M)+vaZ>i{I@Z `˜#V5rhҘx@mL"agG _Rlh,s `_- kAH@סI!b3a}fc#7zշtӢuFIwh֒Nqx pP_e$|(|.XO_B2PöK}_GZ7}M|4  2Hjm w͇}QL4pО L3WgN8~Ƕ[`]}3k/o,[JE1Xٜ5 4< [=9r4k!$:]rF+Q Wڻ zAPi\ (E=͎Pӕ\@?_te\*MZ3P7r1軑Il@Da&98f;y"׽Ϣ P1t6yz!elrbS^0PrP&QMn@4_&aεs9;S(X+\3%edp}yX,A0Q2uU@Z2qJf/2cl~2y6󘖟lIV |1< 쏡R6 ]s$BbS%>nÃbik-v8m$v^{)D5&&_(s[J=F-ъAEd`M$ABi`!1-@PR~ oQ: Togd7.KUJevKrFRCs*|a  hg2^{zC]In2S<h׷x&t7]BgJ _wNn̴ z}5I I;?6*m 2C|FMD#Vx@̪NSbk=#h}^Dkrӯw&8C:CkF@oT<|O$f8Q?!I=FGIJ?oH_fE(qV%.#!Ciz/̺pNrCƉaY36΋NKG|V}aL$-_ԙ(Fo2פ! >~6NF 1iO馇-,7jsƠ$nr>c&܍-\\N9v϶{6>N>[B g>ӂ`ڈ$1ޕWP! '~_j@*+pJEn2TK?1e-QHP$Zavo#vWeCH-jh`9ȲkQmبp A"ƍQbmVq/hV٫1{2 CI9%@H#cD58 e@quR]8Yjk1'Fd"QiU1Yj77T[?9y#ݭ숣&~:,,vF vNL F7sieitxq |'Pi/o?u?4 <+*3RZ;0\YħlUJ]e n]p1FnDR')XÞB_i5{d%#RE!R%O[= gȱI/ ,ק";$;KTƑkf YҔa!l\'^Qd\mAAEf 2Np xKK^YO'؜9x>PM@tX x/`f0u*%-sԓ |њeqrngoA5K0)y+g BS {n4JwG`㡺o7F1`NHE" voDcYg!]wVN{(l< (tiȠ,(ged\޻AGE"QgQSPk+}tÿB U+hS}YˌvݓdƵ{Mq?Chͭsz@}XیIx{o*"CJ> p (-'&PPH˛pl~Bt< ԛh뙐BtŹAtH˗'ԝfsQp+P 3 nbuC9y)8LrS`C1ג*dvM5/8½Yտќ$Q!^Wk'gRb}>` v{9p033GaGK1guhLANg@ߺU_RVRrRb'v'^H֘Xt߻bxbri@*wB F#GWk~rƘIbJyezG w둢]fCSN&ALѫw ﴫe✲-PL,:6!o0smuЁELb8+ (J1ˇ ؎>ȟ3Yj '\RVd-h`RJ:^ S4әTX9R4̋B!=d (єxڞ[9$pOHn y_`7U~];5p(/\AǀTܾhKw})zDb)ژ.xqud0K$hIInACU|C7KdJq*H-F8 qmG 3mmn@%.SK\9@b`8~jynL1ĉ\1&K"@dHU;#X+<.˚}k+K@AIwUY̢rPKT m!?>= ՙ(ggt >C xv+^;ZFVoTSO|~p` &xcɯ1(ҽQ-ƀ<[{htd9LۙMS.ȴ0~&qco:ϸ]}N^8b0JhN7ߚTnj 5w,_i85 rS-3OGԡ'd5O1v=0W0ުX*D㬙`FH5pzDڷFM32BU.LQOU!!HE1_x_R5<\I\P{?{ R7_NQə4 p324=*OG5kx3`*Go+kV.wtl|BbTUn6756,`{=|c((m(H#"3pIO%b@YX&eg匜aL;f"MȀ˩{ǷS˱NT} *L|tlflZ oPFr[U@9NiB`?𹋲f&SfFu)SXXfZMng|x(LOe5?`MS3oE@?i3%o2z] ޥ`j̦vpF_ʛX1prL52ر0xT]M_"׭w"s'k}zkڛsDLC.Dh j>cs`d˗!rN})fU|pdU@OjZhS`8)`w- 7k>L!С^\B-5gP~(_'w3o>br gJLBG5J]},C8j&Q; ܮ۽jRc+4tBsVU5ڑG"!9xwőXn /"snQya9oN\[`O6ǂagyDgm3h-{ rPeO'H(%;&8U'3;ơN9 O!tQXj{fG.Z[sUxXx؏u56<㺡b li] ?͞!l42Y~>e<vm!X0[U}ɰNΠ‘e13eqI[} >{po-yKv#3^C);u0'qvkCa, +-\ia_,Єuz:&躨,ـnZ` MȸʍTS2p,&g_*dq3N+d0PNKSzc<]@2o]:֕"z1/ B0fπb vZ,3c!q{E }@j+sQ0M Pd6*lk! cc9& %n$u'm^9?ƴF}` {\*YjnBVa G*?CBԥayIPpAGfvXdG^5$VT4"ίgiPȾgJ=h˔xg*(uժ¡Run^CRHMs(ȇ$s7Q` ԹxLf~&\/D8G5vܾ^1ްD1(}ORE;<.">W /|܊z4 'dw|F3$F` yAbq\&^WJ{%GO&n_#2+N КYۗ?r|[qvyay3ʁ{+>C (ϡ\í7'bGPw>QjUJF,ѩp݅D\̫߮;ͧwԒ6)aB,t FQS>x WE,{!Hl*oyU؍u^4'o\z ] 4Ag֑\S*78ћt6TnmA"ɾ$ 6tʯn qrU:ı>^Bq}y[_\U* CxEǦjfYfaIL.'QfY" )3MN? p<=vt?v ]8D-'vhkC&d(iT #gU̲Gy=MCR_gN ?G~/&j>mOL CC'[L3k{]G*1|"=hžZb; UqA/3\+ 9f ,}$ӌ=4Q3ʒGlS (B*ثܾ?cb.20,a3\Ihq@jnţ:4byE[ D%D7 y S:j5a0pci',وTa0<5*1]1 +~4N{c^bS %ҰNoZb>h  +W"$Za (~h`pI}GsM ]= M C `{c3 70ϯ @wԔ.HmZ}%^Ȍz_[j0u~YĈ/eٛbI''ao<֩6>Qmh%Pi$?vL8sfq)r+?X贯-0"dYâL\^u~fTIr'nKG [L3"Lq!q.D>ҠR~NysZ :~\`\|ME8Y;훈[iWIAxgwDV˂Qv=0G2k K<:2HB7>$/G}U ް"vʵ-tU+tT:d 4;{겾CU"Z>SUBW%<'e"( U?*>Ą\kC,W>2~]smzYqwEsgF8P]O|MJS7LܟLƫ˭!>@{#:_k)X^w1YAs$x+fYWEe@/zcq 3eΦyU0n )2E3:؅{9+q4MY}wQ7k:͗ilLyJh SArf췐@;"y\w.,=cMc1&+ )pv+` Vlf1u݀hmav{kZ1ikr=Hط$"͗ؗ\ F.dBў>kgRs18bk^O\jl?Cof ) ٙ. Q6:9܈/9]`)WMG0lj*voɡenm),Ct<}mqFp1RZH.܆46gw@a:$YCcX(ëcz[ULj7$WZsD8DrA=9߼AٙJjn 7Va,< ̤%Or*6'%!Ɲo8ixl% Ue5Kh(>waR0SR@>8CrŎ0pE^%2+~Lw1 ex{ Pw W|K^l:SL+*rh~'ƌ7#6$Dqk~Ր;t}onD;N1 ,DŽCJqi(Q1;ѵaUl4=lIjkLۀYTج Ş?#rmk+|rf & iA]ښY hoi\RjQZ׷_c& y!a3fI&wΎ8g6ٍ7ګz#J.MU a 53O"x)s9%aX!0]gO3!t],q,: aQal.ȫe.fDJxm}C5Ȣ_pf6;Mb Wezhm#dcNFqP)G448yz9OJ1uxVE\;Aq#)>0k5+E2YG["Tb."oJ:BFVYV5t.]LoԳM)_M]5~ngF]UkQ,$M8 (3^R'k5QKc34ۂLJ0wY ڍVc^@@󋠬X_ouv+2M)ӆ^eF iScr8 ↤^?Ňô](f`UŶ֌RםbR"@8e*Xt<7dgn@$5Ǿ1^{=%Ն8'bVCx`S~iub/OWf-qOA~`%h8z.LԠ,snjqN߃5 vųvjF&X_;ypp&ZH 4wXز;r˓7VaӎcEn ý'6~{9G˻&r,(b6ɛ鯖E+mO3ړ/RUndY㽭\ 5Bd 2닦 Aхr[j&JMmQ-#p2JnkqhHٍoۚ_$1܌A&I5!u_=ĥU"n@wG x;߰ ـKT~^dTi݂Vh( OlmHpmgBՁBW<틬/MByn(agW3< M$3e0czO[PVM @Hmt̓ Z63*_HxZ[ھ\[!0FNj`B@L9IQt[?xǰ &_oud É9-UyuR-{ir׊^t+|C聸=9WTy|u E }cd/V"f@T K.C]?6\9)ϯ\ƌD;OS9Nc V"QC^N[`K uSwF@23-_/d{%R@ƙFE5rj{Ã+ЖM% ]QXgM= q/&5ThVZEcq5Z%fbR6-Kb 6J7O'S0 LǧJd8Ր $}f.xωWLZ[KdCim>y_=sBY3 MS&fFirL 1~)RM͉_ELeߜ l8#c]!Nm,lN˻ 03xq|K96?7iκ VS~R9W>m,"eߟ}زiT8g@ڐ"pNjG9~>^=ު&[잝{י'UN k 3ҕb ENSXi˫ѧ~kmY}nZf8J~|/hsiۥaPU7Aίjid4Vj-S }䐛V)a'aKwQu\hֲj u`'VϭR8 QXCE~03~ݞ(%PU3 & &iJ<0]0 ^&o*wƭ3_ lx5lw<1ʛD&{0={S}ߤAm~3 xo{ƿN_ Q1H*q r?/P X6E#38e*p,2qg3"&x{lod .codBa ڭbJ҈& Vcsϵ:/ ckޗ*4]wRleO~] UQ=Wq5lBpE((wPG 'b+RYVcK6nFUx֏oSJ9u'e4Q~9p+qGuz0r9>FT(h\AS(AQ 9 A <⿵UЦи#hC֛m9u6eu^H(~S/u~xP„0 'Ac췹'ǰ% 542" ?z78ԕ~]U@"ņ@N 8$]Pn™/3S૗Rdmŷ9EiRdmZqXwdѭ\˾=_l% m!;1 Jhw[ڧGAdM>O=Jlv~?E3.KC-Y1""p/֜bU>[w[,D *)=Hv Ax%n`pl|T]8閈xKCtΡ*h=8[ 6a} l"v:XX%I#V,vG'wWFZ|i;-ӭr*k{^_J=>K3,{/&~|k7UFDKj 2}ۓ$j-xB#Njv oA ;uits%78FېWu!@ן6+,#V8I .7QI󔥉M'rOy?A0=S IOA]1G !9kCbNO%N"z`h`;BICubzW "u \*v9p\V, ׶:c;yRd;Z_j `ɱVnn$恁ڲ'0B h+X'Լb'lg354 -VդvSQhsocG )/B3͋l/N6Y(oOW' &>soN'x'ש,x:qP#I=É贿P_S;*[ϱ9FrR{`kGۘ? {Sr{n!! ᇆS=M F좮m˂YV QJk$ *(e<)DC"Q[ 86xylXeAb%kcu/rRn"WeJ?w(m0b}4O@Ro0Jc"WYTpބd-P#| G*]o31mrB<4_Yc)=TVsHQַ)I@sL>g"ɽ4< EEĻ+z&˗X)fKǽ:TىT [ҒTkG=o}et>o?$Sdv["Xu^Txu8mu#.cxp% P0eI M@aPkyr!TU19i]\_p.5\I[Ѧ'HE>|a0.kJI^?+^zF3Gx /'K+}O/j@| У@[>'xeW74j;ɵ5ߌNmxv_՗8?3WJf`IDs淅 wivhClEYcNu].Vup(x |Dh^}ںVq8 D~}}ٖ'9-wQ>[~ǑY2a%9k]ZֹBi Pi7FԦ7x )D 9NuFτ?5+Eޙ*nʔyI̍\X+J]MTJp aM'rMzt뼍Kd^2uzT|ua3b`莿h>lfJj~UPۨmɬrhw mE:(ӁRknuq^\P_1o֔fVw@д0ĵ\b $ CϤrW[~*u\jW&o`.*]T{KC>& Kxܒꈇ,”b%߫7`׊EITM4i$r=TO1[/?DcME97`ݸKY^UNM%FmP1N1;8ǃZX>3:l0 g%;b̓f0 o W\nhw2қr_=w\/RWuNoEamfSq3A -$#W_<|h)nD3, ۟'/,j̫ŷЛ.5"dD`E bb[̿|^GJ*ҸQDgm1N2fl&=MQ5jE햸IOYrqXle@-eI*O;N̳­wiXW+Y jtgGLsQix)Ho)pߛ£E[`q3(gK7mWʃT}QEwLecIa+Y,H U}~jWVDPʟz|s];i&N!$h[ō~Im(z9 Ev6zQrT/A~M8>{xH>Ϻ/AZmtUoE͍`(YZZ |lvWxGem>=Oƪ8k~x 5*6ҥY8/(:GEn H$+X䥼mRKx{dvީΕQI{m:}S.lѻ$$s\\H_nԢ`k  LŢf+D*2>A|`5 J#~4YI#[aђ+{]|F.ʚm]3/k&}?=5'[x-`!E8NȊ %3+4vԡKzlk_i4vv]VQ>契K[q\+T"iwI7i-],Ifov:Ag=O"\1x#뺖DKUKZ. 8wr%z[N[H"'`"7l\ s$2P9*{g,tވ.'jr?a ʆ%ש-XQ^-5ژz؄rpe`< *@O;"nj [at4 v 2b+' ƪ[5IPđ, n`|#E{ YPŖۊ޻W%Q.=daD5oxX !W[c_eh ׿F0)= z`>[D[6n,bW59t@d44rbHdz' ,H|fizFO8Y` \?]#_Cf}AXmN%-odJ69U(dԯEں0$>J} bV9 sVK箐K*.eug?5Gk*:K=%Ye8Oak3 d Da iGM=VrFM], xl\tn܃f[P[6H$z_m|޸w^iRCx.~`N.,Dx &83|qvG]IpEɖ3:KR09̑ꁨ!cɭɤoCLKcEDaOD/5fB# \Q >GP>5񎄲Zbh{gy,9ɕd rw4& ^"3#QDԑ:@au2D/%:!t:s30%6_Fݞ))G+"Y;UY`?J̚A ٛM&yٱSL2JLI|suߔ 0"UL<r!1C$Q;M_ex9Qd̍H4( >eLP2E81CƗlrdWpI\sj>>/Pvp01uk>vㆀgE$ij@*5A`vMlY/D 'w^܇5tr H~Q0/A9z"6`n ŊH㽢p|9lN9+᝾w!I'[kWSSJik͐ЧU>+QQ{B)YL"de Sp̓1BvK'P8uR:@gsn.&m'!TtB,}5Ë5x4Z?$UVV+qYh9G6\&DàfsVw18;ev `Ӻqc9b["G^^I\V907tߥ7Pbǧ܅KZYۄiMDXp6,J$ƪhMH_Y%ɂ٪ u_%ǒr5[;VG$ѧ`ַpy[֮RN`..%(by{8 e)3OКc MEE ?kLMe[cvU,;Dw1XA=D#p]SI.b\T?%BS N_1,C8$=G֦mU%eY\d9*!Y6\ V\9wQzC| 5 eav볎"v=uTq冑oVC -c$\js8nJ ϐ? ב p>TU= ۍqY5,ԤKB MyUd,a+J/tfK)og?mް.7oݯwӢx, X*.ON;{#cZ(xrkγ/-Jtg+(z>\lۣP.J} AB=Nd`50z1japfBav.O?KOг]Dَ~ƽޭj0Q'"+p8Lm[ eD,5_\)A_\,?&Sy4fc&OH<f~E>Nk ߶q:(^$)6_2>f?9[F;w^&Nq\{#P!/ pB`5Y1qfE avOг8f_ lo]̫TM^XwsY<{/OSuf'62s*Ap(qkؘ)ΒRjlcq.Ѣ8@#`Vn~3Lc-Oo8Sls9Y\Sױ&8qJQ"raL(O )TF-Hhꮜ(! TmIh4,3IKR1M%%7Fr땵ѠHWApp-\U'Hrm:сv)VCzp`y&c-zhs .1BǍN P]ӑRq)cGciӮ=i26$E%7NK+]5jӓd,kȷ*&:)YjUde-QĂZ:'ϫuشLPw&#t;YLZ+[tӀs 9։rc_ K-bٻo>B]"xqQۋ.!t^e20xG8i!>:FbogP^?`ȅ<6 _0.(3mUpo^▎G &+ovc<@! JE°⿛{fj* @^R>jyhbШ13N ~"OBa}6Xg.\x_[E]yNA*U˼m9W7[Q,~aS _b9Y J|–@9nј#pN_Mxk^K%@-e`(C>~ڛ)s*p i_2ܢs|Cp#6r+.aLlf30{RC$}K#粟ll^t8Zr04R_Q^GZ[hLlJciH{;q͋;dܺ̇z0cGH1%(y*] g3! t3]TScG}?ˊϕ :\וex|ꍻ}0PJ-UtI^VN.7k 8]7!Qv}Z~W0e;G_$}3nc"C3q۬5|zFRACpг7 FGO{v&1;Bs.5FQ8t_ϋ+WSJδ-O]QR:S@h^pGف=*r*H'V‹Hn+[.;??юf12ዱ|ǩK7/X =DzSqRlFSMYy qzmSCMS5'TO`U8 .ciΒbBX%ƑsEuY81奦;FJߔڃ ľRAB/}kwxwcS bOCه?c<&K{C4^Z)Q{19_2[gI&mNzT-V'z|LJ:IF~*gβDȩ9:pgXl7"ʵj:gT `nE#zb `jxw@r3 (*p7XAQto";/߾'q^3:dJe4mN}G[Xٳ{杜0ᔽ(]/TJRf>z%2XB3X鸄Ӽ3__7qb w0lXȡzatO[ז|xF%Ml}pY̪M PI(ﳀHC^T&AZF4 >pgI%(ԴRyξ\CAc? څ%˭mX?{\aim%ׅ. %bR"ôښ,yA6W ~5O3TxǫWkGWXE L'!ՏGvaxSP &!e8;42<:tW}M7JG@2ݺf F7"5Cö $< !z#Bhy*2ư:6 4SC19/ok@ېeצO[7ǯ `0%%lJ5NNs|Ģ߰U&w풛xtpxy#>TuX&oB获TQ^ 8&'lu 43#նZ;Dmhϔa21Mo;zAP BYw߂VVO?J7)s/imtK~e{~UMl vrE胩jͽ0GJ$Ў6]Z;J[q?>r4 𕫞K(' $/V}}s#C)9 ?$jQ|Y@ )_1#]kXek3](RG՘Jd6͓S V:-HEҎ0axB/zAFn 7n^Nf׫r (DU!msQUq=l>1KdM,ױTϖ4Oe[o;%#HƂ*uUyA1uRvOȧt'p7i[1M%2L9|]>Sq /-f}]*OHgdc8Ҝ!Y30䝋/mz$꧂t}iGa,x$ @3K|_y(O?XN8f9*)NmɁ.[\~AWc4"猨D"QHDAט)q}N.;*ű$ ؁SD{Iɬ0lfxѸ& Yմl4-f0+y)賜˧.0b#lH~Pwܔ۩Db?K0L๧lZȿA`<0v 89J0"&uW'+HsɪOoyP8|Dy,~@ ͶKV Oe6 ߖXBU Cvi޸eR %<%]N ʁ|:kC^ۈ )C(F m\.7qYP2gƓYU![v9pe F&;7{4O|XR'[W.~lhtBi uc iA - H 2+<Q!=JZ@݄%@]WmQЦ#?Y/¼&RJ$âU:+)@x VzjRbk<=7VX6hUG벀 ѳyWU hYp޾]=6ye:6\<}r)Dж~Bv~dsJ!I WQHŊrin<- &t7fjhe C.J0{D`AjezO{@m 2]zI\'y^KRx~ -?HܼRbErӒwPj73IUZ/kJKdpv:>tA}tKZ`ҙr8WG7H`E&ZdN1S/^uYO/cL&j⽻E>E,!}A"tt}4cLXjW aZ64.6A)#?:|St.WTh16(UR0ޫj΋N/aT{:7]/e}5Y :F-"h.gQݱpDdq4lj;yw5A=t/Ce%j}9Q+;%a8ȊskԳR֠ (Kڷߊi&r8_>3ӏvW?Ekd4µ}Gk?ƵU!P;*/[]A+d[ӴU|6T3[Z[#N4ib6}œoYwH`C`kざ0Q!p{XNQJ]AhT&~ɣohs$('y orQ^cTã!dj{>a)=oQ}p%ЛĞKǤ=HzBO1dZ5/v}S_O's$CK }]w'Zg9"yhay3cȋ0 PpBWU8_(EA %^ jMUǐiUW4bmh{5I(;tu@ TC, ݔq b3+(J=s\tÏ<Ђ /i`'rF=fO=#qӰ'Y:ns~"r֫ov0CORW@ˉY86yX !& RaK5ִ}@Oˈ/vĕLョ>41+"`~nղ@=w"ZT/,{ِ%4{iXM*1=1& >ƬLM[&u2`qC٧?"uqGH =J`ZӤb1k(Y* >l6l/}pD23\e ]ɡnj٢m?hQN*R2pL~xfeXl Mtz}#Z4\?J Yb)f1F^~]]PY#e(HLMUN(1\ג}F[G{m3Ľ61%5U7Dz"YdgtyIwr'NPt:  *81{h85G嫇|̲يU9rxgr¦K|1B쁂?&dlR%W?T"jZ!`Hl#%g)ɜU]j) l")1_wac>!в) Z֝oB)zgI"J2w1H+ g9ߥ cS]= %O)?[A|)Vw#H/ZO9O >jFވ?nXHOmavA`Kj-+jPY4 wPnXC_aDG86 !2zcֱT#%A\PDl Y|)H';:blғuRlm17}Yz:{ֆZ_B{l"$zjj!]o =5bPi6&V~Ń}=B IUz^Ztp<ռ[6O)T;w C&oߠLeG1|$<49!"ds2$ Bp̦.9 ̜JZi|ajVW:KseE",/x :{y\52s0}aj٬DvsֱmK.kf+ zn3sgzz@YSт20 B*3„N5^ c }ی7WJc;2'y5F5ɪf W-nZ &m.Ës8MFIa;"|` Nf\;bt Gl; y~$x=D,>xItt雑ZLRL8|_;7[KG1vi$*AVg%ۉJ#7q 8!9!?+[ؤlfpD9NspmzmG6Ew ,\Ǫ:O#0b?oFU" hνY==%b E[doP l_cge<9>v' t"t%^Ik3-:.z9K  uM0T+ fTU`[y</-"Qs%EGrD~:ϳtPU }@KU6zESa ģ xX{p̎˞ڈZn~mj17sړ2Nx9C}_Ub! :ye~ 秋2kqwg68!.yp?vdg'XjIkqF0x%N⏥#6krzkQ @ 瓗puA03LhGXy-vSU :s+)t?h&̅bl$Mvxک_*e70k=_g0X6k0&QA$fTF0&|$vb⽖z-'tٟZu׺NUU(QB}8OXM r0],SH^Ea5 z~:@RMł0y;P^tJ^11G1>[m[e [j8A7a2ZO|IXBk=? N{/+cb j\Ƹ%w<꣡ͥJ:PzVυaA6E& 9T!51Q݂}$ҥCڒ(mN,:ߍ?QH}F_4=KI+\]q*Nyns|ܣ#:Ryp]'^zUhrv_] zNx18 WNCv%*}}tS%6W~ TC 0J1TM~0sDV%[U/`#6őB)5I3t8,33H*M*D\w h& s.V__<gfa2?aqa0P$%oB*oM;E .b  2w\q#iO}ve'h\M Z7AcH`eP4NQ:J1Ev0%$Vc.F1;~k;m8T]pv's(}ؒLFMnk?՗dUi  oc oסNfLp[4\r:6c֥8 i_F7WoAh?C}3%0‰?_SFLYԣU>סc^ Na hLw7F<OPNq䚎CZklY)eM>u6gyV2*6nAdMu2%j<.)T>ve/0VTښza?`iiT[i@կQ(ӫl3Ob,eZ偋*q̸= b.xU \ vn W=]e4Nwo҈ c$Sxx~Ev M!cfl>c&aŰ) vXҢ_텚N9F1M7Nb$Y#akq 127/,TZ\{(;1Ng ɵuE _%o+ej]|2<д;+\y98-fS`_w(id ;, RK܈n,h^Th^:\jM[Yy^dR2QwAJ~7t\]_0^1 'n@x+SߛR9YSNM)BQ:ۈ0{Dh-,v"uMg[zYte+9BwB%D\&Q[(k@vZGi*[E1Gۯ4Gw˪5VJwzQ 7w# `LԶQyh mʚ (`xJUK0㉙ifXǣӬWdg޺M' cIf ?$ r^>$Pu0_m)3> Z<}92]I?yO+@f~ӯ(no,2CaH nK&m(AjH{<y;B[# \v208'έQSJƦׇ^e(2Jpk@_Dٳz?Xί 1{d -:YIĸEf{jWz0l*^0p%z&S/i\o^.9}؂UJ}zI0oi*3s@%I,a_QHU $Ne¾4WZ1)8:ztŏf޽tא"XdhUp=&E^Ѷ,3]{U@TBq 6_0x&T,;%{<$CV!ײPn7`H<˞$?H\EyH>kV '#>P6]!m)Ǐr\ F> (#}L:]~@A-1lg!}$G2/ih9Web<1_O~CDHLAV:(ܷ.[!<ER'C~T=_O|M?wͣMacs^?A=*f#Wh5|uvO{F6IkȚ%ˍv87ec/w¹w\ngB\Fɟ%6k7,-ǡ[Ϙ(BoW7b%r䉰E0KGT ˎHEkע]N~KK|[C6J~,E)ojPD҅f͓.mQzIEkSi%OAMH-%>:f|QtTQ&RÀPSCpe?l{Jw*CscT6I\9 C7QEkedNl8:FiR>K^"%\ 67w?;4Af=$!M&;ٌPrsfjZ5+sVs D!i؁W=y9mpL_B﫧~?O8]̣2gc kz}OWdL4UI-{i 1e*}S[d[5ij8YjMϔ-g=҂VbAy c/^_}b7lTFyqc'@AMEOga(l&'E'/ _y)1|'@QFN?Tx@@!\\43pt]#yU4>Ƞ*˔_ԫ˼(^4@xhkc&cm2áL/+m)ffY$U 6 I3TefCU mloe9d/uش;Y|ݡpC SSD8ӻ8`ՊL~t*jc#ômQRj)փD `SvY}t*(Q׏Ў$.bOVi9627`RlD^0TDހN;ŀyRmYB \]F7&{WO3q&_r*"*f,]3nEu6 rFy\ cG/YS(no^P~'ivFO8+_IEٹ j e盌3(&s:5' [Y[i=W:7O~ma!/  ,Ӥ[aihGF$!H<+L&-vJidc:|"GW[e{^ε<*yEQas @UNAl}]MqC5)-i,Gg>!pm7#dKZ Ji7p@/@ƷD A~!WTiבv: W߆Sj>NhX^ξxnA:^mY r5ЍȘZrハhؽ펁D`,@HGs՘tp+l䍊F@D\GCc|hD }DƋ=^gOȖh崐%#S0Akm9VJ$4w+"}QYtfBx2ȧ O 8pdszhAgYwdG ȔuvJxh0 K犁[osŧh"yLB'0!K24!mMi׏(m=9_ak\(Ytd7ߍ}og鍮m: j|5c0T[^ϹʇFKҵ_ƐHJfW\q1 (3&lny͚lY91&r'A`OY ʽPgOsε3JO pǑbLPje[Xj ԚjhG-g+ FDWjR|"44O ݚ ;0d! ѫNʤ_aM-K`TOKq=̕pz4LydOꈂ=@_]4'|w4 d{%;u6/3`٥| VAwDK'0HDRF(bm;f5RdFX#,i4(*Ki(dWc1uo&/ 0>}X/)b!vƾрq<"yW('U-dLݡs@ٵʞ SN'FAtOTp@M5`A~i[Q nⱒW8?nZwQќl.̨&1> q??j_qe[D/wefdwT. cYܼc-judfHǻ@avp,+?[fBD qo '9Da=,+Xz_ϞͲIO7D(B)KSݨB }!ӝ\212rn*O)@Y&d3MbZO7ݑƧQ?]Y*H+uoY$2Pv,Ԣ:cpR.3 )q9pq<Ԡ,62|4|`rVqer)M߮*~N~p5=;i pO`Ǔ|764z]U].nՍV &WqX8"-'vU+k9,Damg_E^ NO4 iR4d%fh:/aX>PzwaR%z[i[ֱo*sA|nҢ(-]䗍6oW5.[ T\62x J{솧rқMQśY}]\cIvd|QIsۃ^;%tɵ !2=*lz$7K3X g1Vs4o# 1oTH%pm[FQ -BE6,WG]ײfʏzR(Ƙ:Oq6o7>f8 :x`2:j _oHU*V%}]rSj8OӾx:YA(*V%}U~=(Ȭȩsss=ӔZW .M%X7⸺>3܊ ViB:9mܹ0:AϜҀaStXïTXY<6+<8?֚vgA#J?t hw@ʀ wee*ņxl4B%uRp9,}m9quPcXu 5P]|5g{}/[y*< AIBc$[FW%+tu!UǯSqG+d\34@)H>YEg"6`#$X@Tݐ!mLj43N'%FvdiCi\WY(Hjw~#>YL zOTJIOWDVc0|6TA4Ec2 {-gy,DΧ O j#9)Yuz}X6z8);`/ "R# .JCi$ōx*q#~l.m^9IQ.UT;((۹MT@^OZ1rYT81d^Mv*#Pt'WnTS=Uf+& 1Wn9I|N$5re:m0yPڽ/"'G&=fj[p dП6,hANR)gyΟM+wOwd/W;zkkT?8A&A}ZΔ_̈z- _OwuNSl*_2./TFU0$y,~ ׹Tn@:q>m şچNxh612O^tO4N_T5zaQURQ: Id/$AHxJc: %(6"?&NNAs|? `vA^o . =ݹYn%y=gshuQm;)1% Ơj)WY"3av, +}]ss$6qމeS qHܒe<[Eju1hجRÎ\ka-z#!EYzx+C@|dba0\+. svfosF֗Uj[ 0>>_2܊hMgS " v$B-4jcI AEiRx cpShRWUaApbչ 3ߑfX;6ρ5bww0[I!Wr4Hvӷ>%6S-VxNrcN7Z\4oq';>Ѥgol^HI6g~ɻ[2 |hŃ4HBp#9b1OIQh&xqToi1GFEsO(y~ 1rWb_4ӺB pQ3]ԓ7 b6Z!J'?sͲÞ0J&? 4`I0 #(V>.vYB @(z{Ld O#!kh:/=\}9) 1GUwe͡0s\ H{N O(@of=Qi *BzuxT܎e6 ɮ L6jS-4ZY:SA -Jq;gvw]{Y,Qk9QZyBt*7OS4 /?U(Èv&aqB`o%e= z LϮ^gyNJޖl?%21 h jKԼ[YWlXf`k4iEo-ė6?p %ユp695`޴is\UgJ~3x>Bġ1o̚`n3? 6x9pKA;M˯|31#BSe &mIޔrBq,((u#%`a v9S 'aƇ3W^D9Ԣ߭FSFl;: O_ڼv/@93>z`u@"zbCҖO1Pgu=rm[PE!bpTM+/}Læ3RG@AڝT~ExKm]]_l!QE(ﮖ7/Í '8}sWG=IYw[p&{oZto/9h5Je \qt@]AHh(>'XśZ"R(Y'Y9Ø(3"pژá\vBݝ:#BkLJ]=#/;>Kl%GzU(Ϸ ބ8Q餺ww_+Nr_Mɷ ]3kY4̳C.:v&7d8t2 zVΞ  æ dYVDXJؚ` |4|#*Dx &~!.{ NCrH;BF*w#TS ]O}#:,Q^ٳFM؟%' WєnKFmKZV7 s5f*BC RܖC@d/3>sS"@/`S;lh>vgw$~ī*7*딄s]V̓O~H=(L`R vw90' V Jw{Qkk]lF"4VYHj) ΋?xW>=dp3>_<`.ĶHe 3JPTTz/2P#JqL hr16A ˉÝZzpd~}^J-3+-hv,G6h\#n˖pgzmUjߺR!bݎmfh~S5C=MSU65 ʢ 3 ><ǿaZW q9qh_!eۙRr Rs,'5CG@= R=Dgf SU _S\"Vݥ|[1l 7-N>W{XuݦO&28UW7-GAS'9mx,wwWQǥSS)^kR6u5#RCQm;qu;v !6_d!d]Ccp$~g)3A9-c1p f` |PCrCV*P[N#v'#J^gagD+l03`P7kR;jInE[߻Ҫ݇@ Vok^z7^Zx#y$2]iZ\^MaQ3h RiG՜ 2 Zަxy"DwP>q{g+xDrK6(4G֋V `WS)2cD-@3Cqrt&m˾ܴCq50U`7ϻ[M(sPVյ }N?|A<\u;l*ut!4h96~"B{、%lQ>8Z0ďe86DM^ xoiSz-h{>YK\0+a )kN2{AUhn,JhQu^ԥx3'@˚Rc,X.U!ۆ/"77]fb{ܿ5WneXs#W"];!?>r>Y A9^Ri66H`RE SJ8;7Bh{y8JXky{aW/2<}La2xr5dOPvT$+:eYfh.aX.uVRguiyGjY_ e)Ϩ+.3r777H!|>ݗ9 k2_)1 %PhXF{J7ۑKAR$b Kp=Z3jUbHܛ;@NJo}dܾW]B ?ce4.ӈTP闰|{H=1iK^D긘u"ojQD+lAYn3kbrWkQtߓ7n*`^?RB\bS:K%zNK3溢4L4 8>`VOl1O ɂB7|BhXL)i}ц*$8!} OM>]P&z )j05 V}u0qn1$f}o$5v5EUR4u=Lf +Ȇ:%Z]]j<%{ ,tSΰV YgXRTK)@PF}ԫNOMk1(c"`k*Sh)S:\'`b>5Kj6RFr9lG { [*݀a)V wDo_̸`T c) Ul׸juY ^wncy/ ȧ̛X_3({xh~DpֲV!@]e\e'ZoY{uv-EnF6hK$ٟͶ-هc-Q JJh 1GK?#[>Av]H&t9uBqZ al[ wN92l,Vgw+8 .g$JOx1IYVsDNM-J-E$D$@'UyJ]*9/ضl' -ġ!|K1khaBo4P%mNQl4'eE5W1^J&C#Ll St&EKPIGuR/BE갞ɟzh8n?0œ3tZ|RfUgB 'F^ X%+_Vygڔ%Y\r_k j% / ƒ?hoIi' #d)$^Dc@,)>^Qrp½.ULb04uL%Rv-i)ۯ1XRlͲhuE9M'jh("E|ntjl sԘxk[7RA{il|QKg&Y- %ܨYaEظf\w;|dUD򫣉 fWbkH]N@2|iRTУz h @#h.,kdCCgzq= JW.2.Č礚W'Es_ܕ'~7h&Ap ,c9Q{@D)50!ϟLjҸDfyh7xɥ lqVP^^o2v:/!@1'ߌ%\jj#e eE-bw#A#_m{_}-b7_g`9$CRʺ:7I7#|h9w:9\ c׶IKNNA6lJ\k N'yJi%%.V[ #>_.hD\Qc8S%v eHd~-j#8^w_|}#m/[X(HtFKE'1!5ށ.EPoX]JX Iy빣^"-iT[N#X}g&W݃Am(fe`nXaB!fuB?Qv΂z]cq\J ^wlиO t^@I:PBQPq¬^2t rb fF+giKH{ڨrބ ? :Z ri.ED%de(FxU.Ք';Б=*\T-ݳ5(No +F<-8nBDž>P+trle%Ƒ >zٖM, ]=`EB/ VY5\= Oxez)F&*I`&uU]ѫ_VFqNAAʑĒޝ~鉘;bĥ)xOQIHȼIqy8чć9nzݒ߬%1Z0䍦䂽0} |G ][!ޕd).\ڥCjn0Ɂ][t@]}YEVJPvE.5R5 jBCVbzOq*/aGeq] 픈x"SM ¢<h%zw)P*BZ\Ɨ$cZ3|cd04Hx[+ vF$p$ѻ6UN;K(n3IMwOH a1~ ؗ^Vktcaw Nc@fd݉sFɶ1&?'jlTm5)/8IBjnAlEc[IW(E2k²VJ?/sކ?o -޲I? g5 J`~"Yk)}RgoXGڵp2{5;Ѧ47Nΰe>,SM ,rDV“^|Ca;Q@?]bWеZXj=Ph!F~S4/Nf^@hPp9pPͷ/#SJP6\ Ǭ@ytXv 1zY.N//\),r=mct#_N-7दYjտwO2BdcW`Z-BOR'FqD`~"4ݘAY>#Lфp萭G Sv @E1A[mv1fQڊRLL+Hb8EpS 3"&kQ$_xsYrFwK0n_XƐW)T\= 6+R:&s[pFd< ZpjvΚ=L~?wYE2w,rv#UrN'*ɀc0^}-7a4.[P2T9G׃s )N:0/Isw`C7[sz>vÿhfd67== V+)M& nCfNA:? F0|O? W78SM—O:O^Dj:kβ$zZDRw{hzX<Y0@nVIv3`Kwj!%p7|6Y.Բ8gGGsV*T5aV|&X ]Mm;AH!YMIc.#@THm^(enW;ie.lamҖAUmJ˲&# L%* 'IYo[|vAyŀX̀2밚$$Z P`n^ju c&JZd"~aEAa(C^j wc;h1%gwG~ ^m'|RAXK ^.GhR^[OYٯή̞>elM@knOQ~ q CzI0f]v1."2A1kk(1iˁ7 j BZg_NLkϺրǘ{ޡ?߁pKg`NX1D'2!X*8pqr!#Sw}4?+Btltec i| $!ŒSbV5dN:r&mEKwu N8>[y^>I~Ihx!˱3NQU=!Q#G%݇}a]V.ǥY_֑oe0}2]TrB,xOd ]??) \pѱ_tIoxT6irq%?/a>vG8:T2s#u0b'˯;Bt,õ`t(o·+ $pֹʚ1Dgqʺ( M~B*4RsX7s9H{^?r|VLn +-> PB7~nC-h?t/ʞX hL;ͷk@G$ڂ@` 7n"NwAüsbUh&X#k:xs3XSNY:/5JW@s&T{:{bh4#M>UҝЋ_/Y'DL{bi8S/됐Gqgu8{wxlٮ>۩SDiGm|;};vxKɲn6Vj)d*}BNy&J[?xI. $sJ6?QLf|jge-ZG@PZ_p""Qxe#Ӏ̀*W2%0G/"Ob{l.Cdi2 cxА&CmL>b<{$ҍ;U(XkZfduYڤ]@ooxdK <>Wc@8D xD? N`&ߨn۾9 } ܈l@-xip0]7G<2 TYDeƙÝ9=ټË/nj^}:QֳeX\m1TgjeAAcg}13[ ?+0j,dF"CĔ:iOP?\йdz֝lWЎB>uPhv v?\j@ /-A&{J |Ym~|/&NP-/։J :y5B.s&j[U)!C8T[(wЫamIǐ7Y 4S4M0@wLq4~Е3calzx{O\+IO1蜤Y`?8 h'l+6A0)/ْPi@^ ӧ!1 tjWݷSq7YҞ07fu]Ug!m;Tjt%GP @B< xb'<Q2 <0fÈx FGQjo{\^qП w2Sp!{CC "TB&tYEzP )Hk.1Y+j\캛63(U)5'X-U}({u7R{F!݋N$r& Tw~CAKeȉhZj"~&j%8+K=euBj}z/N5 ʳ|N:)9Dfgs-@0^ I-+L"P]rbB=<8gi o4 w΅o55c6hҊ~<JjJ $'ʱb'Y-ML.ۘ}iK>aœWRi/FxhUg{ d@b6.i`[Wi8W 6 ~ 7D]4Ǚ~*s3zzUo %Ɯps'o*~=dE.*L[/yD^5;x*5uҠl0_h~1qa4t$<R |ʇ8nc: z/d ^Y_p[!?|VY]Yӱ>0Yrl\tȷL{a 9 usb(]Wccb^ݙ^?n$p# G13PE>`8&kWآqE| mw%ئ_ mw@!/J"Ȭ]#D&rAX+k0 7O&8pE?Z\0XFֱwATͽPdgH" ur*1쐉0I#v(Ӌl'e/WxKɎu6M*xBҪC5LKpWNŒR`e z$Y,Nfh:hՊԗc{ZjJ6V:拈u -܉_AIטeR#0s@-Pr`Z>0܊±(:%t[U,i" E@0JޯJƏ\++ҷ.B PNEĪm-H"K0h#,l>q#Np5D '6` isB{?+b?>@z(!˲DXig]ߣmZ&IZm=鹦}:Ryņhn:a;T}ǦЊ 8 fGBp(}zWWB.;HcF)l&]{ Ƅ aN wmt>eah|&cviO]i]@dZ6Z%wsvp_%iev>yEb>T:չO-:S8&d{yRvFeLG\WUmܼX{' |!A[Xs AtdWn<(cֵw]&Hd'j9xD 4 J}^}~"lFE'ݒp||{=6Vq—YLTZɸ/*LRMll㧤I\d0ӄ؇Kz&JH[>vSU߯pFXqw,(Jxv4^ mVÔm~pzL1.Y%_꫉Mp%#VggԯWC8F~j23gb.@f-E}S,^2t)dːlLoef .b.a> (bQ#܋B$@m9c<LC4.Qxm\Le0%֨2#ޏkKM#,e|JttR~9u)mpOtk3[b'qo- j.[H'*9M0 mn1:C$ZY5qn1I|"Q3hÏ ZE J7.UH-.;ML[>4fF=YjPDrC:rʜwcݼ ?5b!b&9~HFp ;o=-Tec +3i{(kϜ49#`f0bcלx9V>IlLZ'$1Jtպ{4%k.雡hlIqJ';4m|XuvB/j'H8,Hr$aM$Pdum̋l499`%mƄf3F(o%=ӗ[ [s+7NawJ\gYoMD^ էtᨔhK"ƈÅ"$*U}WJHA\ e!"A1›l_}Fc B:SUaȵag$ u"Gދ6ion_@271Y^/Pn?]NQO \2v'"Xÿ(wlָe`A)D%cgWBބS״b‹~;>Y3eΕ|] DD-Ph5(_ sU䒅ىr۳22J5.yy'(d$yn XSu8_Ƅ:SQ_/PVluT4cչ]"kٟ xZYSՀN b5XR*$`-ffbovj7'3&Hjjy,M^]A"*>9ZmǞDG T?UzKPƐBC4jR Lc|7.SQrӏrسfAKZU9 Z}KoPJt>m_ӊ1rݢvj"5/o_RUNOpʕ? ߆]NQtu6s@8fSXSWqϮ"$͞:Va4O5jSϧzd/+*nȁH&K4k_ # Qw =1P^/4\>W[V kyl~t罀YA &q?n`8o.愌(n%XWTq;0\^H7bp~JY_EG!ټ#x(yTv_iGB0juR:ac63˽{}yQWGtl6?&! 9; "Ry6bvցJ͛ %RVg"3V$CY2ߘ'9T1n=NCj5=t\9Ij{k_\yhY&!II4.;I2k *]O0j3-ώ[@da־ ؞yQ#`,JY`!eh۶> /c'6v[y,jj= 2܅m@+*2<##J5K^2%'R1H3 gtJ {zd+R#!&PE~rw(*4%؏W˝d; ڡbn!b?V|5#l,$p`S$"7`ǻf=/=8gbC?sfN3D['8Ű6zUT9Esekؤa_ >Rt6輨z'XϠuN݄c >.cr8s\f?`eN٥17ӏH4cں:v)îNZ$ǃC>|@7J.T@M] oGڟOi)$jɶ^Y#L^܈(RH4a7H |$D؏/;QDg.+Ӈ\/?,3֟f AJth-RoѼ? ȑ;y$M\᱾N3(AfѫrNTQYf)Wf=OA8F|hڳ)_ӢyA&X42cJ3r_cNnʢ?kjr F\ GHBq-ShdyZhYp)5/*$DAN[rָ9[>V&hjL^s]֤X]k^նkcףRWGkr ]MI OYl9]mrw955 X3\(Tz@AHw6X;[ ZG|fa{fwPN/u .5}IE"2;\* _5v(=9>UEU3nćC XEƌM)Fzї:0e;dzK8N^p/S5CHob *Bd☂Y<F +N|u)6p;<|ō[}òVc&ҿ76Lj%BmD3 /'))+V֢5%,.._kx%XU"P:#sr FXv!مUK4C0͕1'MXt`TS%QQ{fhIs AHp?$_埼?Iʅj{BL! / (r JT́"<2EsIE7fj+ ;9уbdD"m’'I?*# 0ς2\ZGWIL7hGedʭLnCcě ˽'R~_5lq6r;Ec?Ybp)((ϻvj|A𮷺r|G.孲_[%:e#)V:yMvί ,&E޲YU $rnc '%ЀNi`ea$uॾxsp~O_8pM<+Q8vReR7B} #ȰQD RGPPd@&nr|זpBJsٝ9s);C %rhٕqlI*U7F~ gu);WX#QCt qIV4sιԫY=j X %yc!Ps,*`zbOfW+̒*3opٞML';MpB(A"=08Go"\ʿ0{A).~(6cj"%c]X+S_[&^a[xIuW3VG,:0IwԬ4<8O3$D*%$6$񢭫-{3gU^ a)8Nd J!4V?{tAFp{OgvBW@60 vUNr,>|%$RѾRfHjLRhJbR8C^4/ޘ%KQcD? ") h-傫Bnh3Vrb_57Bfg )9Iuq|QQB1/׆i>ʌ[ ztV[k Z3׳=%Psq:n1 RRǙnl<փ_-Any"7DUIuukw')! 5\kg(?HfAYEKvO?K4'W ykS`PJ†|?)L: zGhhjI-E垫wi#]O~vI+_-|ܱ fnr_K%TZM^S^<=Ous~3Jk sgAiϴeF Qfu/V!!(I îp7 tı17CEbg4=*@?p??8OP#c:>=4aۏ*+ʮʃvLvA1g95"שN糬}h;#?m~16Z>`OKkGdjwu<_b߉tn%ʼO}iEdPM)1M;ܨX)HmKF.b}I:t1 FZ_U{"uYP<#sj|ih]Aq?P@h`÷ngR~%Y E*g=)jw\ GZ.{n`=7׺-k죇~M,F&j3tSꏸ,G|}kg ,0yh-證wKH,%&ʐr`aΊo:fɪ t SIKY3Q 3pR,TMAv@B7ޫyzYqS"zʿ&5Xb3/.V^31?IߝC;u`F5Ua.qHD!pu}b ehR5҈>4)MKj! %at5R}rq齎($Rm~ăGKKMC^F6L5aPI 2>Y6 &|Yq&ۭ{l+扷1(MאŊ=eϟ,"{9 IЩZzvm`}?GЇa/ 8*CqKvA4)h*_3oi@ϙ }Rsgjf5٫e%ddH-LTQ됛lQX;fl璕MrڱpۺXeB`SVe6ydL@[جQELhc$uoĬgnE^nVcĵɾOw[vy0ڶCgIw!j6@ReRa s"W@4UUw&O0=9 on73混uBxnoK= inЖ*^_aP{phob80 z\ TWmiL%3)7!0gFec=(.[/d\NaqWlb 'W)[8Ie%sQj[*yy}D1&OYLeT8&3?0 $*51ɃA>Xqoh9iʬ_X wѬ}]l2Uc)`~q6ź'4 os%ѭf 0;^l]JJ5𸠰^Ҽt}LjstimWxoX}gtw@rgvu|ߕ5 )2uVCV>3PDk}~4WPkL NaHG KX5]hY{} 6د]]_uEA 7=-YFט|N̟i1LNRsra,pO6裛>DwdV~9ɉ24߿j{Zd҇bqP\x,LQ{Kp_8{Nl`̋`H!j9bо8ty8G&P3 u!XpiY1A<F!97j"5ʨp5@\ S-r="Q%O#~llpۜ| ^LaI5!cF}.Ezj?OQm>vgB$wS쑞{>#3͸o [HR ̦VI*Z0 )x}1ݧ'<ճ[2[n4jKf]}"ڶm||ՃAR)UZ}6eOÐE>dEt4ˉ8=g*e-$*@O)ǼV΃t>!~9, f6/ω(iaSՕ^dg{z0̝(RgilNG]@{?L gԉ5/aX;ZPĸ<`i4^?Qhj\℩\v𣬄\ti|#r L~[ȖUyg8@jQ lh/f}?)͸&&vgP j*`wRYh쬳=m" -($5`Dbk&gIy? PJW><\0FdwkA2r3` 7,s1pbcMUr.g>> i}ȳ`LD%q-r_޳-V>DzE+vT(N8r,HݝAT$ivs}wP✫$t[̱BT)a?ɼtմP{3]PMh5 ´ ml lz#|+=ܪKn)vH#eNƒ&Ծ8cwD`O5EuxWB_ڷ_q=t_GINumz]5aY)rгw x-#,{B`/ &?pjuCc 3*\~0|+71> +:X45"{k!lX1.ҋY*6yBQY}_XT}O~52!;ڊVۦn>>p^p)/`UHdPI]Ne*%@ϖM5}f8LTsijonb`&[@\RV"U8h|;U~gos{c B2א\ ݙCJ-/4& KFWX0uo@{Sc`ZP=aR iCL BM]Fs`:Ҍ;)k[G*Z%N黮sWmxj3e!0f{ (q.̈́wŹCȔYPUWzHݷ$&tSQjz. "Vp[$qplib*x๚s`c5>P 䈝KDz E VDl0;tmrTA "ϯC툻HGr8]-iy\'.WC3hP5#,,WMQ  ~QMeR!y*n3KIo2.USN{H`°'EWA-K4󀨉|Ui  N\8- t{IJ-;>A6J@$ڌQXdХڟ/]&q8KބE`&.܀DDChFSt1#zpC”+.B~ϦEn攏A(D2nY@ěKE-V h TSmr:R]1H3)Uv4:#tJspQLGMq\yrVo5SJԪ]=o s )(9+=9\rV6, UvwCav^KABbRsT?`7LS޸; |}8dУhS]dz1_i.Kûů Z|-W.&EI{ƌ#ى{~T5|]'ayޫN0 w^i0>*,?(ц a|Js[U)[Ђ%H5rTdϡؿDgbI}:-^.HE" OK'Ye^JAÖX&㐏t.U2|TR}V 9FW"'^6-GȐhg0+B8 :W_.lԚe;7Z.K|H/Y%v3&?/lux궗|z # ׿Y+_YċVI$-ϧ08m⧋!` R* Zxp:*<_<$ M՟iv4Ӽ[9#>, {E)^S.c95PR}^%W@ {^EŤfGd ͪ—oIҼ$^{:X-o7 sPW̥Arn0R6Cm/?Y@d:b4ϹLN6|t zU2ipY5Vo6,eYҤkC좇d̽A!S wܹl{Tt܅ih?p.%{#~bwuwG:RYMMOLHx5#, *qE kj,(:D9\fJ[vV6@,>rhQh H `W 6 tzUl琜n׈fj]ƣbP:2W[pv}=Z$^ w2"2\ >q<@Yj Xă@'k_iy_*[tc8["w.j > =6DΫ#7,ŸX5kѮM?GvP~e+ɅZWSd]NH%uY#bm  <"32_c){X "'18XNWn$^8jt\'@X{V|҇AGRc# $"b N;~4T0uNa6;"AE=^IZL\8;I!L%H4EsC~=ȑ m3QR֗Ȭ'a=Ͱϋpqmaxy7bRythFAci$TDzb[ jgWҕbx$]\wh+%cNEu2"ȉCK ޶Q62+XN7 5UF!6x ď$@PDiS9oS #k +roؑ(Ń/(uĩnځB:Fgs6br~9l`.*Aeu\#r͟9ֈ f=l}!!1̢YU03+2 ^E#wo.VL]֐s Ү!RinqjuǼ%G:|&NVzBD̝eه{i?S.ȠK|lsD? 5䮊'Y3ݝ6ǫ 8"tje(PqS0{O0"˂t1`m*԰M/~ /$5^C5(c:"_3klڒ2ġBqM9^&įl A{31/@"}&z_ g'p;~y`Tyⶩ[yZX+쾨sN-"|OϷ. x /{@K~TlJ$%ұj4nAyjrz_eʍLEft:a[O"l'NHIEP%Q3 Vwjͺ1E_bp"4 3>c;(b1B.┯Xgtގj#ọ馍ԪiG?ǭCEډjn kQT1ʧ*$T ZmlJ7H7i@e Xq)"B'~/kw׃/sov]-q|^4l"xctJ E۟1u O VpkEH5m0(-2DߺJ-:N贘\tL$%L|xmtBî>Sѳ[FoJۻ|" KPN6cjBh뢒uSq!ޞ'^.$3g\k!8ήB~}2,a㍣|{@8 {YVRߍ[Ҧ/2h9O6 <3FTqȰss~aO$T)VI&|٫7ٮ1QawKA߱r:pk ,8յ鎏Mm6:7,r"f:ܝ d}t5oREjS9!O]2;cBh4PY5z`v``#CpJ{"]HVqhh9{0.fv<,d ,,&rW@BZK5>xB>vTf׌;O#? _WEգ::d7i )BSf7^h#%̱X8؍HR2ѯO rvfw};Oj<]e9z %[R{&Bqw`4ղ^##֙lX. @/pߢK2?fxKcd%PdVc$C-3 f] ռq\WgVA/yJw$i+J%+iMsB&a0 6M=MH@yY:_xzrNm =zgp5pI$/E'QUʎu2,˺tmrwMh9=?տsu90@Pʙ5P E M}_C=yF~PZwN {&s:v_(fZb̙,do~݄ G2( |K0tm H, lR=!KNJS31B w4I[7u\PF_-d Aܓct۷`$qд4^4]s%B@Q/Q֘MX]ֲY749Y:@FY_d<*K+W%O:d: iX: &41HXOs"Q3 W Bi5%w&Ϗ=_o.kF! KH%U(4iX(jU^zv;6'+./ ;6 Ah4L0\^%]| &<`H#*-/OϸyhZG/?J{ tE ӑ Hs}KRyu^4MH3 , דd@BiBV(9IxS\,<L-~Nq掫1$][/4 ]*EKJ5Nx]Q1T!oG}nΖ)S^.f%n;v&@::*Q3&L>6n|JPM熴R{ĵSbkG^۔uNMߘ>[9珦Iu0ͯCJgۘd{c_cN\ch?k[^vz)Z9ZB t;֌gQF. :N[w_:X*EOӯ!"U/PZʓQ"_< y\ƫTi5Bʕ@O_hL&k&a,,/کo(({aG[kyX[=XuǏɬ^7 U{YCaKu'5\a^˼t;pGt,6[U"xf?Q WYhL;D/'E. D'VF.3D.2fЇv'Ūn,-}v vV,LJ"*QS(o%FSWEXX.<µ]%$ 50s kR%uA"~tf[ e[{Y<NP$FP5gF=m)MDZF<~nc5ݻj"dci8{_$ѳWF< `M+ju$ԟ3s27.jk2|]G{ె> GtaG 1XAc'ϝah WgHo O ;?lcZ0@DGV'7 žɸ>Q%/vB{EYӥ=a ]O!Y?"Ӏ_WcGz$7C{V]n1?v:t|Hbp$m(uHajgt~ȖgwRw%cA +q|erh&sw)c>g9鵭mQ4EhGwm#ovD|/BF-o˝'ucBl>NX]^N#F^oۛ <kR0yf9uվ6;,+k~I-C\̔+k9UPvЊ07hHy[h9xD-<|0]9MϦF؝ojZk:8hxPN+x`0K#Փk}ɜ;Uu MB_`nz2:t9+Q68DvY$<A{wVz8& %S+a;Ő#ئi5 wtJN2?` aD73Go:2yS-Ї+_zy$a˺a=>oxHboeTyZ bܦgēe{ϑ+f0%2*zģRS:uB/\*(т>#P"7˺BѡڒI[[M _Qݞ=-MouP͏ FMdt_ %lw4x?ҫ6j!Nw EM5y"YJ %K `4K1 gr)#yOcU<6@!Zt {{'xsLC0hS^-H&41y9ܼ⽫2gs-O\_1+ Lq΂M顺GX/c4U4AHccq4pl]H#W g3u**4lB=j2YX @\qvN$VwZلG>mVl#+ +[Cȡq5tQ+~_޴Y(hQ gE.2>?)@_W[v,#^@\'1ۀz(kY\ye<PMf,@gN)8Yaͷ'PgI06ߦKnB)錾'}>jr{X^Г|N|b z'i'/JֲOFVK+N1EgZ ᩇ]W*sIZ9dȚ։c10?$[0֘RZBV>w5F\H@K3*:;.;N[@Uo3򲥨>pBET WXGK+uȯ|)fDn|Nm@~介n°Z6fI42ק{PQ+YyZg_b1T{j6BˍwIcgkmۤK_ ',+"}5L-K;?,z7JN;K,rvJʠr 7q{9d75vs#)F $[X ea9AЮ`zfed qKn:]]wFS@acgW{o:u7]w'dAAy/#0$t@C9R~qݫ#MvkO9ns_нޣucY0u_{RfФ~SrrB<+,XtШE1?tOiGtgEJ0HPz^ HYN,VOy"~R$ *פəFqAcЎPaIS@As=ec|5 *5p䂔on7K#Gp_=\!ʎت˫ O=XIB͑*h2Ԯ/:T( SU 8chYgf3,`V'ˍx-FdYdu[#j^*%*@9Se8Ut麈mB '2Ԃ rN5Դ>: ~MA&AלfH`,-#(l_q!^ͅF8tPoegӜ/cqq\ w86kavkƁ] 1x3FYzQ*;}8E<{< Hz vC/)EW7GXn6߷`h>-KO1uY#܈*K:MY# Z*E0nh#e,t'@6ޙsHd#-,}4TE|;鎀`v%)lev:s#S3 ba (lf4+ *? K"|=LէF 0lZg5|Vv7? d|+Co2\4^؅tq۟m2,f02;;|/^X=tًFUb`[^Xglaejq+.3o0Еwm6`p)1wbP{r]88X7f̩&EAS~9,['ke67J8c5 6*RƠl1U—%g:|+֮X" X!nyZj3h^]? k~E%1Mtھuy<67r(Ύx?Pn$o-U[8? z2zzBT% d g |k7tf4">MetnW:e r{YUTQjf'Y%hn*OC$R7Qo*!ӪJ?ֺm1,gk-ɞ~腐 Щϒ~<b<Ȅ݈:%@RƠrL,q~p%?M"%q/Dޓ(77q9B ŋ+9, AO\uH1vJOuRkͶ?xOl/Մ,)inᆩc;qx/%B'i\_w=  K7Ɠ͋UxW,ɉǍy$q x;[`~] R|ɿ^ۚpEEF[a ;;V!Wr$WeO_{|0X:}yt_zv2܉P ۄJP>/]S@6K̵;scܧ/E+p8gf^f=&"S8@jCI9-xybrU>礪6#(:O-u!M+6z5u"w5zU0J<Paz?b>yJvčMyG D-[4D=;w\ڹON"7#+>ϓ% seȷ$}z'i{2O@/TKjկڌ3I%>'-fNm$Wƒs M'Ml fzl#Ր;L{HukD رԚ} snj!Ҥ99"AjrT)H/C\}!tAWHURb|cw9w6M,;KE)?xގ TX`\)#vx:( P&;%nd |&/mHz_b\]2{G#5OGyUպGCF0$#_ox'浮Җ BR _J]Xwq0tAZIRNx#ޛugqB9E7>TY[h竕-+6!a9J5(+oّt3|HW`zlvZ8@+DD!$ff" ,BCx<&v[U1|T*G~N(b=iXΛ}pU NE;ݶO^]u^5+9i&+Mq}E:rsI\M>I="K.Ӑt CĔ;"<W+h17aN-_-FñadnY) LQwX< s')W|xب?1OݨoqT.֙@TQTW\񆳖:a dO.唙̾KS_:HtLb%sm] QiX-O'J$FGs{(vZ_ {E)]c Yu͔L}6"b']TpaN?ᎊb . >%:,J :zJL(h1dB$9.mT$zx&A t4-z2S͈P%9C*K ,SGߔ =KO8L=Y˷N⍧,n1z_s9Է-H~>|XXO&~"&b}>Z7՘0?D `g:$(U@cl؅)XW,RBM+=2>ru7ˮ0 SsFRag{6R;63&=^4QN;j `^xۗ<:^-Gt/jKH$%[F B0^}!a_g!n4S`mNFX]1BopK#-W]v0 2oO=Qkx~+vL3}l+Z!aͽV1\1dj_f uEV |j^k%bHɽ9Ty4(Z<&8ԥB,ϙC:!C{Tp6jdeB$ih FVeW0a粬xNC^DBԝ>}{ iy\?mlr`Dj_Ѵ'}z=dwe `a[ Jo{"ʅӜ{=uZz]Ag^6=8Bԅt)E)k7ÍQTYv@BHSy1/AFg4ۉhUdi'&)JrpI;6}W֊tҧead<*M7>^n'TeSS@ڥρ8ԕ$5Z N7ҥ/6=sqc 3F H*XOzsJzoP`.}coPB]zt,uG9A!owp5M`P*P5.6]֛_$YG} i<0ZBwD(6(#_<=+ls}icFȱIŽS qV7Vƭi1t:cPX IKΎ!KL@pgRT3gSZgC|kf{ύ+wT9:'ԓVi<$9`ǝMIdY^. ^LM3 `{siE0k ms0z-0^ԷHhqwy>Dbv=X$ S=,)Ů^]",r۵yR֕(gX ~_;t)ZK]#+|\:_ %$|2v~sf Gz6͓ zfA(x}~̏z?I9s(('PŪ}lW}IbT%P*+r{kpOx<}5x즜vr?Ȱ3lvg^1hH ^c}AMTskL0R].KC=eg'/%Ώ ( rQ^Z,q&Ж GHlf l5LfS&ґ gʌ`!D-71M[=GF·' 臕ZQ?5p閦xI'n۞KbwZ{%펖iiG+ 3$z'/t”L]A|)N40Wgq=iv5 2f4)H\@[2GIA6\aNj]ZpJn[Y`˒}(,ş~(յ.cf eBkBVZs?wU@YB;kΨ3v&" R/$)傎) }I!bQ87: n(&d|Px :kā̶Y tUNiL+la\u}π` p KSTg["]Κ/vWҜuXjΊ=9u! tlMF$G,a^/ˍ(;keQ9o˻Ed# Ӕo?8LW, NDZM)3RD$-6|j(W;HǙo9 ,a6J~ PQL ?p T1fof4>}O 8'Vbpv'%C($*Gp%SeU9g-67.F.|I5Pю{ݎܬa7[.́%U,v~꼸7lC  u!,9O រ24v` Q.s:SO ʋ Ik^mXseOyբY4g#*+ce(cb2`_T g+.|>UuŖcau16 i%^JÈ ȼIfR]ak'钍QzV~aKοUEɳHA&wCoZnyV̡&9Z cKE j GֿQ.i~^zxec_R}ic<߹HyN{ܡX!NDWpA\e&3I;yѯѥ12 CGlmr?(F=ǵmE.1mRi ]lr3cɢ"Nu Bex!N [3RCxM3gb qщc֖\8̲"AC ~"L>eL(ԝ0BneM`^׼sZ'/g~GptNQYDzC~\3|ǟl (9z?d?wDR& N2Dz8E ilF^"(cgi7hnW}w.D`OnIT[&W>O0d+`\qa_TÍ_+w YS?9^<{:r ڥ#u hmY WҔ]> &~tc̊- dfx<ۥ=;B)E^&8( jw #h`D:lOih* 5+\)K@$k燂"4ãCs|a?_ں, S=-6Bldag5~ԯ!X-߀*8f^Es$@y)tH1x.0BܘbVx)mU0V,D;bP@j;Sdbxm=BX6 _|#d_y4[Pm6'pF =y),ʚe !>51E (~KM eNn.P:vtSJRtYHѬ(-g9`mc􈴵- gQPʨs6 ]+eo۞&>+C=CK|/L`eTkƟ+=A}w.K 7#`Zu֔#U\ؖa_ޠ'n.0%ӢG, eg"#QwlNxIqr\/4i۲~߂5qZ e+VE)t.X˲<+pbIG`#ᑃ炠扦2ReO3:Ef Ld^BNDPgÈ1\?\7 @ɚ᬴p`qPR|ktgbڲ*9ATb.Ʋ'jhcv7 e!&xX8?uuN1b9T5{ :Sy 7 59XE:qIBg_uS3АIF^7}‘8*} ?!,KYViDbiYsܵL\i^7<]ςyz?t elEBs)e $lO,ypkVh]~>>UĖN+[6_ީp;z~Kiw}èVqZ zUHYNb;8Z;ƌE-АhFq-j |̊ASJ\hIߥ Ǫ}>Ehw&@L"kLS|q_BRQ2ʊ[pС,gig`17M/sZž_1Ibj{c:‹n㲿Ɨp9t v5@ܼGimQO^'TK] sju/V{{4[gGvF% l`YX%4 (+u|ֽMg5fz ݓY\7 2!X91iS`^,ުpQYbVuߚDh;HQᅤ(,- QTlvUhHɛ.221#t_W[*3!NӀ3""]eeeƭVn&')l$?5idqT*jlmMNϖ3q3tU3")\l+t Vfg9BOvԳw@w.ls:jK R6V!&+O &@QZa50C"R+Ræ-;: ! 5'FGTt%fCj!ۚG**2?65 T?AKlv %b]Svy_['M԰kKEYȫ+ 9wհR|X gBU@/-RԪ2xB6P ~@B|R2,yfPKNO`f`PKEf܊N$&c"^To8U? l[L"XmsT~X'nI+Ѵy]Ws)~5:8V}VmO $i`0Zbm!fmv2gɵ u /U(,ߕ:M6FZg i8WIzyO*>ewiV0>]̀$ V.e+:2qnX~ǎBh8 H8U Õ aTO(dcp@w\1 BdںaVZFy&Syը+WOaYSD~I Ny2. _;RSnGRAsѹ|LE-PPabe.phþb֩<"Sa mC-˹8'9N7pK;8EM5Yd&޺gdv-K'(PH\L3Zn(1 ʼϯb'Se8OG-,EIBMYXJGn7"Ef-EaErI"in[;3`w1{b:c mH`@s.;,0y>"Y1}&E L2torx<`BGa؎*{:טCʒ!vh{~AahAmX|A߹俗$.q2^[,34IRW%æ2J{T3)PǫKU7z5&*Φhi9{׼uf C/7#O>v?n|'u&%{I,@8;ڠq{^8#o#2/7A,Uoʺ);v dԼM7yQTXP3<Zny p$z%){2q%RSebZP:>/V$5д L4A_ٸΘar6UcJ{6Ę)̐`5HɤZwA9?[&~όr $l&ǧ!R^bydǾ~gey!:|6qЇR~ɀpOk^]!a9m񟇕[Urr9m*zʃ,f ]$K٨$ A>n([٨<-Rɩy,'gw9boFc(f`:.|iP3c59$%Mfn*o2p-="ej η+M 7SnF_J."nup~FP;${!"ffpo LOH˟J8Q6[!9裩nuoM!&Z!e|pF`c?(BLۖfXݭhhd]{~b̑) "p?us(jPfgP_B+\A;2>聸\u񦃎E:"E|o-&Q6y VxtXjIOWp(:l+^y>|/L N50}oSGe{%d{s%t-:Q,%Vn"SnkU[lagj8=8P^F2ua Ӗ*r;!77PD'u:k&,2}GhJqk4ap0|`'b02X^ynٽ7v4oIȐDpK(FOPqӻ C\/46t`-F ;qmK^USkPAou/{tve<Bfj~*p#LŠ'RItsYeo{:oӁVM4"n0ͯhد(%gV-'VޔZAdHF.{e/o+onKg^=uICj=?x{}ZЇ [)s{x2W{+DZNVg9jUI,Nv,e+lw`/F]5ev7/Jk~z i BtaauU* H (i8W釬LՄd9d5ԦX't{L-|7? >mW32K#^WiLfXecsNLnSz6YƠA(Dnto7\ꎯgĦ~f3ൽ1Վb`p~?{>5v@UUm`05grºR0t|jsT pv.xz nJC?m-C~w.WOB=򢭬n$קkW[P͹I g]ӽ}ڄ=הsXސ*w%R :9@6 0V2flR=pʘ).<hWb|C_jBjHh\uKW^:+|X FBl7{ ߮B},Bk&pzMYլ;]b"Yc)ٚG^~9 X: 䄾&,UD#.#.Ag)K174$.mmM6Zk0<2C6B >Z =Kex+!,BPq{wKcla^aJI nȁuP%<[`z)8J[\2JS[7j_+JsʕKZ\3of*|R!p\Dƥb}`3I? ŗ-8w*X pYPcmF+Lo,*N̨H""rt;̔qCOE}ȧt[e&bM9APݫhb"7uh.˱KRWߪS&%Z \ME( O {π[/>3#Bln-_qgҡ 6j|#Ilj3Ag (!u\0$tr\B:Id89Fywy6H^BĹ8H~ Tbsz;0e}@y{-.cw* j YIgXqd\Bl{I@:1d!| 38v,hޕEcA AXu*5OAϥ9*ob8EkkU3I-x⤪_紇4xlȥMs05X`%(\wk5u!(~>EJuȱmwA`&i c"d 7[D*V@磙&~O # P>z"$dѫ\3Fh) rt@N@}7bm];"(a6ޤ+/G,eƁWKޚd 6OD,)VL ] ~C29#v7&<3SQ_igc6!~D\%dܿl @YFl?rsn:Bx pVr9 jTPtAc3$yųt8?0j#2-Tצ n [BkKWA9T1w9t3bhaoP˃\ZS%Vsv&2x=>a{rcHg)Ƕc2)8kʾ>1zWV.Ke{,oy_8/1x)Umgw[ 3F&o|8TtBӧL51# cr yT?H$moV51}P19SʽO,W'Y R`Bt*s<7qf4p "@8/ifmU kMnS |X)M=TDT˗RA'7I=jn4RZhc`s7k fA/q&>vs3 Z j=)ɯ `|Ί !a^"M+]|k\>{}rH nD'&>L)_Q7c %b8or `D0gmU,O B*|Nn~A儁jlBs a07sW)f);4 <1j!&it_݂9^"שr!{gХYk];T%f7WUXN+:EN}Z!EXV-wh)f}sS wz>Vp U+% w?KH4ٯLm7웠%I pcD/=vWD5aܫY({:er jDqjqV,ՉtG]] cM-X<%!ŬB>X44Y (5-_Hl25t2͝| >U@c[/F4%a6ol?wIQFC\s~sjw}C?"qb*qitm@5mCI hF ;phЅ]綣0IU}3yһnr=fl,|\1 ?a⛓fV*Œ ] y+CC͓yD89Yq1&M.Q"Ak(?lx2 iQ'rUg^CҊ? 4| yMt?VסT2;<R髩c7ϞMWмZ49L_=mD>nx %ڴyPL#(c-&8#,rT )_ jFSDZP?3w+48s7 9XMާ7'7:.sA=Ko9B}'SCM d:w ty@Rl%g.uv`  MEKvn?rz\IfN[Șhf FwH|@<pgApmKN\7S>M\d̯ņMY|JL`:~3q:LQ *b^m"h_pܢGaKb1,osBtD]k`QZFE!8YXXDqU o@y6TDp[qlE G_P- <f ~ [~H-(8cWߩxtz8vFR3 PԆ7ԯ@uF%MO[3珸7b΀0t-Qcs^ OD:~GJ+nԽ&;܅ʇ21An6n ͎>3 iL.?9ކGL|ː Z"f%]bo1"GA1*&Q1;58l飦ɓGY<+wC5~3 AW[!mTwAM獐UX `% GII+Rk"}&)f؛i mc6`}KBBTc$`lx˭P=~x%Gt=7{@Y͖?앿H\ RkNx l{oT AHJY9qM ada|ܟӧ|߽ 0c:œVGtb;"eu[: i\&}h_45)֠gB]/"%/{w[ytB;צ#,;rO[O4-OW8Um]HvĠM#HDsY Ƿ*޹vx*ֲ]*O8lZwDO[&L54TAPNeHEUJz*8 }98$ &;ayZLwZn_rk&ʹv--hIK1r|oX\2~68pUr1`YੈQƴOkͫzp5ߧ}g'A7ȵE2Tc |/4ou7TyJ=i:P!:}q4,y9@ʠEw]5\i;>+u~! aiJyl7/"/2d'Pb-tZP"pO)PqOn+E{0o8)E#HWֻ(bn腂P:xºwK@9K/ŒDc U.|9/*b~ऱ8,|=ɯ-4"Jas8̌EO0x?IasAvH`+ZlT8~rO{\왴L>nABPj|x]da- dR|}֭#Mh4[|r<&:|D=u02g?3cpb%s/~ 9YgDRZW!ݨ$,ӕ. Qx^1hDN\ qHȚ@ܽ/ 8ǚr)1,89~C૽Pj?ό,馾UcWxMyi:2/,͏Ve)v};7o Z͋֒˃&3Zv`7_q##QA eP" x#a7\l2bz`&"<V~xx"RG-w ֹ mka90i,JigvT?=xîfjO@݂,"ĥ7:F o\ZvlZ uZI^X;X6˚qu;x/+8fb`Ί(N C^_H3nޫ L"&l CG&< TF  μzYVɉ6ૂ 1HA߂q(ïrԠ^E FQPM:$U-/, _Q?od[7! tq/vǚE\>؂<C<]/ (\B>'dho?Th@C wn+m CmW3Oom,)̋)gϹW|D7ڹ KN0LH^" u-xuTGˍ%irjFO}[~9շ='.݋.d8#O!;:ٔ:OA_D[ԉk}#+" NOs̀IҊ[4g:- ğPMhPCAțzi?58i;n?=dk_ M*VA68}'ct UQY8>lspC5F?`]^őw/Q/tS LcuCnCfձO^s6 l߯NV7XxuN4ٱLnnyifq2p})Tˆk$'*]VUǫ4K 2ej$+ߟGj9H 5Re\h"ܠֈ}5Ɗe g $u& i62`)O1\@}n# 6$'0鶉%#&30Ic'YAMR2̜~bg$Tv+| bG-(cy7n<{\:sD>m!J09,&u.j/qt0ʀD؞ ToM<7] ZϽJÔd"ٔ]s`Uq/HXH[{:AQa? |@<źZw3/BljX&;h [y @ޮ㇚?~QڕJU#= w2W X0>͈6]hViS9j}[:~̈́Fe~FOǕv0#*;գj(V_ l|?n㈠Klv!*y*՞@<!(9ݥEAf88 ǟ 7WXS(N"jQ3$#W1z'Yz2KԷFD|]<0 zU{t;<Dw>ɲdhWHa p4|5!j2n,yݡTewcN.Eg*`f9Qʚ?<>-ܶ,ӴhۭECtTLsKNzg}ŘpQ r=OE d3(y۲q 0㐱|Z?Tr%/9Mm| N{ &bM=z*41EGFuJvQci)7wmKIDdj[w$J'xÜZ!VFWIZ8 cƶy}([ 78XDd|=PFt yI1ߛ2T'Q򫸗a)7jbSs!./CO!cV`lt 'Y`ɧP˒0ӈs' jA~LOҒ_ wM  R,{YD*| "H[Ȯ/{ZuRKGRBu&(=CBᅥGC{pqS؋1{īS)T$;$SFx V<2#H-cDoGeQ$j/ut2+n҆ΏE'wKl̕GJ-QM ;7&k(+p"N#}njiN$g:W~D{y0x|y$"D"B)Dؽ59V=3\3uȭ1{*\[K }cچaP%g򤭳hC4l n& kV2aD>'{DzenAby_N7TIS2n'qsN7q\0TU%Kn.۩ʰv $Zy4s"ntXMyYxWzi 2 =!Qg 0xEa;fcO>Yn "X-,638Skg,Xɖ䲍J;"Mb|T߽6W̵͠JbsF`cWf q2N\RcDJ6Ԟ …\i%&?HYP "%R4:nکZ$Tf0e[\ 3=/_U TN$ R {%H÷)>(OܜNf;ng삾Ka5׌MV jyN5AJr,ٹ ¸y W~x/w; NEWaF .D_,LAenG yf\~i@=G򶙘1X9pC7^o@ts "<&zWi[ZNJȖC=W{txpIdY~ >@jRLyTIfsLQ_Ԗ^K$ UY!CJUJu>[( IlE%iqNGwcL㨘͔9nƱRI!|ّIS' }U.qp:(\3< y44(,qL1wח'8E[,&r#Cqa),#S0}$tKr2fw}+apYnXSH| \ 9 . u {'b,C2q[dj>H] tH31a12Ƣތ&>1%| ^h&pˠo\C,`M=1#-N2Zu?q\tSkn)v*#|;bh/q(En6ƈs^ygH :zlcZa`H _~ۙK nr,kRFgXHCj? a÷؉&G *⻯œDj{\9Iܣ֞62 EB>bH~ͺ%VMT+AL[~]gqIJc:9e²I"ƾX35Cg9ibMR*Tz,u^8 ϮŊ v8e^CT+pdd1@d3nɋXHC^հrmG1]wStbwvg8@t>Uh8`uX,1% p:BҖoZ/5x;s%돪$;/jCD=xJ\œ H WV[D/'Xa/ڝaȑ, O_*Y)8(ŞqM8/-(0}[Kyߴ宽~%gmU "IM}}Y8LYkG y)Y%920QFA#Q ]$|/Vl G"8A"Q"2*KN&BuX ӓdp`0!okUWܫT޵,"@*vrԌ>Xw5" æiU;rwh$$ςY:N$&:~qX?>G/75 ϯ]~w>.iyo&dB|o0AyU1MGc?ǨXm|>8K)$v`(D%-#'bC.T֜ cPq3"4IH3E[%X) i[0t6/ -4gՓߞ|?tDɟ(G b'ygV_ " r L%4_#WMfQ};O4tw CE>qଢ`X d쳘F!p$zx\Y?6 .Lw7_ _ו"I˚|6^09RAl7gy9OGDufX ҭ ;ylLFcF4CLZ]RJĭܘR7diAkFI}f&E~/ 'ҮRZPQA,CVdUi#\:~a^Ük)5V̇$tl&?]b-J[w4:-k!6R΀i,.eǫ a!Xy ;7$>ϡ݂a7X8޵ ]+A|I]^B#eT#gq$v0"+֤Y้3, K2 sO N9/Yk 'nF\KIb'p;lg2ΰP`>0^svߓ;34a{h7[@fb8}ҙ+3+1م,ٵ +ua"b5oW<9io`VOꄛl( aLaP>jlK<!&g~Epe׏v\˸? bc}rMz*5tSϭψ9fQoXλ5GT7abv"bn e]ha^U~}FaHl2ꭙ7GVzzU<-8r˓s㿫r"l-y !N{R4]b ISw @LE`$}LpܗМY`L_ >}Şne)΃V[dJQim—Ϛ+SJn+}3߰9Di$rz jPC:]5 8h]<$'|:(DӇ'̲c:$++TOZ&7da(<c99gI -=K iN -P;]Md2{8~ vb\GxEwoDo ܌_T>1eU^$ c{e$Z_^8MΥd ZZϦ0*T:+9+x[/Et#̱zwX !$"TJVf(ڧ?gf fFiM=GCA07 'Vb%lO_lJ&e?)+ʀ 9dӠNw;WSq"egI4-OG59gYov[ODη2¢cKh*1;BIr<۶2m$NJXhbC80Vzxg$\?w90*2 S览"k럲G[0%s9Di٧bFh94x!rav;{S?4OgΤ @){ك~jN{7Ah]GQ` :.$}Kj&HācGyN^ 0 GhxJ;ȿfũʆh Ò|'-\m͒Fprw)k=9\5ݯ;* raD@T--GѬ'iI'n `I5_OUPcE h%)N KoSbG[v osC[H GST J\ڏW Yn)C=} V-r lX= A⹎:wkKx30c]\{ ;oDH7cEmž@'n ]٫"hpAn޽5^pw9g͘ޮ uͶLÿS aя\Zg;4ߋ3< B^.Th*)s\/T+l^~C׀ThMx\NIڪ2Nr^^gY6)8ÌPź8-:%3Cw݊o-4zPnr7g]ws~`,4zP\fYuRyQDŽ?M(PX!^MI>燏)=5]<9K`skuu<7SN݂F#ZО^~?rn΋*aG"tyZy6gEXRo@ jC sFɟ %LmBTmswh 7&asNk5DŽ:z?ćXDµn96]aj֯|=Bo \.s&8U#[- [W_)hM֎C9ooWy܆[HCM3x26颖+b@]]5݊c>Q,Av%c=V Uj`z hlX0ncRK(s'C^`.=I[ݍ/VL%N rG'PJ}A&9dee2sQSι{9UTNB+5K[vz%'WT2sQf + b6-luAU؊8>wf-BaDR~E$L0qgràX=T +?u[.+:pGԥM%\-46W6'8Ţ5 럈yKbL5=t9(\3{V#^fD8;!hw^ cG2TdHB#6戋U F@?RO+]`@Jz8X,R\baO†+6xnԦUxfCIVqU:UNu-!<0k{ ~zjD_6lN^ x_,; O y ~*H MزN449Zd[EimS4mX)< ( +@(Lŵl#A1{p W!}{ڛ4H7yGwx#Pla /GˋNjj}NdZOe ,_? U)# !7ѯh"7޸o8 ט { 3NlUd'XQbu?~2`υ8?wG5Cr[ )A!j[qg{TZ:-9xwfxPȱZ JV+} &8v"G gInZ:.(HTX,4 li-Q+M[9|q*aA Ƶr|BIԹ(lb?)9ahOY[{kPkg$GrVΥIdhla4ȫdJjZ5&F,]  ^QՏ;uO4,|7 !y 'f !4J-:`cRΖ$uhY$ /q_o3F-Xaz%g8pܕ1Ѱa;pIro'~c}cNbt{T\& պ%0Cvi6f6XHdNI_(ac=dG,1J.Ռye'5Y/ VJ+n;"PVJN"jҝG௔cƉ97>t%AvkS@ZI֤!Kx@s ҐJ̙kWQ痀g6m;6lGdo6.|`mq u l  ]Ucw 9b J :\mœ,FDlG&4\)0e~vbC dZ CAA|3Xd(d*TL`TȝHJs0uWv/:t[0qAO/,*ak$^ҬhmyRݵt ہXDS9\<.^0_K8͑^';nyYO|h0m"\Bbpy[ເ4$]W i䞡??ҵiwCϾlVY2Zu8v rϕK<q@cѝju'=C;x@xfցȷz4FɘQq5؏gAPޑ]-֎VXPR2(3ڮGZA6;^ǹ7]KԩioitMPA0Fym2Ϋ.g]ʝ:㐪"3Gh# 5ܯ<6uf1{FLwܕjڬ$~=co'x_v_c=K$uW+00w#Ubp)g/hWp&o`@ubVr{{ W{8Ŵ y2g4FhsOLO :(+Xg=&b>~I#ylqQKݬĶ0-[; ],W$z4zí['<{y#,'7Ȉt}gYe{''v׸񏨙O>/7j4aqNQ0Y 3⪤{ Y-S0fӂsK8ĖYS1RcͱbDy)ղJZ*ZEP$ "~)FXHئK—B4p / s7|B?sbԋ09雋Z+ubr=N80+B9(9ڥך 0.$VA\_bEq?8Ƙ@79$0(rdW2;I_Gu+;mɁISg|ι!Hyؑ~}ДLn^U':Jq K?< S ]g7.kq7=ʻ :]5h<7!N!mC\hFL&=NUPUׅ2 aJ&B45:O] 0kފu[!s ](}o$ZHjsz;LhNc Vwo I&[[_ؖƙV6&(1/Qp3h%VU-rP-ѡPf{Vء:rǏޟfVXQhsL~)O3pzbYiRA`I=@63}O6lRZmSC,Hlo٧?ߴM/=5!FoiGZ'' )KM{X08e75e_͘HOLGxnT6U3((mGީt`c)ynW|;LaŪn?/7taBeKnCK"5 !߉=If8 WK;w8`)0l9PM82T"Dsv&QƽAD jJ_DV](iU"N 'c+RC(MNٯ|4>}pL>&!>_ƅ}.73E7I9s8ʅ蝶*ixRoLX=T}]S0$ubtdм V*{/X?*ٲDGTtLa զfTT1u9 z]$HL?XY0$9gBEޫ#) %W<|n59s &'?ewF3"PlYyk%^ bE@JCɩK2;T6sOu(vW>!ǒIod/~bbVsRnÝL~OΌaW'nm+(@BxOdEh؛ݮLى23cdS/?`mf/Ʋ;.u$)uA:zD { Wo' a᳐Rݵ` =U,'8xCz)5GvF8VUzHR:}.í1x46x(/6Vr[obeZƶsL0LA<`{SYEQnI] "s3sҠ-nom6|fh#_1UAPqX?i1Xk`JY߫i`" A.VsfC֚~X!~(^[Zkftȭ!CC0㨀&[, |ul>*mkU:@rY *Hb 2oeJ*`55Cy 9io`>ma^C1O1SM8CbhiGmI8H7*Y @0 l]iQWEB;0P ŅeF#N%!;l"#]ZyK!碶?dƀQSkҺ/a'm>/mrqz8H[7CA0k7i:$#)T T$ hC|wۥmG>]&SudBn=(=A#^OqFR_uPDQyMJYwrp$Qƴ{)#DHHjabw6iV, E2/V@ռsmtN84DM@ܴi *8d" sHpL N(3f!M.IߴLNȓݣ!'y;<&x> xWm~׽p nc]i0:oJw>_6,PqI*Y 1Cޘpv>r`^JsEm.En4iׯt^;o!+/|y $.-vjB`֏7wd taSXccߚ8!Q Fn>R<1䢛J~ZwXy6w Zg i$Ve:|bYrM9U:O.m΋2QhES1͐ ܛu9ʝ}tR)d +>at⼊l{L@qf.'8{C A,jp)Aæxe&,F[Ҙ~(np z@ZJ3+(βj%EN)ЬTE+) jEKS? B~e0(TܲΠ8릻~PLJvs. >LKm\)+e?WJ >ʆǭWEu8Ig/NnXx,0xܫFA"q"(k<sU SGQCYU t Sߓm5[%>c!ƄỬEWu⛕,gPQOl4uOIμw8T6CH4 +*t_[>#:aڠȊahZ)~"AtJ}J6mʅ5OhxANTyiCdPwc vh^ r$|*xhdޛeD#vX^C5!go+)RȪ[KPwb]?NzWZRNԗR:ey+ifӿ{PjcwP14rV- X ȶ7g瓭#E6Y&r$7H*Wg;%zO5}1nX れađE3&nhґi:Շ,Qnyyx {݉SJAP枂Z E+F`xw`E?K c=쑂+;clv0ԑmaa%7,&(alzfW)雄}E9|,i cp5EƨdE@tcW ZSr!Lˍ#s䤦ԈAYC\Bru#nҌ!°''ܨ.jЅ']s~aulj%kI`rMJP|`Ɛ*_)a,C\f@{4Njh(:o4,ߋM yVjOjHh^)@יEcBލaW!l<@p9ոCN7PH{*&D3k ױ֣bh]YZ*tW7,y]Ʌ^9@G |KBy "3yD㫍P%<)ޞ-Ӛh*ߜb]!Tr^C//؁8%/5'7:^GwEG7axe@45 [7%4VcLz(\)Lsqܗ咘]0VyrqUgp ( &` (%#]'^Յ] K26mV< 3 5byDO O^y/~f:0$O"U5S )qT'K蒓k Vu-s48;b"(K:R զ.%B=F>P\~B2d>HHycЂё=E?h=?8kAȏ`Ci:.NE~_Py"v8oeƃTlGXΉ 09u!oS o/պ@YXD旑UL=Ya Ym٢в߮.G(POPCx!sW?.BiuC85 DR')1+LvV`]?E߂NvRᙥ+VhRNn <@RC ICuʁddz9(y1c2SÎP7l˭z:DdS( s/oXǁ6=+ъZU}Y%elMa `~R{+EGBiHN PK>X,V*uE( zQ^ QuݝRL2t' vu dZf."( :mp?On \^LHKHG&?;.=^c&*Pao#ֆo#PˎA`1=9>'y2^8`dw^TU\4~g;F"e(9 ٝBCVB4A!; 0 g[D9CA+ ?7IJN_[ՙVnXϥyq©ǍVZ3Y0KOˁV͵9Xߒ_b8$Dx%61aoY*=iC4<~J_BN2b ߭MDu}t^pt;CbNyp?5{N5E݄|(hxEׂǣv} >ouPs y=tfyPMDegPCY,}bQ/Ǚܨ} A*ә8N{ڒvװ>v£j`?~oKİ,lOB|JϿe Ĺx,i@/"3E%\F֣v-v.C'&SS fOG}'.He0 "dFX4I@Dlȟ(c&4)]y;Oq(9s淞u!C- 55]5XY(wO3(XȖj1pݚ| u^=ċ%6 %5Yn"`_MF&h3yWL: T[(H# ;-gzy<4د1>)>F-vsd|!V5qqO*d9VՀA#~[?n. 4 brl*_!(2Ο3m!P:)t wS"1:!m &01 VyBҙ|a\AQͥ r׃*I֟8^d^7{ₑ 1:mԠmQ  &nƃhDҴmud>K2h=(!fa쵉te+&gĴ=l&(N֝J z lQ0KiRIo7-z7,wNQ~}o;!=$b4 Hq=s!=@MtUa٣:LQ= 㳬NZ#3yj,YiL񩪟82\ Sw( Or@C!uc qYƆ'>Y~*eBb#4 s0AdGxrrIuTqvEVg(^l>a;ȶaQQ'u}z* g`B(bdDKoiAUwg/mw߸? *ZX\-lAuްO>ûwuYA5Fz֐i%FPu;dKD&0 %9ln5/8b'5Z0"V$#+5b|YT _!>(W2x:m9-rl[jQ_<Wa6Yo~ސ?Kz P S^&qz@kz3-wGSֿ,n1obQ26MX`_VLۛwQ*X"&D nA"3.M-~^oVn:IUV .f 6("]ڤ*U 'QqMRGC !;] 0< g@" taܒl]KVů'Rf̆m LR]c7Fsa]ڀ$^_gx@ѫWIqPQ ь7G>49]heah9e'-Ic1h{ M)Qs ess ~n$nILưGMݒ]L;~Ce:@'߳ EvCjNKwV1M; W=Ce<0CСVgH [Ye.4XEe]|f0 JKDmZCkuj&)gc@>$wȕ6soIdMr Fd*eaQv:#T):),Ib6UV 5b%6ZO"ՒiCeϋA߸-49Rq3(onZᝃ@pmG"k y ?b=/ɩW^˹pf,7Rl@,lLEfKP63m4R&J Kp+tO%}0UB_S}xuk:p@{bݚR!.G GRaA Ä ZOL9G%; `LwnƬ7Ra2v,C a9E" 0)nw@<I R"J<-S1L y(emA7.`kFs{8)-"A ń0o?_1miplU0xҥBF]̳cD(+KVjA4wg|M[)p&ƖbS'csJgZ xM*hZ ?F!j%"jbFW) iVD x6B=W0$]bG/+TD{!R! p^@66R_\z־,TܷhxF yy$ԃ s਴=-tΣtYl ms,EWj!#y&i+#aqI7z^p>=g?EaRZ,(][Pl ?9v RJ^*kncG< o:j04dPASCR6 Y۽yނ[Vݵzj]a.4P5ӔP~SYX& %39`gLߖ,sINf{@pIJ 2? w d'aG^+q'&~؈rsmǟiD USіzgUm_ |g=J_SIoZMcXMrjNɞXE:J:>%}BTj*՜&~DѼN10Tm WLzqUge}5D (d1ρcm@#!fER tj=z5fjb8ä-:/ٟioުu={*SyiO⛕ UHdw:)Y` ,-pgpjep45qP *`6•=,^?2Cjm)1z6=>.?huV/ L TqHN0Ykiff@ i(b]At@/sGmf:$+N3F6EK+ )԰}N+0W~#âd"z&䆺@l5w :$@+h?DlOw1L*`^R9eN!H?:_[;4`baqoਪE[F;zNSQꣶRϴ8+EFP9UGr`Uܘպ;G6 ;f3t5JaMv:OZ/I% ߬`;hC`˄5p,UYi(reV"*4p||JXkmO' 8u6GL:WggyLrWۂ~v1t𱳅y֞ FCihYĝC;/Ԡkwp8a.Qx󨍽)EkX}Dɨgv:L(XD%q{r;$b3i`SWfMtVy|xLx2tp{Ѡwkb!"5asg*@ic4E?wN|*O@X>zC3"Y,tjS#~͕̱~A>€ A[ ̆¢^tI) 4>I-CG5+nX!劼 M:ꐹ{l+q8)XC_$G@ "i\5@zԽ-%=10`˴}ޤ8>?,+""ܪͿNEZggKzc\rwU6pľg-?h }!PYb{Ht!dDS,3LK c$)I (@U|3UHܸ)י! 5g,35^I*n~ ~k"*Sh}-:9 fs_\ؼ[#:Z₂e/$ uƧFiZF1 K=xd:7zJqxu']_0YbNR*&BP5@=0ܣvLHXR B=# C,R)";5+n#)†ښAuMZ'iohhH0grL9l䲔%{}63O}v!_)Q zIE4Wa B(;:1x17uFTo~KWFH)3`5vS[쎵LIW5W%M!{;1"50KʀD۴c,P0 6FZb[`6oR"sͣd 2jjDIһAVcSw$ꉋ^!q/bW 8R`՗s7[tAQM|hp>I[c ^Mw0_gP`NZ9;Q!jsqqD/i\ô~xS&95uL+dRg (uh$D9yşIct,Kߓ˵(v+K#_ol,׮4Q+< ,kHkRMl"a@E=lzG@\@+=#h@ ̰k[CV+i#rXUT~VQӞި]Ğ\B8wfWO9kR;n8Ӹw^'' GD&+vnQ< CC\⾶$2rU!--?8pv(}bĘx}c5P-pi)A~Vv6<&̏^;M.k>ߏ E7,ۻ@skvoɥjѭ Vtu8؜9 ~Nˉ8RQHOy+Xg7 #%2x&"L{~'-]Z^1͍P[ TD/h:g,f9sB\X=׀~ϟs\61 #U>m'Y"nl]t]槃7i0ƊBcEi JvN.Lњ2H:K f/4qWb Ds> BȁATV,Dؐc Zɴ)t˟90]@nvB}D/wS)1jYA9Ҟ6KU!*=.^eszMN,R*=G9"W|:j%30\"C.47xl7eW-, q1WMF-F.ծ5z/E ;t6Q%.d Vo=SZ,r1dW;Pw pɺ(ܖ#|R9׍OEX:`[ ӯ=Csǘonw`eEl4PZQiw.QHoѐ+IEd=DpDH.(M$~w@ R:-{PQ}Jo\bIqj,RI]vZZ%ɤk(=$(Ń]֖{~;,pяb{a!z0XD M\0f;gY*"aqg-n7hZ[,<bpB$bVe;P4W|}ЇW9F:0צ|& Ӂ } >pR GL1 "hM<!vn٩1sZ$m"LlO9GJa8~zWUuC Q~f,M XY?pe!NyW-ނH'C[w`?lPpSj `/ck@C1zt])vYXwm|'>9~1%t( <~)H>H(&F1jvt␉_W}޸H%+:jGII~~dUuecYYϤ|Lxo[<Ʈ/y S|3|X VLD~edr(sgx%Ơ} H0ʗs Cʏ墤[ 3z5՞M>$M޽aӸ"/ӄV: OYG$x7bF!YgSS#o[pQ5\S P5mj_)wh,_AYvFL a!^Gx^h~i4YMDY&@}8"/'MHO! YG\v8̓C@Kj rW\FTu 7Op[pkW gj:QH9>=hd@r=&v9?Jn1Ҥ[qiRaG(R|TK,)V1#˺s-z@;8mیpKm]{+FUތ_RM@se0M^kF#D,ר[ubDD]bq:k1g >L:\ETboa AvTe7N7p^D`+o8>Bg@S34DBCY. Sky`s^L z[#P bU`Vfάk#Sx/Q+W.C}VYen_-.?,Fz咼^J8t\a x>[|{ތwRXګq']~V#-VTy;eopnJvCyJrj a+RfKc?cGW%eEh(#s]ʴ9[+U]Kj Tdmt%ZRa+l44{CmiuPgOmY"mfg!{$=csdQ,;V!:9eest-%[cKl@ YF}N\2gJs_j )ių+.| e'-tlz{,*q͊e+W=,uŠF 1_/d!w?۔`P_Cs%[>ƻ"UϮƫQںoRIw(`hP_#Ӳ6ze`]"S~ XT,LO{zzسcORQxWw%pO.2U#aAt,P{oUBÔaܕ$Aw KB &jν8HY_~w~L7H`GGө ^&fu(U)pB9u[/5eZux1`_+| ;`.럳JGÙu=jxd>x))`.W#6C-ѫG= DWvY18gT(DE!ؗ}{=Ia_>)cų%R Z` d{̸ᯎs7NC? zZeqkU*k6b$v0Ęj~0YTͲ=aԤRD}IXB;9i .8B( >oMYHL Mj%dm4-lUrg^ ?N,bwɟgqXt`P f08Y>e_E4>dmL 0$h\bKKa 1h+?omr]sA mC6gSNw# {Eh]gcg&&||EL.."ApyYJߥMZ 3#Y-- 37%ė3=^`POU!{E%:=H5oQ(s*tyP]J ^m8B Q^^G/qm&#V1IWN;Y}lA*fZGt9`VJ:X[2 OF+Obtn7EŘ"~sɸ " _[ -4ƞީRӢ %O}\lVcGqS2•k}gmںΎzɞ3m]}|_\/&E8%1zur*ΰzۋ wSEmϯ1LZTxh̊YӋ/_jP6f[61tL e R~'s)U5hz!Go8 ZP*pPKz !YmO&MeixVVO_#614@؟ct6J@KzOj@{dưM "gk>BfX)CDr0j7iD̜hvfԼm'^Ҵ}}릋:Y?93 "t~2wt^J=-9o-W [y #˧ MG$ Ku.zn'%OFUZ`Q8S.řR"a$-^/O*Rtd//ce{zˊX{5U@qگ/WoZ|0ȁm#o/׮_ /G4}:s0'eYA?bZ][֜?!A^gUGa! cE Y>oǽ_ cR=5?4s T\ޕ3N5k9½"J4%=d?\hfF#v?QnU_mW =R U+OzXfbBWs5\/1V1O}ǡmo-_ Fф<7 Jkf$47W,L,gl$<|%Ŝ˖[ u% ;{ zd6h1K%# W ͜~a:=nFjL<)-/OW6};)Z'iL% wer-k y8nҪaOθ%ƯQ 1k"=^o!j>aAM>CjH zf!QN 8a '/tpNl%Bk \~xb7ۨNCs30YLjD- ݕB2qۨMoA]aF2E% qnѤm;ȅ\0x7Coh0Tuc#V.|U">l$"%1T]RW|{WuU1qcʞTVޗ@TR4wTUT7:0WE_u&|A 1,aR+pOֺ&S-j%,pu@~"fv]G83K%g9"R'4SU.8ҷNKSUiR@MD\XYdfR"3_[=~Un &cehY1$}.[* ?t-ڸs RwQ^RxΓ|?8}dwd7D7Yt|؛Wgbv 0Zd!MPil vsfz4=8RdxR >=]c%C7j JGΐ8W@10xM{c){+{*z>KOW۲pNˀ+ug$7RJ,;r&ݍfvTX3)ABž>΃7]Ӱ,XU6)iZ;2]VKY}mjǎ4ި5ڛL"nx3c?_!+~kmJ_τ晱0ƶ'Vw'[~6tLzCOWeD4ta.-%mʶ邢C/ UׂC X"U\Pê!FrO{,e-Y1b#J0u<#S c]{**BŘ])Cw`lb7YKS^:b/_cmUp+0Rt4yjRT ~@ړJBeP*'pU_GBg aQQZe?ij`eqak?y/nUr 6ѭBaKS%lٓp+rT &N59. 78%-"T;mQ2:~;&Ԏm>'ef m;Jk3M`1]Ƿ"K-bfG3(c~Q+{^ؿp(~>9Jk5 Ls`Om`%K`ꤏb0$iFM mT avOodWp<,Ph\^F'FpaPgg)B.2.}|,NnS[uI~buwGTNJ[#,a%n m¨z0ʃ.1 OȶQ>kgKn%yA, HFq]P7 m滂@ *4lcENѨO\-3=H`SOaG";3%( LÁey+WضUv;/'Ka!xjAxruʣ't$skpĂA/Z )ÓD@êKl!,"_;yb3 yӎ.%[Ǚ ,fLM"n15-TwLZgMڮ"حpB&'72>഼K?rcdOHjev_(13{HQ)ql$Sl"M?&?x{I;_v41t;LRWX'i2|Nᤥ]ɞxw9- Jf`sU &wѲzΥmâ{>B:ɕ^eI:xHˏDzVa*]nk\-K~ێ{JveePO:FheDq^(qwpD Y.TV IxF Y9S:6k$#VbΔʏSI:sm?"C/J*ŵ%&袇[ S:s/u%у\}'m$| VA`k5RЯuR#{qS$_F:L5'k3tUƩnBԾSHߟ!DXpttXtCn'/\=Xu? ʹ״+)ly3!qJ%N#5d|hXP"3*; L; aR_ĖQ)"T #f*NAbu7x4EEA!uͩz 6Č9͊Z@5O4n1Q}[b|NBcPŸBvcG3慂`0f!W~ҿ6I.;,R æmZ.c6BIqBXc< mc aW|\ʲ:FCN`C@#<|݅ǀ9;J ؕ$lyaiH6C/tO wvE-6l"zM#EfA4fsuJZp}䱚mf}9irP@ڞ`(I/̇[q lb9ݠc/M@`"3{l;oxu\ 8ltZ mm9/vv^!)6=Э?rq8#?$ң@(ulxC03rI/-Vـm8$梐e'VXl !gcW ,6`묻H%gVɹcȏ-%Er&q_+frGFa3ÿjaUA,GYoCє료a^ʑMƓ34aA*dqE"'t-w02Qm?&Y(‹K% JYv]KLtq@ lS_MQ q B'Ԣl;A՗bR Ǜ'^Bngy]R'@J|Z^BRf P)@9_mZt!<cX4p h9m>UF)fNj̫Hf%C@jD1#hFԽ!<$xG ж}'fnXTILbgzt&*/\#D7̉p1٥svL3L"L 8pHƈ{kݪ+Q(nO<&,[ttG(p )"=t;rRp~ txUhll"D-U e[PVb.`'z։|Zm?lCS%arABYF3RmKW_R#Uap,.@JN i47`sOg:B ~'qቹ</ʺ&s~YLZG]M+R׀ $^O$9VxتD m,Y F%Kfxd'aڄ8攩Ia.LD%N.Y9.d2V+tCq%vgPWZtyMOs~:qedXqu1z}x"\"B3Cпb8Ovut[A9d/4qhoXAH,9|D[ɛnmG]fxIEEENdXmF(*}9r;JwEx#hdONċH-@/l.Me-%7}lw,ER Lþa!ˏ(s]ؓB1|nk2{Bc3f^hLccka[1 ׈;)Tk_a)ȠRUcN+,jҐP:oH}MD6qsLUo첦AcZ(Z?B=#FT@li6ӏZ5lD%_S28RF`˜ұ#~f@.m>57V3L`ghoQf1c' ;0Q#:ۚ뎸u>pnINeisqī` Pw~e65hgjwuFYn. y"y (oT?Q\Uq=lK`qX{jTsT-Ή1Ps[(&F<%‘E" *.Az}"dgwL~{ eƭ1>S0agqQG@PF'M*Ŝrl$k#$x2`ER7)e&Z \]y"Vp>{{wCHwMm`KSzͺ0aJH$q덜ZUS50"yooīNHTL-R)MXQR@c^ O?d>-(p($Y/8*O+CvIt315{T1k'e#S9VNuZ).3!`M,We[}9ZmapS}'k0l`in=W/p^NoF.SYjS7`paHъy4v)L;2/UwM3RHZֹ:6 2 2MA(`4<e o Κ>i!}]X]pE<'.^>\TҺӁQcǗm vPbrpxy.͜dic͡!,;ˡd~wJba KiEK"3!  whqNiB |n7$Y-ڞ~{3My=NDUc iBKBLn/p|L{KGIw6; L7Ñn=6tb!yN1^Fvxe5UO\ڄ.4sFFR_+4’#^ޏ*G-Q<XdNcCI =rԥ$ 'w]u}^ze/sP;ΤCDe <ჭN mxWU.i,W$E +fC\LeX.N.Go=KCxO:<: :q\rE7_MVjUTnT?]kuvllzE-eɠ׉/` O@;_7 ?UT 1|el~1a]g~6j|x},d$Mc,.JNROw 6?_xݮRDNf.M_ҕM&|EѪ)/;{,a= Py,Z= XPҩZ^"3 %.h^dH)|Հ3,yƵʠwĞ}>D>`x؇;}l7;QdQb>y٠enrЦPrJ`L WL0p|Gc*NߓU-!D``E)be ڨI 2tG_#)-xv7+8d$ej~%Apjd=a~jh HfЦ+R݌y7_?76ViEpvreSϸ#bM j\,~%}kiX=k|V E| woLߞ\u4zy #$9A0O]T&5m)7_ 铄rT7dhozA8)E@C8Wv.;J2*4#q{OHIw4L@* eSj.IoqNB"s44!5;'`5|p/Ђ2w& স`7BEoK" ;SQ֯.ke(z L$JUBbX/A{:#E BQ+t}8=D/Iqfz–gM/k dIO>.zfICKb7T+ ,F!0Xk[jd TE$Z8'pجv  JlE⸅ w簍(VN#ɤ /}6ۼpɞr! !0Ō1]+J2i%7yx܉nYiH2+j%n>>LȺE)@o^t?u ~oy^v4cj t{D]5eg$.F42 Z$2ف7>@!D}X:kPʞD*3Ț=x\݄V_5@ >"t#8q) 6=˅opqVBwπ[^ WGkgJdy&Mx9FZF;{Ye7r㒜de27_!vrg,'me6N=:=^Oy6ϥ!V*s E2WUwjJhC|lIW"LSR,mtA5-un[LbmOs6S$UIK)j ^do nlnXZzQ<9]>uAoNM ^'wE9A4*_k/,[}3I G~gB@N+$WwFɘSئ^X]EEܺB"i"Lp4M_݆l/B,ǘ`z"jjiʦhHFrQob75/>f FN&Yst J)6>˝_b ͥFBd'*K]ZMWmL+}/f/̊Ufso ^~3:4јo#ǒt ΂%&F@_GہH[҅gk?׮YȨNqe(nR:B";Iɫ"ө'^X.2i`O7_k}ls~ $-rm^65ˇИq15̌;sbұ[*?7So2IƖ^ yю0V^fk0euc<#S4L v03WJ|_=5wKtCvceopK\w,W=N|D]7E'huJb?A&?!q@gc?F_͉?QZ捸^$cwAf׳+ɿsct#۲,Fg"9i@,_.& ʹΔ:!.C*:xmD}D[jh y6@ s{(P+.l{eJax57*u]& =smezƋ@} LHM45tP#@)@Xw14rLMgPs jVƵX%BBI7/FB`.&!m(Oy3{ 9׃ ׻zFPq"zreN?mq+th&4{ᵽ9d9^pBeԠrWk{_B]Kރ"k|=3`X; wx^07C t2Ahn1f&pWY W'#;daX4u c7qfQ|˒ QstkJ!؊\ZE[!r-Z#Ղ jVs/zf_ jzаp 2rt бqQh~рbт10rS,obssRn\'ꮀmךB( 2kn<̗=HcD*fPb4 h|.rJ u+vϔN!Mn[gspF{rŸ^9j>;,mRUNq3SIn4PL W}U`*pI:RZUtaG11|NXy̿6%M&(OَiW5mXNw[F~R;bin-`Ҋ%3$%9X Ϊvbu bjűT=h;uz+yI&NR 4k.L0ɮ[^?W(`pt8!8ӏ^;=S&$ee0?|ާ9%7)@6J72ƙ~~Kػb<[lGf ބ Amq6#d Zj+6lS!x` $FMZe3""ҢYhR T64S7D-P1we װ*x:z-I7$Xf%s:W%ms54BZJYNQmPe <G Yç'uF 2+2YAW"͐tGI) 0}!l=s՞Y ò]gY,2"Qr<;yIa?RДI|>;\+;>;ȻuV4F@̎-괱Y1HTJXRgwWP%Lsh|gh:%obP&TOZ*fK7oj-5FMPD7ƑWVO#_W̅qnW˴EئJeĕčo낒ҵ,?k?+rШxt~N[dtٜ؊.9DPC(hd[~ěU+g-٣[2|羪nKDjRRK4栔|qt_<(8\eFTvCᏛֽ~FFzgzv3Vk4L;~ռg=ڭ~FˠDZ)`? qfk*ƕ,(r=v~s ŬbKUQvGA{/F.i͙67[j]oi_?Ӛ[;RΏ M˨p(D =)u a0Ad4ݼXErb`$^ .;)"F9 @g5<a⠿/ShoS[w f:AN g1[lQYԃϻr+Im#%ݢhzm._43c slu/ڻ=}Ǧ5g*]i†-s(d uϭ'B9dy<@C>lrK@a/B)am*dyv/Bf8PHtjG'Ć—P_zJ$b)pɔV@P@ ^ }c gMc&{few};'mI#8- ]w3ӮF |](Za>.:hP4̕s6vh8u;'9*]>9DwfE5%${n|fdIcc^1m<{lX9H[ZxFb| sp@ImK$GK* [jxn\ .cEV$G   KgQ9Ƽݳd[sjAek"캯 7A &0tV(t [$>jpk%L =W&|iF$$eA4NS#yi;6`̳ %k nSM̤!S֋f:g1Q¿IU1DiϏilS1kRcڮpγX)QryY@^ItIdk"G-_H|Pj9/uT6,"!T&ӿx(ey~mh CZCÔpX1?no)mdAM6~4U.x!%W*^`(EWp?%%6кkiymg&4n@Q]FLHFI>⏧|mҿ J\$Ao,R):; hf6kMAQnY9^ H6d)/"91 EܴMT|QF1Qnқ Gz)ӕzϳ#TW۳x{N|EB̵;fi+*meIbNpu>Q!JHY5ھT3KȪՖPppz2PI}͑F#đXjv/DpйH(NN ES}Kp@4׉sCX8[0Q ¬tT(FuzƼr8I! ozHx8Ļ"cE<Nk.UTbJ|ɮ7WL-D%in>Z;tkȜ35΋ o(]sZlȋ.p:KW/e/ŕA-^~ Ni5g*TɭyAI >WEVۛ.AMA d"xx[s- 9̎>VAなY |5+o)3?n8>sKw߃{UL k|ˮ }D <S9QJ_2?靏n$?'i+aڍqf-j?\PgjF;. ,.NwPԳmF &О֨1]?{9;"dx5V309f_EqZ܎+ |DB־} W~,yq7XeXoW) gH(.gK/ɃH[UP' R ^:;nJ]#H3"4~<]ڤ"hF [2 >Vf,#2fVM3Pv;-PԂS7^"7{ !ԉ&ٜ x7.b9(ryU`WOϚLiZ 覷aAF GwG'#E=>}3|KhcFԹ8 =¬:Ç%]gd"ծ[J+e7XI@/ μGT\y+bv_=R\ `4-`h LfNhy4˙D `  xkUGz2aߨV*)Ԕ) &^ѫoVd{RF! DW5Ŗ;7GQk O+}]sW>7nYcsIJJ6yiIÆ:-{l惰\6%?:?FUX!3}LQذ*lZj\N ēԯ?h.m5h7Ub'I̎lc?5T27`N$F MbScؙ#ʵ['SbwHSLVu'}w k3ǜ%͚|Aiǐ!ԓ˕\f+'"Dav>ϒȂB.RܷZ`W팋|Ch3 ],K,cv=L!"j.t1g>beM=0@v[ѶѲt4Ԁf2@=̿\5<#:H.#tȰVccf뼋p1lņeD#.!XkNtk,XKGH<I:/ᴭ䖌Fæ(LOͨ%s"iz̲ޏ⯑P{@\vyDk {g4gdJQX,5|.+ XUExꆂw#tU@x6Cl^>\YnW]$RoY*nybW-MWu ] aKgAQV1E Uڗ yA(+HlW5>kE x~R96$V+VAc`a$!`sLdsebiUⴧUc+R8i{߫o1]7by\|J'b$E&PD3r% g_`'>; ɸBKt?8Xmfg&`.Q|9ɰ4 @&H|rxr[@Cbvhݲ6uаŕ^/S#zG]/^⓫q AQLd`1R"౤8#pyN{}GABM0 I`ԩ%o% ,ZxhDِ˵T.x"ud a)F7C[W_bDg %j*iJL3Y&Zi9(e+A,$L~ nzk)D ٶ@&:a!՜܉TkË쏇 󎇏,].W f4[G"c ^rP*gQ5&dMpC4ͽ@ZarxFџH i 6V 楉7E\S?"NDd(_c=m?:d$ww;h@ Cv-E_'^@tIFc ˷|2;m4h.Kĺa "lRQΑauyiD\`%q 6 P~GXB!+u/:1tWVS:AX8f?Opb`& k>&4cM-d".zs/}LW(|3V| '; O@C~.^wZAFHл|dyKj?zNu9tSdɮJT!)_R ,( BA'vLJ& P_s#y7Y.g!d5 CW`;#B44,*:&\$vk!Ϊ2%dx:DOBa$p#A_V\羏I0E(I-1a@ZZ>=JgՄG*D0J0OM]VeE#J0 %S҅b#XtxɩP#T!dh%p&AƆc `Yg e؅T_!H$HHe?IwՄK  X$WF–B2O>/M)NjUܼfmd7XEYV/fHj~v6Ѽ664ǐ0FG~J zPơ-GQ)UPQDsWMaz.&O2zvOCv\-[ vC g.FCʶ1Ü|@wٝ] &fnZ¸Ȏ=V @Q~A UǺ|J-9\ K{)w|=) )t,)&Ե]"|#ް>_;Efpzyr2ٝ͆zsbFA ;V͡Pΐr)Qֵ_T)ˋq.0ʨb6a{O4}XB 7󄒂Jz7% PXhЈ]fKψq 8`Q~{P,Yi b%P]xߊeN][.=Mԗw< E}M+0G#P5H}_QjZK2z\-3NKt7Z)z 9>ǡ]+{|& *l5B~ƕe9&܁DԺX5D8cHvnJxvk BE3<.t̃i)Y${B ;}LnvUwM?G`9|?a]Xа"J<N `)iQ HRƹy?G9p*k+Z~DNC(mz` 8(+8jT)] I[xgוv܇*ONbXfZ87S ځ@Bi71^L V=}#\PEom30ǰ%8-."{4XS[jP#(/s#Vqk+6۸ <~CN,K1+o0EH+ՔD,kWtpN+ww6TmQ|;c ÓJ..w\"f!bpV착@Xk1;(;3LY_U')&VJm[uXEIw_c Rw߷L[C)|3z4b˻vbX 5?+e+jf[/UI&)#H7 \>@P$N Sm#"Hp "1lu05 ƘF:mG !m`#xC'Cj#yK)^p`"vBdAF;B8sa#? (՜^9wB5Az֞&U<߯ʯ7"F.-ghqWIM 3itj?ed#s#)s k~ o}:˖hP n}Zl(F1yKʷ=*P_fD|B>o6&+»S. Jٔ1BHI%w!eCclJJY)ΞX҉]GB,͛h K$K&݆k@c x 0xdw~7e7|Y1avrȸ 2JR|%MVhK}5TGz7Q+3-&Z0kgAJ\'Z{e"]N%ozGe&sRIFF`ޏjҢp}DZ9,&%]orh?({OɸbAf1fVʢMrFxz{KMW77Iߍ+r}!ɲ6&m>O {o B8Ϡ62L"9ɅΎf-*8aVsoezTd̲Ӫч9eMjW1.< qo2Wu>xhby0oiq OAn_jg F9,Z6M2K}mClbRTh:YS %oWWOFRf-!xu̮4!<5/ceP.х3 ּ Q.mEI A]r9q2䏞T=|3%Dz!)Q_OpƬ>N72칆a“H4UN1Ƥ[o иLx%Gr9^Αk=]uOwh< ǝ/ČMZ#h.oӭ2FI``Kw0~VF^ZCa As,a.vxU]`cs=6m(ٗ|\gej֬UM$~\bp^Yڲʢfۃj cו NdrYzTc4^ZqZL΁&s8SVsC+^-S_TL9,ƒhI<@)r&Y~Msكnf?jHIӵ]V"(:-il@#!eGCelre~,ZHt#S+D8._ @W,fHbeG/Hh K-%*2ޗw 5d/\\& e~e4d((P4yrӴs$L dqxZ:x7ݹ_ .֥yoaq@O[R;!'augtKۓ=g@OS0gdž&?MQiheYFdKeN#IgQ/ċ8n{:G+hW%߆[qa7Ԡ`J]vz#oA+fl匑d.4s_yrv!Rxmuh̊o#>0N;=oGk93`!ir54U_SX _L;-z/o:}'QPxt Ʒ3% n@-0P̥ `P-e\l2#nYFB- @ h2nyo hP:GbК1eHI+4}d*Z!s۽J%k;հV Qͣ~*PϗRo+D.`MFH9Χ pO\nf/pKeoM$B8uF+tH mtwbJ~^|'/77S6Iō ՝g/G(m!a bh}iSPA4(_qYX+ÕI\"Crpkw(ˇx{pB?CĦ smz b5yO0T&-Gt뎲U9&ZRQPb;x7#5o0o0 Fz} ,\ǟ*dE 5+Xz;+ѫQS$9Y~<%UVQ 4eIG[XOW1 fvjYd[^n#l@prY RN-մDx> NtSA&5*O83z)5' ab3@-/̔!)z>fKQ 1T-t'%hp^1BaFbCJD\? edGYlb 6K22Ҫ@@vuXOgG a;f^\ ēF=sk*y' ־sKީ`d.iOeVF>kVi&@Nlkj?->94;ʺ9 NWB\pwg3\5c>]o+~9KuG%:B"soΆNT&G)?GY/FVC';YH6%/:KZ#YOD>-w[xcZj >CjR4YH amZDıR3]U$s)#[9`T{.DB4s⭏m!n6{wSV+iZ=>WtFB& f<]]UӁy{ cO·L3}'w|ȓW ʂnMc)@S;]O;{.r;!`n{)Imޘ:U|)rw:X~A|p f/ a m$L9I"!ɸQlD<Ѫ=`kKj!k:Nʘa$aU%8E\p!$p'\@s d\JLc޳N It3Ԧ)1-zP&w?s[=aB_vmtd--oL)|'ג a%;MQ;GP(x* 1-d<7uo.gyQ:a +8StPT"8ed*mNhׇ5;%XIQ2iXÙ;sePDqtʩ\'`X͐p *}VFr z2oѢ#[};mņ[PhƜT?7h;E&7,ͦr|jKn_nLA6q~Kؿ&\ "7G%W|4MC=9rPgA8|7-%ȔY_ YGpzY 3)6ɰx$U 7l@[[R0 #FXp8 +.BEVӦj;;+Ӹ]k~lf!C6r'I6&8G"ŨR=P䉯udza<9K׽Y߇~!JVAX&FgZ(.,HO/eE,k6-?P=v;k>&C&.wEF8(mt"f&{cx'?Ѕ#6QZ*")f).zޙ(F \!d9l"JXs~YC8n5@!x OZi8.oK3oMS1nGT_Y:xvJ59laT[n\U,MEFYSgM":mQf>.Hz,y`l`Hl1XYrqu `cgtn^ѕ(x:ڻY0A|.(Ю[PZ^7 W`] ]XOf^-MAW媬b*K8:*L׬\$9KS 15ԸI/ :jnvp$r,=K΁{eOR6O hNȼ5 iSv)F%9U}FuZD c^abQ\;\=>WfR/j\O(|ʾ|r“l,ӵ'GҝfSBǯy2O譲GG̵Đ *f alj Kn&w BXQd\|FFt$ۯ~=3~ Am&ϛ$SZl0^ƬSC-:};d!ocST sFiey 1}XDlvՒ ,]2ˆi4bsnL6tCG$AݢOu4.7Yv¸jj~1~PSgtc 믺Xpެ+-=š(`Zlը͛Ie-Ϋm/)3:V']έ+/jϝ:.8h 42-FJɝZ"tʃ[Lw!Ii iNu=~nQ|`4qjk jR%~Ѳ!eMX_ Hpw Iw>!v녭qN_9LW?fJ @Յ˾Mj_Fm;+ޘpB(+K~s$+ĶlhL*e~A>@|lTAdCztR.-[2= 70MpNN5[}&>) e653ӭ򦁫(.]+7V*LZW>=x Z"|"dsj%jּF52YUW6a :#ե@g2mA*]93ʏSb8ȠxX|4mI>;D翽brSKk*佫sPt(Oz l#oѺ/T({< lH|rF@ k6//v WBo /쌁?{:3u*"4Eƶ g "`RP,d"$c4DaC6~OsKR9o>y&\05e?Ae]}-pϊZ 88Fm$?>fI xj1-1Bq] ~ng߄X8jяT2cE \ub"7bM7qnh(RsW@[V/͕:uiZ:Y'Ѿ O߉mmd#wg=V0%e0*9p1nk2GKgqAC2Nb)0q0d^fV^@^c89jհ+ _ГpcHW"ƈkE(]'ƟogDyYu3;>{ vl,E  %\JÃCíjс'n|FaVBԭ!dKVPĝF}ք<=VG`mjH}nk:Q[Dd ~ܱ!tXjp/ QkOư`WׂeAd>eߚf`L+w#p(ac`?>T1W!=̲7:;1@kbsvY̳P~WBE8nmb]gf,#h5A'8mڨ,>ZXgJG }Q8$,U[~91xqʻB$Ieh[)^ә84M Ϥƹmȑqhsdؘ`|Jp3Bϕq>,ydqYUahՂ6I䃀E} [+G>1؊Fsġpz> o#u}xiإŧ @Oi!]=GJYͦagSkC\_ Z6<__w.]W?4Vk`o/E4 XD$|n0ض r5rM~iSyrۚQG_l^ӞX4\ NJ ,̷< _8W5&Yέ$ZIR r?4< 1Dt]bd&"- +(* ?Azh%75⦬BO~E㇛hDckFԵ&'_wnP_۱Y>Y)! ~[/Pz&VE0?kov|+*o=֍=PUы1yGīi_}3;]^KXXɅUܼ&|\ 3gpa^nOpZb[̣ x»9gd>{]Lv@sdP7St͛Q6WAZ#+kkZRp'btE;ٵH3\P  UA`F|{^8ENB+trA y-Z]b8DZme,`/CV#ud,^+Y$w0%s7 #os\77j&d':I}P -V6QV-ct/*b)hrk*EÃPv^~ M`JIq̀ĺ(_%€ M38ѵHH }aJO\)4(>RG|\-Sy!IuB|cRڍ耩wԕ;釫{ 6"{'|1 i.ˆ'T+YF9q!Ҧcv:Π#-r :-T"<@"+{9A[bwk)Y19:j*ٱ{/~s^ M=y]6OXkxRS@t/>|qh N{[ {qՌLjH HHxJ4{%N׃h΃+f/@GZSw?\2+t#IEɋk l9>Ţ{ypjqkE|?3C<u (ԥ:TV֍h0,hž&_Eb)aQ#3Iܓ1_Ey n(Ts&T+,<&.}j3WKQ'ˠ`: {J]&zjͤ"!ę#ζ 1$T˥{p1a>;!x'(%lD<){);2<Y^wǵKfR#Lf>'׫ 8ĬZ1ϫAϕ䡞Z|[5m+嚚`?zCCcEq[ }l9?8{@̐[ӣ#61RiȒCЬWubCYw"ytUޘ_I>,89Z}["NQPzGB;k湈SUl|&u\~B߫XDK1c!TUc'ρəgwN) h_ۧ>2_$_ƨ>0Mt~bo9T 2ӎB?Ҷ 9|!DR' JCk eG: { znNM ɖ)\S`6m9RK;XM&6bt Lv\uڣ,SƦ]2qPRËM?NeJU^bumY}T'5I=sB+UC#ϧT K7'3TKu0+KDE$_o1ihy1aA'JSC)̥A蛝+Xw׷Ɣ)7lqݏY kkoؿ{ZoYx]I7Q1 vfy/f wv1 p^AP.I(- 7}L$SGRh+E-fJuKSܐj|T7.I"ZkLh L uހ[Zu*)=Lw SFzJN&O9 ;ZAEŅI*⽂y؜j}WŔBPD _Mh[D52y$l3K&Ŀa 0jmX ' 7?`A7dH< 51Ya]_a |\ V׮U;j?喾FPuD犪۵ =}LcƅmBσ[0w4Zw\w`[ajuozޟ`L4Gţ<747;vx(ٞL*`S;6wŶg'őKaBJܺ{K'R"_l_9cjCK;=NpJ|#lz3g ̵ sWYiH4\Q!O\v;JRF$ (myx^&|Pb˰ԕ&5D:>(%?nj!%`?:+\#ﴣuR^o% `[@yK&x 8yGzFp MOgf|A5 jHV6,WLI_(AuCmr)aU48h ƺp*q$)&5p(RE?Fcqų2{Π_1v`iD-Ns1iKĶ}p9lQj)9_s+f1B|Ԫ 02x iE=̂?H-LR\..JOA}~$,[cj4N,#ſlH<@&~e drESX6USRQmvu[e{Zgꡊ"'|dВ-nᲟ5Կmk6!@inܪ1QĖp/-Agi1Jl2#$B',KEs%.cˈ/5aϡ\$$jwx8{5pr2?j"zKk.Fn^gqfnuNwhԗO&Fj 'xI'}Z8ZOolrR3 *R̰ C 7ND .޸P RzmR[=|=劚ȱy"j`B޼.ܩ[׹?7$Ć *ϑt,*hNٹ?k,a`-\K|5,$? ЋXJW’Bt}7 $YT6M9w(d' f cf-~s?k:#Q_֩#FOSB`#1޽CwoTms(ěx[Ԯ[p8 PK;:a|l%W# }p sJyzٜ?TA/6ɽ{/diN*%D4?%[,F |uOmϚ/;nu`#<(N*x!4 '$M WewB$o1+_d׉ϨJ=Djy\ C>1nj}e af|7}qgLmPc (ķ$a`.Pϩ|Gmiylmgwt J[ŭ v⛋Mh9-9wKrh+=QQ^*lV|%M^37.EBBw3ܯ?݉T\+uVʇ } " *ۆBm`bJ>Ϟ d,+vj_j" Ċud<Ѧ(! }? {xzo\옷f] R|gFρ3ml뫮be֤j f<KڷӰjHsVJ*,$fy w&/$ïzK=Ibt^0H$;S3BT?ѱ;IyސDD `ZS(RfՕy~`a)tRBpՄ8@d :%t`%9-ʥ]Ce"F O5cuTbroϛg_)O,2|=J@ !Ff]9pgɠE$Pԏ̕C\EP-hΔƔh^ jTo0y ݣ GBJ?( } '&ۻ-J@AQsS>6$Ug6T>f!K/W$S}7u3SZڽ"9Tƫ79;4ݤe(̐!|HCxŽCS\! ?Ͽ;mˍk7UafCi%eB#Ղ5+U5;v'kM!pWR#J,{o7wsnL[q߮L ;`Zo,嬂Q,حNnUzMPI:i'܅@ ;UT/ )Djq3,ٓʴS6oz{+Nt"`J-lIʨ ?np}pT}5> MVw:ۺܕ )u!((H4Ĩp<T[dhbg,3# r:]ӟK/AX%xdf'p䯠|i-3 g?/}+N/6:輖fB)0ӫgw8JEcuxk]RgC$]g2[֠"=f`<\ǨYP?\$.;Uv8Ry6U;q6Y$( ʵQjIVf0 C}_Tu{| {IQs' l|!*w .ߺfō5 Mg{I,$|S~caeѻ"m;(,8TNqjfXu)PaYB i@93veИl+Rըܚq? աZAї&õOp9c{ U oP`^H=H lwLv /΍ ow PKeC8jd鱶 !f.7%*%AI@{Q=NdV*ɟm&1+rpw̋|*t)x-=Gt(uDR0ΚŐ6}FefoܖZƚy '*cMTEre0 w5UK :+d@KU*i$ȼʥ\!MQ#U.q+!I\.h.~$: IbET>}@HCT-,UM֏A8xo?X03U x^BL;ti ^kk"a5Q.ȅ3QU wgu؎޷`hx7}Νv$B5 .tRQñ@@ sgaЛb(-`ѻy^6 vp-*E.;u9[Ymy4 C}iTiR5B9Pw B9}—ٝ/2+ΏLτ Bp"I?|otjYsG ]^8yMLux\ތ2lٝO ˄{5{QdbvrUNO  ET.Kü&*iK]5Vm]55P!N|I)RoXfCk) FAcvܬ`=!{1nMdA2D]Ux*?& 54:4$9?zjG DD.1adump17Ќwu>k)\EsojH" =,yݝMb@&Ŷgpzu A~92V0gۏ=A\bx0-̡1cGlEׯS3?ޏQ+-b03A.xIS=Po)Ԉ7;\5PlǪ5!1'=@#v>4"Z[q!Pfܨ 0Ih#D/ĊcU  {[ {ĕo'{v6//5PlM_3~#!RYqnƆ'FYnc&hQƱR/b/垃_'ro?;F*_L6S C9\J wAOX~{i)+ofKiskxqQip^ /zukՕ֟:ơ\ț!wN}kvA4ި޳9!(_X,Xb n ݕI;T΃,!Gm:GT:d-K }SϾ&=WKo!rJ~O!S;ţk5>j  [^l⥣ uЫ(e<:bf0kzP8x"Q8nx!(9v^0'-(':1&۔ftr6SÌ4B^fx U ڦ- QۜR>:=[[52NzIGPZ+Z* HKX1CdUPtÚ&1+m]p>L<ӪECVp$r $~_W6z(,qO Cs" P#m\zaf/[5'{Ǟ Ө჏'zh)0|S"ޅ#qǐNj ><]+ 9dE"G-c ЬRr[ucZYtGBdZ#qGq>ն3 1 kUxf'B! e}ևnfƿ2^z:<1HEzD&=E`U/`Lfn1!Y>jѷ5ZjQ ){ZymkT"н(f68_ ה"EIOWÖ-? u&,{ټBh4G_,ŝ˽VT{ RC>@GBV&f˝=T]i﮸-_W=Dӳ9:u-YӏǷf@qR ei7Dˈ1JS^4J,%Ί@n̤LU[ RUaa\64ϑQ#$K\KT͇٤saoF Ee2 la‹gz(NRq(;jE7;un B(' 0!Y@h+h:Īr9ԱΨd~WBzjfl5\Eany8p[f\]TemT^Y]j|O)KVV o0u<+Hj`/iT_'US*BzQA?)Qquq}NZ d- PٚR^)}'l@;]xӣ?>߇s0I9#dL<1oUMFP\~?At (ll?wFL8^Q(iBf7V0,&zV w(s+*\04{#,{EM}S0.Mp2X#[%(F]j$pFÊIHc,,=+4Xb(ABaAmolI]Aǩ0vyIp>PGوМ.WN;i[ЙR k۸1)YiQ́[;Sj}gk"àn3{[Ӆ/c{2V8O`]2I2ojE /S@7ǑUy:F- jBAHec"w4÷ LVu~Fq槔 H,5alȋ+!.ؠv~GJ)IO` $8B7)!֛WHX ^9{7+* b5AWmFC(jY$-z&]T 8 f<IY颬HXQ2 ƠuAes5NϞ vj3tՅyYJAF:qڇ1⇦K&щz1I<(GWN<75{װf Ϋ ./R|vmcj^ )hOG&d`J$H+i,G,9,LjSwy)|m bg|C56g^էnLLDhVn EmO]h~Q WEԟT䙞'юs/?ڋAfu!7'Z Jv4U&<ҍ g/ D&&%^ `95ũآp'0д m{dceY9ڧ޲2k;ր_?EChVB %2KT?ˮ <ث>Ɵ|y1AmL%4=o)k5R<ծ+miy=Pcґů?S65_*U04frA)3oOg=R-gYUsj}帎(ǖՖ 0I۶͊WCF V+SͿx{գ2[K]_qRSxAr2x~:E׵Cz1s< '^nmP 靇. VaW g]ks3f]:0{1bo<^f?c^EFEjggI( s"t6k.w`=u |1Ԕd f贸 HGX8T|TG|PsUkCK%Owq0W7#;{8*_Gw/(Tv--\<ɤLp =u# onUg|Ns0%9niI؋M*o&/_BZdv/zfc$3[l_`QTR%WÛTCu iЀ͊ leXZ$9(>F>.\i[n¼_uVU×KN9J 7 rة@gJ!pmgFfNw0"ݞ;i! hlg۠"ىEAI|Z.^0.R=EJCE,$,/YgcəɁD9!6ڢJwm'llSLJ6̄.Vl`iA*RZ!M A1GSGs8[?!/B0x5V%K{'ꠅ^e hDr`b$Dij3voi!7S>`E_Ϙ)[-sh J^k7p@R~T4\Q5֚O-ߚcAIPس|aGRK[@ scu0ZtoY5V1^Ж4"`5c5-ݐܠs/ٻhC>8C2ؾ3LB# |E N6/+^sL8j+bBwlMltx6:ccgۤC 9~A!r~ufF[VA˃<.߱18V Xns+q,z<- _ يKYzi?$CVA@Y`ps:u&I XbTg29C ?B⁧QOFI_[%dp$?U|n?ew>;YVLN#Tu v]|!%$4ؖdngisϽ=LcQ4~m>Q/WEgHި *-_챍Ov$T!0@ͧ-˜eH[װkL: ,m!-Cg\.3U%=k/I$8W1UQ;_!%B+Uagv)f9 4u&c Gv*0k|$iaX~ Uұ}]JXܸ9LCIO>y$}!P2fpl{+i^+ȨP,;!MWLL^Vj"2"wk;pb@-OEDke2e@nO~A8JYGQM-X}QrrtF..ޕ7JCsAiز0C?bg>ӚatlCIhs3J#I>KZkV|n\7Xu#K`|:Dy@ LXjw%5nQ|GǸ*vLGR,gvTŸX1MĂo&xϢI7^Nסc-#0]x'rRg_JPbE'F}un] JgmeC"y a/c_iѫd 3/U3(B#Wj. '^3Mݿ9륷 DR8\Kuc1:ТPϕ(`;xCrQcq鎕HUY/&G^\4QaSgA 'P 2NNwz̡"}b76;ahӦ2iq0Gd) f *>7)UD}B%n_wC۶\:&`>" &4",Ɏ$Y,bNt g!dш)(|3b"1!n: Wab;a&kqZUyUi;ha<]O0^Se5p1zRkؐ X-W?;<:yG&K}q5@_œi[޵$@uBeX *=Z+.]Kw_JcTHi#7EW/:k*8>lRIy uۃJpKAOv DkVfXJ(;J"kKrIqx|=An*>4퀕{i(U#)Lgy&zF>%J~|WwݩOs=|Ʈ{Ø`>ݞCrKr1zVk;RsDxWw*Z{# 0bZ} %v%wa&J,DCj39أrtŖ8ovݟՇЖ_V(%r\rJ[RS⽿)XV퉤Q|9/ nx^d\ŘPsx~Bhd;v<g:vg0GW$&֛3GĐ춿>P#5{MZR5s|iI}x ˺s?3@3YgV"b"t+@'yt6#iǦnV@jxj23Ј+-oxj׊UP ,&A]l4 Ǜ,(+ W5}M%;tu{UdF@ւ2E-KnS9?ztorsxrhaHK]tO5]Awn (eJT[ wX⬁N GzHkYɕ!o1~V T)M":/+f"& K58 K4$i[{ ajwiގC3Kj9#6x.q+^J3b^e/=7}ep J1NTMǗw>;=o"YAGo%r^B $:pk`CT^.6zqjv>uMGYA6!Wg*>38} k qCiK<ݮPbh GR@ojbipe:fR&Jsmȅ.i ~FHydrr<X款5:x(a@HcO$p*+ $ 7%O_}!{Z@blftd?xT̯{tSL:Zk)2Yn" i( -Q߻:|яVb-1uk*̋EK~axumy WV_=[E ۿsNWI.,#+ %vu`;Wo7  sBRHi_:sibԀ|7#$BlY#0'u8_o|/X:@7;pEn#ګHnInjLrA sz( yZ%{s*jD\Ffͷ́E]\Mʎ@f ~&oKk8̛\YY: |Czɮ7oGRi vkîiqN/I2;p@P^#t7q&z=B M 8DH4{%JsM&6Rq& HgN&s]1hk ;NOdYYr)-9)NCL<<s >НŤ](]CDl jsJ;}ETnbz #6>}DPUr/ʶ//X2 +RFTUދ0HdžzڼJjkN{2xwR!O baZrl6U cG,3&&XJ`ݨXs];D4ypZ_}dLp_.a {!ZrPѲ5A ;mPKr8mGhR(Ix1E,TsTiHM ſq4{}2T%a$nmR狍ؖRV(s-z9 -Ao9#JPi_k,)lU5 ׭i{( xSM~FUw(jpTZG`k-nkeeׅ/oŭuQk-w&lFGv ~d741ʟ U6{RF2P,\o-Sh+V{޺#F:V#3#o5({h:UPr,OoU;#T$ֵ82Y%Ե)@w]-y.5^@ ۆA)#[>*t_J*F. rxm34x.rX!̴Rg}_]R/w˚ɯ3xo-Q|%5w 'Vi|*wm9b.oQK,}.RȜnshG:"ݪwE 03}%:ײ ^GH0׶5ƂaEݕ)ѡhփx]'ލ‚ˉƒ|`~ƷK-C(~kc$X/^8q@cȘe@ ɚз'`^Fti֧%_ĠwOכBh5Q1 DqN|g{9_jJOG#\"jB5 3y4MD9$+PV!|s%]8pj5I,}E^M*~,l\&L`w-HxH]͕v,hnc8i\''ћla[y{&kVe?Go*$~΍:j2yH˻]'Ǐ2'K_}>%{7pq¯&ˁ?(D_0M=p+n.1oG-c}}y(_T9W27,kԵ L*Wy*U˸ Щ/HBe2!dZ8*ydzI rENF&KlKTe*dޯtAVJu mĤ[$W1Rx΢^ 7]>ϲzp}z=(J=(񍵧iȸC)*̓?im3#/+fچ*> u#d9?upќssZd%><43WX$mC:IUI6ZɑIh3r_}6vP#= eƙU4Xg_z3@ojcpL&p} ,dą|!o^gs\nj-AX5SUuW}VQA&RZB#^CRwkcD.zirڟ5#Wڽ^O}LyGBV:mj}cX+a1o'Ceƽ9 gWJdTd}W?~2TK7q*,JF&"EUϻ!]wTkA~AVpJqyٓ(څl7I=``"2NV4D_` jH̞iLcez9>me:T~^ZPiējJ53 ~p7')|Cf i߸Q)oyh ugԌ (mHT4wky7H!9$i@wBXF8B`fQfi7=)Cyy sH1OQ6Ӓt ?ij`Dp &݆L/xp^%OVr&5[m ?]##k88r 2{~_X0\闤n /#+hnҢx%ˁxW)*X(7Cu:!7vTXRu`~,{/Gv8mhci!ÅO kDthQ:H"B[}$0oAC^?]~L1H fQ4lѐPMy؄|"SĮ^1G=jr6<xW6AГgjC :hnD!/OpƷыYttF BP]3O4 5it +>}~& ޳%TH.?o*x}ߛ/wiǶD&qk |O Yf]!>5!hs<~D mul?y$]-ѽF ;'~K$x/r홶V'M9Tm/hуkHo{S' "W+<R ™ܤ hղ 3)˕jwg+5l1JwJmJ%S/;B(D@ 3p)~0d jݑ&iI;\*氮z;6ڃ8ґfY6S%/wj1H\\['S}Yu@.|g%"%Sұ#gi1AtaRoMzc3W4 "]63!wA* ,L_n'6?v f , ;fr%GapQ֦]4][ǹSo+5"f:Ht'[abYmХE¨HL1tO3r ¢%Ou' LaMUL'\dm3[yn}Xg< Hk9usq1oטDA E㛹˰Y[VO3?C)WCRNmad}~,% ;D^fhF5 S@!tY-4)7U?G_Cl ؠRnyI7z!:(ըKAG:k|eŘ\:< kG\+کc ]~o<,?g?=7y~ 1Lg2=fK׵#ܷ<WBx[h&-Bb@s`}<;'09#h!tEv4cوm#asp=isNnjlWAd.Vɻf 1-a7yQA nNzR[.~纠H7HaX}cem2]T~'QO\Q*jK<$!!Gd|8ˢez"[[u`1uP{!"QsSTZ.+'[&i{ ȥ2Wcf#Ɣϸf?3|ZǼ-.b^熿U K{-DeqӍC ;8.-a:#vY4+Ci_v](JM3j< TUF;oIӻ^z5_B]| z,i$#bXͲ +Z)=P5kЊwWKSnT5wd<2FMo6#k(e+􌂣mKAT3j9zoZ5jcq;Ft2G@e4e?C? azYi@{UbYˤ%J~a\,S|B_z5:5W騌D *57lno%)QQזPq'G YrPh齣%2t FU${ 3vwZӘh^Lw?Цf6-Y;|am<-xи<.l`שK (jNۭĆ:]Ѿ?exc\MAᑩp1tPɩÂdirTf)( 7کlLiE4 zۧBCk"ri ر=1dg lT\:#pXmd#ԓHZnЈ=c$v*$c̘8؅b,NY(jM7Ojfae@旴k#*x.D`imq-N↷ΏirlU?Fcf0ۅ2pƀz"f~ulmM40tŋ)#PTyꀃ~TGst!a!>y38Bx\)7 =ԴtӼ6w6h %A=QXx6u:XMK0XWM7sv!w>7;r ~%X6("`FOY__ك]y>Iݢc+O!8_+kWJ<ȆKT\xPCȜqdSPρ'/Vʇ~m–Q/ҳ7dPz÷xu\fcf*aaK'YBow#0HKYDSGR'RT#vgU+Z+AS`ج@ͽZ1oM<=I"Ž<)yÓzЪET[ MJ $v984[6dqFIF2¹(^3c#E>c;MqV^Ǻgbr"W+X_ )0ˌi3A|h":%QZF3%fͪ(X i65XvH6Qȇ|8(tX{V &Ԕ_Υ*~.~Z^LyǏz̪]fثFr=/8~;Ww}L[Ky >= GPAI8eL;FJ(NO21kj~4'ZK._sS˽.h"?49F^4Ԛ7ZadAקP,~I*i1E5@Op[v{nE.a6 q l~[یun6#h7dtfXE]nkt#oZդ 7%<U&"|`Zo@sT=*A?`^>UPיa!  ɤIzZ{&۬{xvc(EF*eB)?T$5(г"q޳k+qˆ|<[;y]}m+^RZĖئk`V2}0#IpHgyhWCHn/dE ̆)`U٩<,e;LMNy~uw^wJ߅ƟwK"b@RU"N􁓏mTAJAQw9a'bcwQ{6ڝsoao!a{]TX{c^}f3W$r5w>: 琘 QQFWEv MFޣ h Ӭ.;t.xDc?{44ef;c.|?#,+(vݨT&F4'P>U&!]Z|W?og 1;j-O=Ξ}|FPD JyJBjZeKed)XNYdI%bc[wg13 aF.,;|AW]{Ge:uW=k.-_Yۉ.ܢRAN8 Fqe!Z hG;3's ѳOYJxs.j<fq%[ dJ"GI6mjniϯ/^{mAilnUO;t6 کNjG.s%ѷMq|bu?_yeRJ"#;Ѧc׊7 deXdm˷Yh6zQ/ j.$>fGG9=?hcYRn.mNc$e| ēb_I_idPIF%%5ȕkʆīOF1Niye<ʡh(bljй'^]x6IPf!_NB$bRd ‘\wd0f1BR;F:לn$+ zI>#+qxt{#_@+:>uZ_dI'6 (s̿ WR.z9N3*55fFVm5P=R ?Fىl,FG|으X{(!!!kekoo0k#GjM4jj8+`ޮVAV&.uW!%SH⦬L^V6sb! r ΑICܳ=xgU"xah,QTr@lq'"7nqay A)\e/5p ')SO(U4Q󑏙WIryOW)ZrJ\-`~ GMo4$i5~qjٚޑW7ktjO)˩L<2e2:)R7i䟹%e9iLͽ'OQew,6s01vԊ[ӿu#扮tu@q8(T5}s 3|te `>y*JR4\ ^J≉¾9qVєؒ?`ђZ|Osm]fh i0Mw v}!@Z8Aϡ.K]C6V,ts#5F;JeYVi IYq6,LRLۨM9c/9+\rʎ^A.T>pP@\aA[>t 4YP nzZӻk+Yg2 '!fzګY'=,q@;a&5DJ'丫1~~l nPZM&ϴ,U8LU+ock?q$+矇FNӏ a%&UvbQ1r=RW`qk(hk9A4ai)y\6h+2֬[ WПy?l᭮UᩞQԑL_|XrvT)3IbPQvӃor9sl1ָsy:)l;b*faL. Dߕ "B AS]%|ټic ڟtm7 $NF٢xAujxixRYD)K431yYזwݯ6yIs [O8xI^-cJEhA|BU|.Uthuo݅M7H}l~Wئ~.k0Ћ* `VeR9lKkxU5CC+A2 %ZH UOktBlp;T꠲~fZ\ a f2'_\Y:C}z?T,;> :'{FP]Y- NJ: { H{)nRQ5Ta!nBQ>kZT=NΖ,n-ݺa}e' Vد"SQgPŽHKft_54^zR2phϰD² ƉPȧ#} mBHSBA|yzvBRE2o>_wS` O_8MB6mGERjɐ+uYR)ل#)P0x^`Sg,F.>ADfYwC yobX}脥b{.O udato-Uvt] +#g?ÎK˔T.1~mұoo~}cXUuUHY) OEY$:` p$cTuق-:dGcA7O6,Gz)lDf^F+ۀir*xdy-]b UhunP5Fv&=/n5ݎJ\}m]eMZ1`ږ-eՍȔx*o*6\I9V;h0ўtjbc]LW.\0L]K4<`iKKMop@#~?@DR\t1fӪ_I EbQ1~`![&d*ou%ia!&92  .FU ?+:yEWUyAmeSZ~Р$zh4𕤌1I7!e{V$pYʀX*@icS1DD:]VI\bk Eš> Z9Tk~+0*7]E=Sp]M3j{it#:7E[`l?L UQaXCR2o/~Q3 AH-HLT *j̇>ax8OlW v$}$2-] ]A dD|D KiLB̦~VoR5&kem4c)~N@+B% D}ҁ5l-%:ӀOoj>7ի[T MyWwI^*Mk!7֤hc 1- rGyLx祴f:9-Gh .yˎ'L;3'qG#ʪثJU`Az͓mt]?ePnP;Emh -) ީciŋP'Nx;I'Bv (k;8+ʐw (^R"3Xz.b&[X4-`'A3O "2ni@NЧRDľM2ոյ>͹߻x"w ``5ZU?5om?"Xy;N~[;4L&ŎHQkKtվ)V6;'@AI68"aS EbXfZFEhP49?D6-[<4)Au)B߆-{ΜKxf3bd8q67L ]T5 vb&wtLךxi^&( 4Wn Q*B(9g ́bԷ-o}ٖ^DC {-_cӊ3za'Zb_;iboĹ`ރe5=9:cgt)/n'r<05BSJw:d~pQ-]W!(!o.Q$y1,lv?!3'i jy?3)U֌u/2&:xݗXZۙT@֋hb<@LƎN'3"4Г,b|<[@u'C> 58̟M"NMPs՗te1¤G|4a\@"]~OQ>ٿ2x㎉:.kg)#<7T&[[=iW8Z9S)yq`{>:f$t,$}y֯ՑEoB^89]"B||{/7Pe @/0% U&M1Ca3vaQNzM@*%.\U9yئhƾž0D-|ha_Q _ =>O=7ei&(y[156*17;Td:^Bw`l㡟7 v:-wFZCybIl, U[n8'Gљѩ|~^&㴂3pZͥ}l6Ult۽.֬n:y+fURxnYk'rER6 JCZ1U0( ֻEHe  Xk򁞿Eh! >lXELBֲ8ezX{UBrIU͓F~Ԍi\f-uqLTªzzH |&.s7dsDZxn':)8￸o58*k%<`چ!?^BŶ?%psR:w}c"8# tڟG(2 2_P17J0#vKY6,bP8UħBlpQс*Dؓ440Er3˛_j*EzPo%'!CԾUwjov.qzM-.m U;'Ȯ[ҭ`AYhה4Yq>5FyX,ʣO)dX0bgzVoTs,f}eW Z]r>]q C &;],U.3I/n)#2@H]SU% OX$LM9щ@ZY*s0c5q.n)8,T18^ʪ[.{&;Deu-5ʲ]؜AT_YtaXHt[uE+YJk{ '$ ;E;dwZBG<@hncBmczEdþ8K%XNѶ,9:*q-*Ii{ ޣAlf3櫢ѡ |,g rg}x#$)(r2 D =ȵ5 l8A>Ћt9:΁L!wr.pھQ0째P}S` g)`r.2 .%ry /sÕwN)oq>%ڂv{:6ismU@Q{ ;>Kzl9jʹ4q2$c,uMWH=W2tg54 R.O,UPԥd9zoCp'd`u5! 's9\ߢ0ԳA_]]tܯ\dwdN@ YT 3_wpjoOJykXypuodlpE[Q &ycEv˅L$'<#WD]4 3[yA%%Lcо?~ 㕘jC(@,]>}dl>Yujmţn9uY#F<2HN">:'P ~lXFp/:{ƒ+! ӱكaDZE u!).DGgr)A{uKZ=LhU.0_Ψ{&}}:JNOEn*!b}l\]AX]VzŘ骇R2Oob֑_,,FϿwj b "B]x|ɀ.,A&jZHx?' ӕb^Oѻŗ=;e~ZS= ;3< M,_6O+2 77). Bܤ_?, LyM,vYkPJmq;Uk#m<^40<*bY@+%Y' :{0Kpɿm照X b=FOp.nQrGm?"Y8P*G/ vMix+h&/wnDңQR/.FM}(_naԥafZ7%:uA<爏Mx) .&d]9ˤ&6 !GP? jF"flVe,qRDmGIʎأ$.n+(y|V[W> ?iedOLF#Wm˹5 u:uD3fNϪ.=^yu4 T1Բ,w;֓|M`~]_Wlw 0ĸ//pv _&vz<>֣گwfdxWYwq%2w^CɷNȩX`SZ v/E-.ּ|݀M/J7P zӷ~{<|36S5W~!ٱE|Ø͞1L*yvi}"طZ 7Ĥ!KxAFkAՑ->#cZevRTyTڔkZiF*B&bbl|~xfŒ$$rצ⑕f%H!ߏHL[:, v Fc$Tu ɾgy 6Ml -؝-@T-\ bVp `V ?ӦRqjx%`WFz gۀa)/{5D To? S?cs]Z(RSUs_ `6%E`.:feG<9$լ)%{XF_M`&fε "_AI a<#;@4xbHFPbr;q&SΛC ("(QEQ%%€g3 '֘ _Q4| Yڃ`nw{^ApA8 .SٕdcjS@xq{s^&ቬüصmYvQW9n^ .]cOᑁS1F't1$~p#=Q:6G jte0Wdөx<*˴#_  RaV'N+|#NQiV %jܔ.eU~nSwbGCT"_4)3׉~4: R|\vܹ/z<}1f;| Ա½B0Mq܎<hu ,(dB:Oʄ|=!xj>vaTUnXoF~T8pb_&8H7vw1} g $D l]3NUpp#os諸kwfZB87yϿ57E ~=$ڕ;e{r/tI}8(FhERn{T#L}RpIY}@C+ Tr]2CW<@ԠMFl$dCܖ\Öu8, lߑ "wo.cQHXwGvh7QLl% tȔIg0U #&Z/k0Oaׄ&%v*nf34GuET a,C&K~l ;O Rb;cB(:/'FDm\- b,<̳.,v g,L-eK&!WdrW9b{tSdItwxu)Hlr$Ex P Z3'm9G_ >u}mUU-k+*L`W$9rs3/h(ࢲ_u ){-Qܷ=C 4pDѲ] F[AT0ͤ,Jn ^ƴ9{N5Xp¦0 z?-u M.aO 'Q0j"\ɋTR6HIr}DrjOWqz.'q6ʗ`L8IK)"%}u0%**~sR̊lKdN!u2= Pѹ@j@W< \D eRWACXcuv8f~-yҟ ~H!T8WN4 &Dc!P 3ekb$,m"欳z+<d@Ce?r?^wވOI"c!+)qNH)>E3,%й&1/=P-E^_7`6b^rAL]*>@G}eIH *\KOİK|LG5D2!o \DQ6;$-38ވ}5ֆ. (.iYv&|aC?K,.d%2=|L`NCezkTݏwXB;Q 1 1@)qQiu9P8 vU"Ge-N-/U^(NɒoU9Ƽ2T2:_|'p2yIڻ&hp|gc/4֎ EtME2̄XR,QO_֑mߞ>lUz1R| }.G)=p'=ӏDZ&T[CP ۯ/ љWMr:VWF^JV;]PiFԀ"]hBkv/M8{S5$Hl[ ٛsy7&gSmx-v7ÚSG6SF%l/aw @wQF@*Ūd띐`Vddywŋ[֫ڰNJ^5MX̐߶YPvpj&As*'MN~EzB+qK Kؘ%C5n'3W'PJOCzO~x9w\m_-Б.}%6cE.?bkLۆ.j_THwSGӬN{s;6#Z4̱4e鼢g^.Y rO^|e"n ʓI#[lE4&fcJŒ$Қ`1}޶?bddv97*ƍ#04ɥSEW8߭[ˀuӘG{\T~|UjQ[(cҲkN%5!]!ٺNڋ0>lqĜ#a$QexV wmbqO&XaLPpj=5 t=T_qwԗ:u`cu*|ꓹİZotku{jKCJNポ)jpl?: i,SɄIB&bxaVBLp a!yg8Y7pYGr߶d(.{N7NTCc*mDBx"{W\T0PXgmvt1PQvW6Pc<~[ȟm0YuAF#CbIYՇ$61k,ZN8όF2H3P~{4o)F@s?8Vc1 snt҇kv=HvKe$_-13(ҟȂ}+"'DtBI\m`= ? k++U43Y+tAO-3HN_ZUjhLj(^5YG=ʷ @8 Dzb@7:P>&MS>֥1qdh`Ix~IPnhu,Ȩ)}IўU2>š& h,ON$ۭ]iͧ|˟"ڑԴ<\V2#ig/ߤ [by.>́*7AƆZ8+ZLy^864 1iR}H&@ }A6AޠDzJW:krW,M9lzRP)@$sp!tkF,E Doj%i*CCm;20%{ ⹴vs:bCeA8hqrz"*p XZš$P\sWJw78/[e ¿ѻ]S\+5L#HЉ Ӳ<(h&#yt֍2R;?8FE>lkEMx0m5#=6+5Wu$h(O7t~T.G6 zE5Яw8K_ wqY70Mԡ]`8.֑XXMI}K%{~5ZjxTh N~`iE3t P. SFY$6/kPj=>'U#@>so/]*a%2q'VP&L @J+QՂt-01Ip傹^\ IgNh gi~PU;!-ȑby' =!Y8UPl Ox n-_cHm}4QGA}wF\566ź܀D/"2p,=h'o6)j)fnLM@aG)-AʅPA@=Lp(b\I\hvyxڇ̢[S/0_Tw5 !m}u(!PJA&K=l= *RԳDFp.],6 u1g%A㊜5 }-\ $w'FfIXK%Ӫ*#rdqS>N봀ެDocj]oڐU/ 7 pn:Q%Pǧ Qz1xӐQ:LOiwXO2SeRPhwx zk[*!K.~vi2Na͙~AքtZEDww|smB{*@MxH}b }4aUՄk+ٵ%CZ" ,JDĦ@`7W&JÐ]{b%c8/|{+rA @azVb/*'&+TNOE62s%@`p9^J?}O{Yn;K\.Ԍ -:hDž^[4 QLjJ+4| PI =. ;mf-޹ QKZWS$^ ][c$Gyaݡܜ CE.C\8%վa+Y:6K4t,10َSFzLըt|s|! =fUb3#iD\=ȡi!b?}@3i vƄi+pHOtbEyҼ;nlZpXx཭$= P]"a\m<}қd_[M t2'o˷AJ y+ܲT9w_aNr}֤e`ڼpB/LXݗvHE<"o0Іᵗ iVoB~ Cdžn}`=&Xm5$b%:K#!scx*0'E{"䍰#U FxTxRGF91b7jP*l5$=c y|HuZ 6, A+5,4fZ41IzTF6ٿNYmCV!kKz>WjD(1|Qлq-: },c@q4a 揪oww3v(u#OJ`dDCJ>_dsX&?A-ݕe-;WLVa'0F>\BBwi2Mb u-Q3P( %]AtlysZd <[fіa4؞2J 5'`P0RRn.t3!f?]zK,̕,T!ko, 5? AҠF?P*v;:^ Z%* 6#d_!9OؽL bj[$.Eh$^՜* 2撰@l;֞wK'Y*rfbM'HSՔxI&ilaC:ԥbz-@bp巇?GoOoV( אs^mfM O eB3Ym}m+ Y5NGms7fS(p0J "ypǑkc\d騰A9$HsT#p,.AKFoC?N$SGbn#8~B:Ė(Fŧ+J:j }~#c^p"fWOL$ʂfɰ&~ⲷ{ɀfxd.O&mv "RZéLhSp>}{+H>TX*ynx/1x Oa K%>,rB[} 3LހKh~mVCA3DV[s*نTrx6GFe1h3D+ lݼqqBIΎlEdn~GZXB>v c%<]N_w%%]#S nQ%uǮ 3oS߁Ȱdʍ|k'Y xol}/]je&#yj^9؉)@ TQ&?PHSmtwY<'!r$!Xփ,_M_Qɸ @"z_+g}B=]`D#.y&ܨ*k\g .F?2/~u?e`!+2HW9g1x-)g4\dc,]3 BsuWNh_i}雱rϨ3 jvhw1!&C7D;RսX1g:˴gN B5pq lͨ, Tk6Z ;&N8㝛[TQ,y6fةPpbAlGr쵴XuˆAg%_;~ϯ &fO~8rj/i9KfS`3j(1k}2޼NHm!x{:4v4ϕTaK1ЄtG8l&4}ɪGes d`@3x́%Ct/!9Vj!ܣE~4-)jXMH}꧟<[ IM]cK"lM&:Y;;ʸ8؉thyX`d]n޻ &ٳP۰85x\o۪:]JDuLK/.~rIʀBz8ww%źos)a;'Ygњ{5}5(LV:]A9GCxO-0| 9y:"5fg(Tn5|XoE㦌kCB ʑ`dO+Hߏp* h+O-&9Hr=fZ H"ڀ( RΊ5x[v(NU͂9WhB]!ۦaJh/۞4jxt<%czcd@-+|wW҉)4(縉>*nuo3P.;] B1~j:iQJ+Gƈ3"݁MeOƓZ}<#H"[~2ipv6rE4;TK;dz!u1mH ;xB/\PX%ЇFӱ& -WCBè%Qq_V+ay- 3gXȁvz2ҩu"[յp h.n;0 {蕹Rc-IABvnBz[t/ D:SkW^bv[ e Mf#"' =6s"AbQlC_} L&'y" \"a5T{_:<㴦{z*Ŧk\>GAr'|"pB[+$#~k|] O+ߚ,EՖIoA4dykŊٮ(W`h(î,_g,VҽFpYoK.pzu=dg88XBsJk4!:5fȒmb'lĮQ?$,uͰy!uOw`ڜ |ND%`wû @ |Ac#2@&\hlBKIW_QzȣWް3лdA\ H)GwvH!1ӏ0u-ҿ1gF$*3Fiao-֗|޺@c )!prK( ')W"pq=%6Ewqb䤿gycdJSFh*d>І@Q( N݀xDJeA&+ ._y@xܝ jn/Vu1=mUG;RLzf0v] ل%(82M&eLi*nxhAZXG90vx_mS#:.&uwӊr'S{NY* WIb :̷~41?<,պkvV|2HÍ5#s2i3r#.5U>õauV|c4L.Tz吏谭PhE"|[0dTsz$[#H1<fHܾ[:b@^KfﻕY:pIBO#5Pbs'2Eq'3*qs #1 %A.kPDp8gFzMv %sԕ8 +-ѤLe>li$q;mBH#'duѾt nMĪfY1j;q̆=dʜEX SQy(8N=^jР'S+t i.&lWm`>&o0#X$FWHKVnsm6d;@$$ǢX2Xֶ֫zt>k,Hj='^FF5Ka9}u*0IiZ)]]e垧Wu2m譱Uq *zUj?.9$iua`s`C/oGJ}= E8bHw] drA6i(,⾱6K}]b H|^G7&1#h^KF lwA9@bsf9:͚f5652oQ豃 _W.ϜGjfrät.[ j@ot.Jk%( ЖdN[AzLD(Oe2F E,C9P6ʲԥSu:yLZ/;R=^xM&Vӎ<w$0˻ۥ¤!O [I 6_ǖ>7녞O dn4{.k b ~8s Sc},~/7d\DswѨ(4⋂X)]ޔrv+g=8!|T쒷oA̍gM*Y>b슆45@NAo7 ́TL߇j2Mz0=0J#ez-^ =fM$UJX;WOɩT&)^Bh)"-~GGg v\Ec({!ʫ'e+6םyd'8.C_pr &wB;9C,~>vw#5i峝49";>6|XV׭.^@c(AYGʳkÝJ)_M ޥGf7  gĆjڋD6PSqwhn+'vK息s; VsLL%?6'~ Cz\mXI6hֶ5%߳F' c,NNBkӭDv;%p[ͪ| @{yd)ڿ@CW^m٥j-(?`cE"A&LOMnmf]ģ`{ ?`96v&cB{ %J/|ZpsZ+e^R&*moF%LAIink[g`3pXfWd7%*6|J+;q{o3T֓^iyk+nma zű!/HTR:3=I3o;7,xÐGDpo|h(J$2 {Tg&6+z>5zڛ'$qC BFS[}4,8> ͈ͼGbTYY "JRbQ͗.*#"Jo4Pf-aIVjy7(Ň')A\C>H0;\db bЖkwn):a$wPpg"{_gIBPox_rW<[sd⪬R: ^~Bm9WQ|Ѭg[n( MH%c=Z9ur9B(66vni U(F/q R}u gH{XJYܮEK/=<{ Dm440="*~خn9Cw1OAyG^"[$m nRki(d`D|g낻"}.!x{]*Vm&ԕbWSRLPl{4jE"J 񌧇JgN׈W:/F%OFs_ w#f*e,c<-)q~Z=':q ֽd$0WeR3-!Fw+໧ӯ܎$\Pd(8Z2)+^BhܗYm8/ŏ׳'o^ \>u lы93o*uoI 9eWIjſKb Xb}ҫ(RܖPM)+oN+¦8%^b3"wgP⫉uw"A 5FE*K%#}PqSĺζwiw4D?@س~4 ȧV'\G:)͢ힰ8`LJT۲5-ʷ^FH#q~/Mg"$vA">VX&DmKX q0$"7L-4ټ҃?4BC%^lMzfr#|1VM*q7^IkAVJX63֪FB^w )kvs[}4/4$G*&Gy" 7WYq$ NS|"1(stz2^ƪO 2/#?OS`=}NbtȰ1}o܎_ڪ&!c1'#/kop`ёS^_ Kgm(6CLL ͕T?FѸX` /~uգn\dž%'uτul +HZVdϳxcgZӯQ]K¥)BȎ&Ք|tCFђf*o?Dh'm3pqxY@n2 ?KBf=B($Y]3swE6ڛO-І)4j3}dWBh4z0*yuT>l۴(8Ư?/Ggos\ִJGϲa/x[4jĵfI{HҌ#[ PO^;=Vkt:4L=`}(Pmd~]7ns9 ~jnvplo`K?mQ( (hFdz^) . %G)Q-8Ҳ=s2s HrE<Ģ0-Xd`E36DR½9d1:jzF&V0AɁݺ@c{dbfp/@ֳ.&Mit&76_7 oՖQ)cW}\&D2Z<aLO˻5bxuf_,6obXivbpbc 8̡C9,3e>:(N"ެf0)~Q1 h]WV{rfA ;!O{ۋ{1ŷw}B[.9#;ExÍ?4eٹac(d|,Ҏv.tyD6M_tX>Ov1m9Q_Ob89nYdTHj\5һy0wMua1EhĒ:Vh+'NyY$3ȫ6z[ES6Ae)^QՏWT& 異r0<랱P9XaOBXuB$ (S{Su\hl`r[@)6,5jAq6XF{ȮxM #3׭ܜ@{.rvhze] 63rWs?h*j#qhX/=&cѯ6)S/Fv1KZ5{/]'jtuf;a MFz-#f) \a湯h:謘VZ.Rv˅Op؏@۸|[N2LKUHK_c!])$-dݫӥKVꥅy48{X3uUZ0z UF*. !3&Qa%FI;Zi);3?`hw`|j:~$ A6 K#+ EL@Ez_& XذHI>D׵z蚯\HNtD"&x![f}!8Y߆+)~Xz:gP7:Aaӕ +I_`:!9kuSwPC-q u`W^DH ZjXgaCj9LY~z?\bez5lXc f{GC RB"{>ld[u\Y9 Z@g!rRm%>avaT]8aa?\C.N,buj20ֺ3f +UG,_p߳oX` peRGGrX7i꒤lnAc15ս!}եfs?w-(:[xgxGMVjf:ir * @k?dU@KJ4eŒ~= &eJ⟰{ghwE[\9~)֑M:s½Z[3](p[.QjXTe-LkR1|bì=@I& 1C'gA6Y7R;MiӴ2_TxΠBME X+wb=C4WJ@xZw!R U9»(-pY \X!]ß:=D)Ab59Z/XP@5F u.T^-ǵUg mjfڸ4t!@/*;R{)-^Dfd P.ƱVطߊN^$ToKktv'ܰ+eyrrd]![1(GL&${xIʢZ8j\>Y8mS1rdWq.{2@9ng6LS)q'gSyn[|Dae$ª}_vw}%`R(*ՑP7U$_LM8֪?Z2_1}Ji,=SP5#DC9$8 QJMsY2 Ed O&+<އWoɿsXsS$*MijĘښ kANU:['_t* l op>;-(-2}{yTNܴ X|~<%CP^Һ^“SݮK Rb 9`4VZIw4h:zE%Ofʛ>Qg=cK_Z*,%<. ss5kAG? t*/Dp 494c?f82Gy{+&%tKW(<D`xrwLӦi 򵺧)\ƞI]./}4^SMmAoJgK~/ė< 9-P*6T*u|#G gQQa"ᘚ}DՌRV9Bؕl ب7LgG9̢ 3Y Exj6Nֺ̓Or+3I؍&xID%t/>PYlҹܩ-cS{pVM^f˯]~M܏E u,8m)jmw3fnJ_'ټ01*d,-lu|^> ɮb`/՝5f(h]ۮqOF"9Tݏ 0C| 4ޮ|M9 gվ^L2V."F8E%LCdr(k"t]{x',5,*˾xΎdrkCLpCCV5(K^om_o*ezZG I)DhL 8 aE{IVFo +ɈَZlχ r (ϣgj]w#dPzSC-ׄS%g-F|W$5g9HJЍ!$Viw_( (ٱkyb*Efɀqqe䒁JᐛcmlPAC|7YZGd}VLZ7( kM +5hqLݞ=o׼t} YN-N7۱+f2/3}@.!g TZ X.ˬ~"(pXl/f̶ĘPf;wYqE]gnj*z.5)y21哸DÝMcz!Vo=$ =Gh+_rGHpCo ٽƥ# ވ ZdN*pU_UH2LUTO]H2*}.wK{,o|T6u 11ܵF=e~kGWl6_-)5h]e!UX[%|,k#Mߛ Qbx'ٓEywWB2ueB38э?g7H'|eRq] \XqAO:q&b=REJ"BW\@9ֺ+EwKƫ)P3#[!r'K2(Ȁǂ WꘀL/[>JZ?I=HYwoCSqߘ}C@RX4Crk-qOt,eGO["S_O7-uJK,[Tx6?\OM꾥,E֌qa3Urd~0$at5oXxƔN=NKB%NiCNNRҸC)[^y+ߗA':H TCgțp8ǐ"gicBZnvM6f\fLK HSNh:O v{yN`0- 'GKf MLWU$~ZP``F'URr627iD.OoQ]Vn} vyB"jAa^+Pe1ЗWЩúu7PÝ}=~Hg .?1s+B@z43C]P nMd 8?&nʙS3]iN@.}ĮN[.~W/ɻ#ƤIPHr,nݛ'7VE6%FӻŞk*RKK<%gKG'|WdmpA{58{<6P;K:a7\UL_NѫdJQQw &SV2[e.<>2eܝbc9s)Bɥ'iy;-FجV[{H{->Lׂ2NIu#퀯ʩ]f-v;J7|+` C-k冐|¥ 9Ս%? q@}/mv<~=Q `_ ꥩ ϒN8S.W?ÞFQڍz!@`COy%EL d 8ƥ'~Ë(ëh;S!hQr_(zv=zC%I &nd|2wÑ A$7f YwOjّ佌~WJ=2k[ Z>F6zpAb.pԯ~\ϩ-=/OJ~dōtCrikl%%f0_bs v3\=yGccܳ0`mZ( N3Dֶa_Q&c,|VXa$b-|R#(mAm 9P1~s>2Lsrj9DvvE$ށPYwSCÌg1T |pETvM&]&{:[9? {n^뤣58;Y;k)v@" \5ɍ.5'1=Bw+A[a.5Qfd@SK#AE+?ʖRD,XP8̧d]b:rU  B/d6Ww3YS.2"w`Gn(unGP/wxވk?,?84"S+maZm5B3+F?Q.QHziBcqK@(Ƶ~o ;"h~Ez Ce=5eD{B->2QD]`ƓzgWf40Wfg@W*O;;XM&],N^ήyM2>,^Qt9 %p*n\[s'ͿmWr]eu+}SLk/mӛ^zޟS% _.=Sa|}΂+n i1ŗ2[s^K"o]8FK&WRRvU`@#O~iqPEMr]}6M7(>s'};%w wwח#02eT:Mۺa`?dpג6Ļ X6|(ʹ\)[Dx'BoEd.:S҈j?IJArTِ/t"td h3bTAm,bZuo-:"$Y!eA4hȯ/v)Z*yۭXtS =0;- zMV(nLRW٩G(9js~rZΟ_.9R",jŠbpgǞV t%FG38d-7>v 0uf(^֮VWYj=G[WoxxPo5cn0^2)b@GɃ< Y/@1ɻ:1 Kr]^?]QA׆ep0Qܑ$xJ_L"{E@)y{Vnvɷ+լiY!&r:87|^T@|msݎeJmiadOE}/rP}EwW{8XOqPsOO\^bRCsw_cա<۷5p-f`LSO%x@ʙn/8Y9*D)dH\ O-Y6|ÆƍluZlcnꯥRih{(ȶyzbGе~v]d2ZQDߎjy)C{"khW> mj̎0xp>} }yxJIysb =8j y]^4yIQɚoصKn5wEbDOĨ&gJD90OLT~gɢVu{B b%KowS͖%e,K'I^m<:u5D,01?CD 8O:/Q`B2X<{Th$BRyŚ}L6t1.gA\${ C%WJ@ u52U@!+X\ 7̜w5vT"Ae!?a!orԉzml(rx(!?ᮓGV4T']p_FF@*5M>q LINo7uldkp ij%XlkWl3pEfCP,v`l`mz>^K- Ru>1Od??Pճ$/\A !9@ ֏AnKdI6 pAp"1Fq8u%4 'a8VQ4HMс'ʜ)_yBu3Mh?><\R!|1\޼D?; TԳ8')DϱY@BjػuX#XzwNԅU aiTI,-F pyu`lcTFs_˘fjEEU[b~ ^cѨMIV1 $|JPD ਔ=켇8T;G̰R"^u%TG{tO'W-/[.,F%Gu%~0C;(P>|Uu3vwSUK}|gS*e\VQ6's=*y5Oo9OS }0;_~O{ > HP~ʹ^%gorgS(ZGlRP=M(Ӫ5S^b*M&NJS7:)ӹ6Yu8ٗoҭI1If3c-K>S@V ~G RB^$.ƠI)}=V: %z7sse+X!Ɉr؜M +uVl kob!]]x:Zl d)rq764zYFR.i}=O T*#F+0m%`8v$剞0…8]ӢiOx;ۀU laK!'X;Pvl_+3GA5^ {E9˄MΕSGoǒ,b,M3xpo#f!*Xcrp?(vMvaq_YXiByP'~h'906հ{y{w]ąӎ慠5H!K9E%S/VW3W,+>;iB]FP7=bTĿkZ_?jYU xT1qS*kLx<9U䝜rfi" tb^<&K;*P,؍,4} H&^3H :o;!AYNR6vR'БcqƔļ9S= 3A!Rah 0v?Ȟ%&\O]]APv5i5R~*'U^Sʚk97kZ(6$Չ XJa%❀CiU,3J'\\e͇_Zu:\7c"Kaԥ@Jn(/ۑZnG)<Q%&5+ui7'Z"xř& ҧjv: 9c7^!eӨ1ւg@\谗2paH LPZGj w8;I$ )XDz+*N\Ďm?J3M!uv`VS @jᕑ,bM=|\eG 5M'O!ۼMt`1F6Ġe+rQ䃙nghԑ>"x )MT q*fg )Itq3S+r|`ѝ~߆gz왭9$r*'H}ŕ@a8wqfA}qA ~>쨡w MPfㄗrʬ kJKiBt¦۰;AvW6rvˡX{zX&TG^_V!~] 4MTSm!u.|0o. 1_Zk xS0f5П84Q5rK) wE!w(SR'V#Ҕ~ BrS2de>$3($d_| Sn4߫GU~o]>4O;`Ivg_ܭ 0`jB\΍2&8 |\~ϬI];yA1̟ؓܨks*Anw*F!큥I.P@BrxsS[69d!A왅rSKpblq92&6·Za+7>iy (Fp?3sV:hJɽ^aL#A7yI7 :ivJX%D]ir` axrvyR< !:K=8/,ȇsWGRX/Z'ۗ);Ξ* \u&NfO",reMui.qqn| % Ɵo/.Wf+ڕJhwB2_pd&6 ȯposغ"-sZ<?\yov#t wgK%4ܿ;r]nU>f)%`JxWŴƦՃeM=7 vu``;Y M1Vi8E[ pwD饰th1F_VVfB  SDʗ)zRiwi,I#Gv<ۧ dk;u}>_LH&pWc{=qh}`/F^: 8yX{ ;Qԁ#hWC~({՞KjOwp%w="N3]h.$Nu|~pa5KpsMv}к$"b&*j1ZhC-`7Y赸'M#t X7\T!Njd9P5OVБeW:] sԖ%pκb FAP7XfRé㾀$(`pJ2%ᙙwi,>]'_vwfV`gG#̉|:jI$& sɉ F?+E@[ ^}\wDA|=8.O cw}Р)t._BGC%S-x]Y\_6v?Mʪ\p*QiBw\jDL^`KP7p'/  #C΂h>aU W&Q&ycIXl(}TF,[@qץ&i:p cAIO"^;gt_ELW zz:5l&j!/3.*H6SՑ7Z 疩'eeaS;ODsI.%9R5 qK] eJl+*}p,Tˡ3`VwCY4)Y":GSRQeX 5Y{ߘPe[/ڥ]w+ASa%-%8HSBFTjYip ݤ?`xzgG2iݔN]1>@_W0=X@LFcNV'OMCI-Bg}n)jY-!:[Nhd{֨)mXjPAzg(0Bu(h ڴI?L)Iܺ! Ӡ $Dܑ2+6CD6$:!{6!|+zp ]-ePA KjH6gf GBǖc)a;~g+?.<Ml WmB5Pگb(0x,&0~ 2X+)W={}ihN W!Z֧0s}t< pM@s fy33cGDDܑCH7(cv$۸\Y8,٣0HEPHˢ}~ q>/`f/-ՏHp53/kh֓r QycnNkp T2Ğ{oq=t@@r2$^[V6^ I^ӿgN1zL6'꾩;5Qgy&dg9tJ\Fګ/@/0tۙ}ܿH*YDZ}۠GΏ6q-tvTt-VeD ؒfd]= MidUwh Z~D!{߮ͻ|*-sΝtK6Fv`|dL%v[!+ZE[[ +uBX%L~yA+n!(H;E+Mwb<b.m~:[wa?M␙z\Ψ'dU䓀j=K,eC (!Vַn4`չDd i!Me_PXcwFe]vg'+gw3̴yzm̍Bt #GW A)H7PY # Ww"b9F>< 4Iߊ͇}> $ci6ESBg |>Ҫ5*sb>`gɷ)C&ML:xpFPoh8|Z.xʣ&(0l-,? Xw]?ď A M '1gfVyfػ/ŋϧإhIyYp x\;Mma3g2 l.kyV:ՍZK8'rcC&\رC@gT=#bCo]tW:hW-/ }$+0 t ̔rb]pҜH|2"f('Tql RڼS!??E)*/:q<)P:4[4>\SU97O 5EJ^|U3=WߵΥ[<E[ܡHIiIjRTrzx^H->avlMf+}Ն#:{%Ui/M}K>qkE6;Y-ӧA܋-Uc2Qqc}VFKT [C2Xsi&2lI1\5&ySN*~Lu CE-TRʝ/erؕ%#$quJ4:6eΈʚ^ғ5d(PG?@y42Zaww:ѹx%H.6? sHpD a7 0Q`2Y1ei]t.%b YUec|+h,x+Ejbd^q<8=C/0^MD(UXNobȗDAjڱ9K&lu55:!Ѯl` cS%Q6ó`: #XKԣuŧJK@ ޽Us]Bq܏;tqN{(˦cr)- u22q9m4)jϘ\Һ1TME&p؞X'r 7IOlbS4=cM܃rhaHL7>Hd৖d8N cǀޓX5="U 3SBVB5LxZjKP aE[tJ{Fjt}Papxs9b=ZvD@r}$>otq`={%{)e<t1(2WP2[$*T5U0 ev#eXr -2yƮ9jA|BAN@}Se$YhDŽi~fɽ6RûvOZcv0,`FݝFJ.Z}RkYPb}-+ktb ]zW3HEUWhA\=Q~#r4PjFZ8]db@z<Ϻl?h~`ţfqDP-"z:Ֆۼwͩ`&*CECbͻ5SUtZU4^R⊦ut^2[" ⨸P\lV潚i#8(j3ߔ/iwC.ͭ#] Ge r̃l=I:){܄vTe'p2UƧ@1%rCTq=-hFj\) ɶDثY-ݫL0Β"ٕgPeiм*#8H@/6.E+Utv/w u [,A‰H3aky7)*lݑޝ˙oj=DkS?'a_̺v@_.UZ G!6l=Q8_R:F0C>te=8uAFۦ3T9HJ$=IRKڡ9N#3B8L |R(G1+XTy=~0G mho ,|a=eL1Zywʨg U2N^wj^]f.w\2ORocwAO=vzN͈_`QQ3Eh ^X[Q(ga %,G :ZS?⤝ahD5BZ&cNFof|9~vJ8$\'To{߾)ǠLY/&>b43s)V?h!l[ 4hw5lysAyvpkl3#ڰ>@Q&hC^Q07ms[C]r{FɋhgHIZg39We]9^̡b}pݦM:),"0,[51wF4jɑpvRY# 1jWKa IySBS>D|qa9mv ̤n-pQb?UKl +FnT coJB ~<<1~L4by߰:Īm7K\& Z1QLڊߜ*GN%iLXMOfHfbHDD;ad̓\~ZVշUuQ9PW)G3a\Ή6 :YoFeRd( \R[6f4Y{z|ymclfL9F6_AX;\jY]_f~լ7f&A/g5D/߄1gǣ5+/Awj)2uq+CWoLj85"l]s 17dbP[3<͊qF.ʱ_~UG!6?ӑWf3b~^}p+nV<z<mȖ8пav鹰cPFB;37`Բw3FJͨ(0ovl+z 4r*'|| Wℜӱ͹?NJn U#9̍z|L r1%XqRb0S PL xj;bt 4-HZno7ܽ9[k.&Ix 6f;faCTprP)~}~.Фl¦999,8 z:h2x].Ĵ a#{=ebCUQjV͇a,D nm d\|Hsn/h\u; Ẅ؝8}SMjw\TrS}%C~Vcb/CCd-//H :YFo3A@\AMmD2{l]6>%pT=M\ QO2$M6+k+\F,qx:(]qx2={Mջs|;zr:aw|nY콕]y~c=`OX0q}{9Ż7O8OKB0Uh g!s45?ȓXtdof+~Œz~'3(V#P_;2 %Kd*=Kݹ)D{<Y`^>QCz )(TZep8L  S@)pd5?1vL Ɗ8P 6xF+~`7&A{f{5z,bKcڰDȸ}ԘhJS$ <Ǫ_47;@)@7u)HRh]>hHxs"H;xYʛ9#{'^sE-yy*&t:(ї-eHܬV914T23a_uO0n hjX$Ž 0 G a-XN}dy ͢po1NRJDj).Hv$WOV)6Ъ&.nzeZBU Vx23=iUjp٢TmJÎDx-u14EX"XMZR'q9e!~640 3z{-s1s("g\: ;CbEw)krw֤R`|0)Y܂;|+_=={LtB\7nS)^d_"l{ᵾ# MrrƂ. U.Q64ҙrS27@򠓯D&i!j!QVqG='cY#qV/Phd<=|&d;ЊoV5Sx H@\Tv/=3Ct(40sw8¡]%; R =|rT$;;-'!(Px7];T++*5m,-*%%>l/ g6vBRC3l_~LLCtt 3GT0SQ|:3W$Qڳ@fճ:+I P Vrj:0$J+v<5/ g,ݥF`A}`;C 2u\~:nq><𒱳l\'d}ھ҇:&%O顛О@ڑdw'PK9g5V8}bao& Y\PHtzŵM8p# #Y?쀿lF)pXD@`'\+W"ُペf,M`4Ъ#$Nt8ӂ6oTg >BT7>!{-;x)5puTy44NN݈e$xϯ6u rZ}-6 6[NX DbRZ]]G%[U} q(rx#cx}R:yd>1sHw}E/JL jÄeqJ^# < ٲn=XMri)7LDcV|I231FԲ xa_ UΉ[零oDй񣏨.Xza}-8o*fjdEV,Xkq ԏrTQz5)3duʜ0@SVQL1CJ5cʧ=HZ)sff}G]4MI79?=$F\rZT޿A Yӵ .a:!.VOЉO%su7@ָk䳟IQ7MKZ[!2FD=&AnDDme屚PxlI7Q]ᾉj6IK+'Dhpz^8[IE#^bTbОU9|LSua"~s9Bi~*E=r@%P1:.fBw&Ұ b+;HM,Ay#%y84Ė/v;Xr-dHk$֪Th2"w= ؗС?C@3i?op`)䬗p=OuUy7뙚BP0ԫJ玥ͮ޿\V_jyz[]֘T;7n@2j(teji"ތLtb8 g>k5r{mgt1nf8¸7Z|h1ƈԟN:|ki׿Py] I+?)}DGLWwmc4\/YH:wg\(}&">);(o;kx-;(Y61g2LL/^\H>` řFQ;$ e^閺M^[y/챆- Tn4A5wmSr^~KEv멄+g1Lim ҶУiMq:Rb8M%)A^(LYU`&ݾ{2"<z J5!h"2lK?X/ݵb> S}xKj{5'H )IqXli$p~j%G>,۠6InJ)y*17R#Pg`3fQFT6c) $SD~ֲXus,[ ˿q^ !i`>vF7O{.mK舵?})\Z{[0fJ`(Z2Q?]`vi~'{h[N%'J2ٍ3{U!Gvyj!Eo[g!y>˿ڀ<;FHwmmﶪ1"Z,FKf>OVwj>]sv'%jFN wF}m2$c)zaB6qqߴ,9m8/S>M|Hoͨrc}ߔ[鵨?3ҵSZ@J*,xV\pU⩰;oxki4X.P0wZpB֞L VyTG#2DAWgC9W("}\=in 0|5B|(POZBarҬd!ÀXuGsij`q)p)jbTjN厨GrV+J铴7%lDħ6ZeFN "P)HM}_Ύm xo.d*}QJ(k@Q:f {g`qu4'NB@i)w#=)lOVl̄NzP1>Q2.a1CTSv$S@ nFدU YK#kj\@A*)Ђ&I KE&iV*i7so` xr#+t:<&myIߴ AJ+rѽ<iXlo-Z3t3Í `\&8^{p]ƒ1縤jh- b#a~xQm̥;3a@׫hڧWN7d.bi"t;npEv XaNB]ysߥjB8d,ˤZȆ4UѾ,$A'*GӜDJ6I6 Ox2ǘW֚9 dc%{5u\G9 ?Xq=l{ߴEL;-߽ԎCM*:#={}@C ڼ*puLvC\3g]Cw\(Nl&P7/LsAΎTR"ݧv裇'"}6kE_uD#ȫ&|mx[YuE]K.[>لu@kk $PYn)9oIDz &-uHW MV'HlVl$QQS3>_Kb#ԸTx/%V{ ur2ZMRčo ~l4oBv5ymxؕₚ,%=U_ˁ9='ڭdvx!kݔOk*蚻k] $78f:i؂ָ*W9=ǁeˀD@uQqꯠX_U6]YSJʓjs;QdmHI2 %ɫZSn|+,("ca㞞):px+ 廨d;Q6;y!%yhSvFqkҖՅ= .V %::귶Aنi־i5OC!x 7ѬHDTH{{@%o0*~N %㞶z7$,USO[DvQ+mpmY[rZ CY<~md"1М\JvX`xDԂX֑p}t츏~?G*SN--?GMa;$\Ky>mRe;LjF'M|H=L'(.VB.q/2l$8u/e@ڼAQ[< 3]-9q$(y^&u,q6'ZI x6RDYd3E,X=0b|@M1q>''"= ʼnoc`_z۲JYX} z)<}y^UjRpJ0 6$:.ǽKfbUɆ*C* c,i H}~7m1P_;*ez^Tؚ)w8r$ @{ GBa̬sn v3vNBQŖBRDwh.cz&-Ku J39PC/9aliMMSY.Gn `adnmSG{H`n0j0)LlӁۧ$4܎5AzBm\=;US~3yߔ1%ۉMy8ď.7HH|Pu*ҶeL"gC#BKÑAXwm {zR6ЎQmR5/"z6AR1]wP; ̷@7Z*$2#p)9" =WpPN4Yf@`>g &p[bXǑpbH:ʭKGDI9bz_.DVF#}Jt]eF2G-NuE1"ӇdP-IoVe'e0B3<8KVcθ \fc0͢ JoqX[m 52vK؁ v7XNN AzV[x{aM g& N*L\˖?{zr{uH>J8K9-[2m$ ~$߂<bn<34 lP.[$g KɻPWdP˯ԵWUQȻ!&'a DuW>r]̭#msj1Ïy]b.T5k^GHI{Z'bCdFEv (sLmAכ M(2"QJrtf N ]Ow cדe&,5뇂Yl&Ad(׍:,*0҆q Qβ( @r@m(GhBM5JCnIm\ zht D|$ Pk hTuVV|}v U4n! hwbDopSV21TБ\FL[@Ê q nts{jן(n*Ϧur9*tAD^PvLΕi4.nLOjpJgaȥ"B0R{6bUŨV\G d22P#x Dec9^d?A,swlM`N05j'qv-ExRJob3[BsS0 \yƽ!6o3uYv >;?ũ2IR+y%?hZ`@aޫph̿8G 3}&=R&q TWOНL=K'ԃ鉆2 =`OZm~M{c艀/GtB3Y}>EhRscL?괏Y,dxE:MA71g" ptMRNPF>t3xL`K SXwLbJ˨,pdw>|:Ҁ3{6x^}D g-W{T_(0q\&A)u0KAH[YL1 |/wRGwxI &r q0@KNϜsȑwַyk%SR *Zd YNCZg)m9$xN |L]1`5U||*w)Z;-!d[ P%+|P |8zWG q骖Rιt.]NutyjRA[WN"?6^M [rHLOtG(fMZ{הwY"UmX\硵6aV_mE"!Cl1;?4:t,{ ĠV)l 3#||N zo}D:*ݳ">xҰ8;$2b:dTɕF;hF$$u L@n3ix/demPa:l 9}lۈHarm[zdf$>LJ]@AarGk"n~q y;dɅ;RCg2[T)/{P)JOy󩅦 BJ );[Ex&0 iv veyTlFjr8"k/ʫw΀.ĶWրH iAi${ I4> !`Hl}cEF @O|jpr@'^}{q1G7;Xk8ZczEP{Dp0(PF}.3>%%+PjoKGz!ldTTʴUJK*ssū kUbA\s&Bv(G4tTNɎ7@ҏ̮:n͢V׵;948̖ p4ŹxIXتe X9u}*;z7 b Nrm.ߩEj|{X1HJc/OXKփ#|RlԵHvpThC体d|ZkE.)1)~Ƀ:ʘ"`nOVW3dZ4IM[L".撫UZbaL$2P8T_!+!r,iۼBI8T6<(1YmhD"є:]MEDsjA]bH .)$8&~@DU*BFO7Yn3iYox5% sy(t`9O%[,ZKrjSٖHDw!Og3oAir\dE}Kn t[;ٺ6r6uџ ڳם"=({T %߰Ss3r.dܩ)O,{g)֚O$tywBULs%"/Ep|+hek?Kbaf*50u JΧ8w6 |ht1~6]4ai}hkr9VWh ]UJ Md|Aj` )Yy%]QU'mCN3oGJ-)0,aE|)SjMK%; H!YeyI"[U每XP=A\ erU$'n=ҧݴtw8#BMTVƘ7첼 7jҿߨu( rg""uɃ,o˴b_8~lN0S)&/m+~X<+4cKs)|# ِ@r  a9? YRDCW!SJ?_ye#v׋렿SAdOW&I q|06=ÀIS'USdT#ĐtBB` FQuKsDntbMZ( Ft7g 8dt‹ViK UұZkBa#n<L o6G^ڶŇ%M<ܞn2~,A9L\+Mp2 a1憡g]v* X% ǚ@GXvښwa{M&C:nm>&cQjV=@ҕh`_lsw4旝⋲xtbAN'@H!yԨj5JUcN 7]'*C6k*t噪6}MӢrqz攨ɝ0E y^qҥig/22p|GJBPc $ܸkW8%#N{TDBlNGt6UASlϨ@IT%;#9v[0ZH<[:x6NZ1~H? OeֈDHe[f4RS`i$ grI=5ƿӪt)OP/[u*0U0B8:]6qLM1b[WՋC4:vhjwKWzBC$qw0uCxqn;OGqrVI~$S廯 Uť5%6C%_G}}?/\80 /B.6ZӍq߯=~4\kW1GVeQߊ3mxOشœ.+ cݕ-%}f1>>;xϪ?c&gK ozM~: ֢knDzi5Oeڙ9 -OelҮǴp§!4~h$x}5'7f58x_.ѦA&gFpyH &Vۄ% 6d^$ 6BFmXgJ]bn?0[Mpr2fḣf{(dRҐȽ7m߷Jձ-9<./ź{BnK0̮/EL_ΊZ[)%<A/$r`$cERk-)zVJ4 /EZ" 渫;xfcTg8xL)[ws4 >u_t 1sn|uߨ*1T.}a+߇(K=XykvxLsz"IbZX\_Xv"UL )}vFwR"G@RWҵ} >?MF}Fy 9oy9qgQjYF _K F[ lLYqgr3$c%g@X@LaoHh}!)lsaN2nw*|A7g8~0m,nVY"=8"öٵ D S.ϫΎͺ'I}AkO) !ݿKo|Xz6l& u`FSWlҤ},bSiy~C>(Һf\Нi3ݒ.^=Xޟւ q2jzJk99.WIّyEsٿ#bDZS^v0`? ! xX;l,{wۙ/hqu=d]oyev'kTbH7 z*&aov<263p:Qbԑ5:1|̏Yd"*A.xB|)$Sv}4An{aSU. '8 2tpt)'/{ˍgYu-ۖAQZ‹'kJ):T{ް[@{"3*!o(7k*ݐyj30VY}iCRݹ_n?6vqO*7^澩I>+sʳ V\LPh#܁\gKVҍlHoA1W\ 3[|'6N4v|伭NPt/s|I>M;6 &AwJ3Qj-ܦ!Jۨyy0Fy ?^BrDoK#4#MGQ<-0c4oZfCEh((*倻ŮA G7/o4A)v?js9 &Uzb26*}AS5b$Zd/ htDawRyi"N2y\fnExcE*ʧ2:eAB@s6߂k6jq :kwח/ƩRQ+O_"{A5KR@7RZd6ӯ"kpi&Lz*y_J{RS  ُqW$6qѶgJZ!dlO2X]L Y^/jS,NT)^ jpL<cu![Ɨ. QgyfBRd2̀s@҉ÆOOmOpnIFEѤ8i_@~Zi™6_TYi7{͛ih= m¯J=d v4"bmE);ūL5ݷvLNf]Eb*WR%໶i0~| ]qEŔn/7]EgP.pn|HǫN9e,ӠDžIn+,ڸR8n)0[ G~f$mu"hDaP=1^%Tؠ~-#~B۶D$>8`-٬kL` 𶩃|}a&t~-+S6?5Z%IJT3C)90L{6+X(~cX1#Ko^.?qnF%.Tv˫> YwZvꍌƼ+dy œ Apf4jhK[i`S5;nߧW,MPC.RO[=ٲ~L,WF7ݬTFtaݸ6EϜm3=R׍\-aXAkQYKxOvH"@xY6ܗˆʌX)' HieQH U}4p<aO$2}_oXKҩ7ṍ|4*^Lc\B1d:f;Vn~=?_Џҭ4iD>qnЛ|ο"c'8b:tMK/lA-m1e,b{t-N:#(n^y)`.6[mx}>cAu0dLLcL&*`X`9O\Ւ=Q!a5t-_.&+Dƪ$=0>d2"z~'[^ƭU23`qU5/ގVlL`ץң'zؿ y'f+]ćZ<^KL-gyTl <0PȍOḷvglB1 `S{1}XB]m*">BDڦw2yօ"B y;IwM:=dpW $->䑶cR`81U+H@gwYj~Eוhae:K])zB&sݷNa~/?'j f O")JqE^4"l\ȉ&g4)zҝ*<>Ʃ P-ֽŔW T\|hABWC~:YΡ]?XQ!PM֯,<^e=뙪+=zFt@ߊr\;J[G!pIGV+Nv 1*(3,P.ܪ]`EX'闎<-9)aZ9M:}:Pu>(OV$#x<+DG.?DtD!wl@OD3o`|#(<&6bѽ#%1^<6v)8~ 8 6=_AKeVe=oo =Qt)y 66NI2,<04`==y~1K?&*%DyoXSsI 8`ؔO0~/}]NUmTE|n'MBiqxb\oU%ٞяs֊Q^I`;+KdR;mN&KVMZ`()2r'G _+"^7aA2z b}a=XeJ?EBpق5*6*[i̘nd\aZAxqob\(GҧC-=0uW@:?c-\l`Tx}2L͞ h;ЄY+ah~yj>FDeBó)̨z h {žX蠱e - Zgmc7'0`P)uf8~䤫2l G-o,1ZV􃏘I(5 Y*-ZiM̆%q[=.4xmbf^ Sq~ cXy98aD 0(g&d^ĨMc":ZލZ3IťfS}͙fXeT<ɔ9=sA<難i$.oK{dE#壑>~k|<@և+}̈Ojy m;Uyέ|4 g3dY#!IyV2z>jJ0:krѿJ_p։FQwǏi:ylȘUA9[bTz&CRN!*.&k?a% _vÞ.m#fd˦x.ޞ554HfO~ɘCF3V"`h0l~6zځRh.3!-{!糧 >4Ib E}*{&hD2]k~ j(\ 87ґYS@HJezƀw6k\}f ZHT >w+0j퓬ѳ64OoMe>"uGtT>.79W&N`2qZIGqg5Y7pr?+`?w>щVXP(xl0OXRk\^w7}Gq~SjpL/$Wc[}iV gwGgϋT.^^\ValC+JHҮWԩkoMɺrMu|]kW=T (Qb:21}ƈ:D,.k5=I$09wpfvc~]=w=+s;Nֽ4Z|?ֶt# W|4:1QPZ$˫,QwzyMDr٨mː܀}X E8 ߈/yIpAa\dϪ90@vrdE_c#,3 栜L-W6^rg t5-j&BBݛ;O{% Ɨ206 ta^,)›c\OlB7t#Zk-܃ȳ6!eAQ4ΐ^cH;4$-[ڰt cjx~|$ez+6Elmx.{6pХC9Vٓ jJNh+̦f]c~إR 7qu-p &P#0spB>R"tJcER:HB5~nb+"a|;b1@-vM u\LA\rmK'?Q7Sp*XjVjnw^;g`З-`=m-lP{ܛHE83oF̺ (XPl T[[H8<jEo2hb:Ͳ΄tju܁I8п<z:Jk3 zX=N_ۯc=h()cydΕ4be-54]J_L#\3|  ZZ&MW-pF[cV6PL\^޶?F\ D[7 ( k `w|RsI(!"'IOk:{βD 4N#`yK _tݕM$($J9LIIN5Q*I5YZ{FI4Ys_ƚwz\r hbћ"#{dJ"Z 2| m m+H=ӟJkT~${Q!n?!xvJ(0 Pp4"?/8,-++*7*9y{}1=wnj)OpTFXX5v=bX4-S4aY[7HqԮU$*IF"qi[La+?V8AH]0Q no#*r9 9j]s,eO!$ .|U/Ԯ\U 8PYڅ>ٝϠҖ؉h24s;)^Zaz D:7_SE[a2}:A w'ي_}TsvV뜴EwHEh. 쁜;\2@h|`8nлGFcv^-Eԛq,QXbL`f29E &{ޢ4ziRIřDwo5uDU-hnlU ETřH*TqA/X:q#|u㭻 Y#VٻKmRWYSgN֊0HdkI֋Uy9ھ;+bI 6~< bi/ CKJS!ohT (lg|kW9K '\,5 (Qu==ʼ8>Lɜy!_׍ WQ tO[f'Zɓ60ޝT}|P:b{T `[qC :Ӱ}fƁo\gDՊ ٩[]Y"D?sPP^w#&HɱAc~-l+]eR%NZ\#. *0";4Qt$Kf(eEo9x$P`UpĎCpNh)zf%ۇ޳.IģZ]..]@9S2VU{Qdl}#?0ۜܗ-/PlJ[b6 FRW:jEIPx=Tnq45$fAO8'׊L{%[5` ^unWU]g)fSi"6R^7MXόRTi;kȥGlLPwcк?3)Yi=ee|gj`}'I rw<k:5C5zdBV? 㟠߷N ׎w#̈[5zDyM2  KKAHL+j:Y -P(?՗ <:S.y w˩*t[Z|*Ԙ\MVP`ɦ&Z.Kb46{z0wG64`NQ|Ԏ(P~PrR`wu>mkl僳 r]J6*&f[WґB.;"VYCخHdio#P&͵ĩ0XQ<#pqV|z6\-%~@L1ى>^Ako_EIќv*IڛiMx'B2 ӬxTƣRW+?sɔo{\HG^wjnunQ@n .lZZXG<(^ :Gxz꬀]?NMVa$o?7+rc䚼 42lXl]sT v]mgN=}ԋ2ﲐ^u^dcfg/^DmcD~jUmˏ2 :n'#w9o#Bu&A<)TxSe;<؎[Kn?k͆G%zke=("4 @b2铺bf4pXtȷCEyueGt+΀z6 ROZڥi" I+i#uZړgW \kat- Ĵ|4aD-/Fc֧A15zL'Kӣ8 1 }4{HʫVUsuP?`#uX]95<W <uD VJه]uWWeZD5"eN~1~̳lNؕ6fwͩ;1L\vQAw=O].!!3@-PJߧv`3[S۩[F~.QyIv'S9t;&n^4BƿuٹΡѶל8' \nA/ZWn0tȐNt,e302\I~( .]lL k>8޿@ L^ y5F)8mx.\g)6Tڽ]1.O?)#o4%꿩D;jBS⣨4αKX'BG ]X]u%y;ϕ'xq oÒ̓ʋ|]˵$8 QfOR;*"ߍf5Ə'J5/1/n{ǎld(A~@4i" liEkNCAo@<?+-3Uă@lu=1>_($i5FT$67g|,#-6:ƇRuĉNqӡ6?Q;Y ={(E(kđ ;`at db:aM""ߝ"t8pFNR,AoN]+^_Gzr _ޛM;3%<qS'nP"byS졟KD}2iW!_O؄dQVO r΂ XP:J|zT~.@5x0s#0Q ǾkJ;^)͠ [nD :M>DvHrAA# 1m ecODƭrv}O}aޤ Ūei`Gdr ONKu9pz@񰙶ryah P Ɍpy΁ínOSnX"3"EK0qf/2 wt"on~J3` ^iM~d‛8!頯! aUݼza{ZJ!i˼ pLe)3>U"әx@_LnPpvY,AcOv_&0|ԇ`0C;ˎ6!y[],~PYΫv﬷S)߈Ĥ X{K'b玔^_qG6>/zp6 p9Ҟ> XRKyjpaϭ332Bvx<]FW &iԀA71nٌ6&&}F"ws$:y`>z&ڈN2QMp4)eGTRb!d}LPvUP|QtBߤzbtYxPbuj_-Ru8MӀzpPq#]ʧ[ti= 8:AzmOb y $1Pu@Uy'M=8żFJkNr1iu-otx0>`4%A;a[_Q'K'`zo sBwr_K>߹@#eHb1!N2TA]F)h2 A?֗ ӧۮ!Bkd"׷x]]֕{ْQG a'Fͧ*2=LY!?$G m3~!FI6GXa,#M~2C>Hnc;dʊv?/%BFƿ#ӱ\ cgt+#T保_^@T` Rr^l z6bgy69RjFHΫ̵HG2,ø| bĩj섵#˿|,MlK-QSTݍ}ib^o~0.67xP9Pz=ΊZ䞖E?84ދ2wwyum C c!ƒTOy:UT(I-r%fk@Te| wPlrE7-YZPly;jqlƿw)e7+yTK o^:(M|u%zdBӏ}"(TH/Rt"/L}M)XOhLt5-rzw&Pu-P8AbfXQo,S!~!(qqAgqj]enSVo6sTu2Sl]PUsJw](.}°y7QۅwAwW Sֻ{"Q/7<1zlׂ`md]0B( xXҡHm]l]IRWZ6_IqiTkB dnbNTWXpmI'0ll^>0[h'0O `*N\芳pS}AuN_Hrs/.UK LJ#!8 D㛦̩BH>!оm!ʎgD C1b 6/Z(Ӹ#)ѬI?zWmxpX~%L/f$-2h 9h. ܞ0:/be 'Aۚr>J7SD$]( h75t‘˯ lF,f8jOdA3%N73ܔ%1^HxG&$L YxlK6$*mRR%DeXW ꚺR(W͍CÃh r9++:&yyC$?Ÿœ9sz`upVn~/m}L8\P>B)15=vAwd܀f͵;I2S!nT5!]Nit",&ǚK(RL=8Ej#wJ7F̰L%kCYL*>N-Qf7\[Wx )O|@ڿ:_10-hW2~Kw:қ ƀ`+eh1K k%^6Qr+& a#< མuvVyHGsJ*lNݠy5tde}"hl>0K.rx{3ڂ|I* ݜv;>=?_u\HqMi0oI F:4 uNq}+TPMxeFͽn,hNȩ17/T:\NWVTcEX *P*UDϳo`6 /&##ku:F_⟪! սt.H2O+w. g+K Yɂ0^6^~{ m dV(B26#vQ}' HU#ڿ qjj[`Jlvז![6o*oMұ'C}*v!]GSB:<: ]Cӂ%F9%Z*fnk<>x"ڹP"="xsbo2%_ (:FZcZ#^x Ό`2f؊FG&JIˠa&=9)&A\?hI  |Pl/n5L0~oHo3s`p埜Wpz1n1w+Q:kZLmhN'p?Gv7.:N/Ga 2 NU_7\ě|!S8M?㤴z&а%-s&Uc9 Ybr[QT5jp4%m0 ,)yt'(B(-q7~N<fnÔ;f<~{n-V :Y"d(Q^ml^s 917uR!Eu4^trv'ijb*~@JQy7P Ap8ҟZfU 6A qeEYa8}{> LˠN !vu$h L EFgfhEe,X>u[y{lA][^J<f^82& :~N:ݐ&Tgid\AM{l3_i`E]4dnt 8~G"aXٚ aS:(y FV|TܚxAgniotdp tŸ̈nMV&y h0aL uS_Vb&[H|jm,5P1gI9QYtZqT *QnDZGs]6e[*74|8_ex9Y^cH7B3p|֏r|=H'KEi&r.$;]|lg \<\G ]o@\bBK"j,t/ujBKŁYzk[G_7j)V!M/"5$^yQsyf 59QI *Ӷ{[Eкez_c>Ҭ%&Ih+yݻ}-#h{kh'< N€֢~m^07\)0d }!fJ4[]{mɋRB,H5iF-\UN!ݣB?!vxa ozPڷГ5֠Vh5Lk5;oVOZ>2&ۆU B#yaDxw1ԫЧ1BK-O>4OocM=S["фKҀ_^albleaПg1?yc/Oʀ! ƓikbI2_)X+oH}@f$':aJ^eŽ UA^3-vV/ {|A8Vq) VHSQ4.H Y8oq(2A+T,+vyݧ{4f779FHԭt?+IZPz ;gjVI lVqSR7i(UlBt72"3yR38j,su.mt$P=w8Mlb2nИM !#NYS_`:j3vmiv˩\LL+ 2q([bn`0'jA6TK@љ( a7|`*Mt ]Rٷ[pTߜ5Konzm hfX vWm1l'ԟǾ"4$ʟ_7p6jlM\Wsn7 &&* `Ŭ:פIL>935H⩱(PI8C_Eh#V=͓= t[[ӅK=!5+Y+ݯa9u8l,e7pހ"6qe2̯ au2K%5CUPr]*,pv?]kj =忐fej2#[P4uէȳ]6Q9^d'B/= !'T&0V˥D!??3U=0'|ӌRB$B7uk)TL*ЅŪFnYދd) 2s6Mk]X1_RRm@Ly|8S))9L{*tBC${Gl=FOMR:<{NM ֖$5 wr Ύ7W۳~!Lb=}L˪&P 8;Zȟ%l %?O8Mtܳ_RKky;5YYk@CO3;gIK6Ǝ$?Y"uH-Ɋ.OĦљtpi_,F8Vm8>$F79-VWnRlŧ3o&^doY8*5TJ>;,}5}"-#r/hX ]j(V4֗g;iZ!h2M݃PFH">@  qȾIIoRr{hX Sse|eEٖ[d ZK݆}2zh$ 8Fmfj;p3~tί?`/8́ґ7[ 6%E5EBag,#sr\^Ma:(#@]LΫ#DYXwKe@ON1W R%jM 2*D Ӌ %}J\z]ag@F)rR\˖U{d]ƺAVǧ@jnEW`S%b#Te(ESZ![c 4NS0zĦ ͑F#/B#+ +G(,T du\MD\9JҷU$8^pJ^m,IXà k&G!6;c ׳g|bH*2f̡Z)o_kBXTdZllLGK:ySAd`ɂoq2ȀO_Z<\i[_p Yh`ߙm9p:/>vp'sTNy"A)̴8pȟ.γ'.'QFl&O^ *Hkl4xH4!4oF6^D7ۘ jǡڧG}(fs:-[_mj}zW'@#n) x)]|]\2iR<¼\9Ѽ˛ I-h/Q|C%]-vwyC'pb:.{;\MʎT5Ǣ(}^BqY8֮VI8.:T9z6φPww!Hȡ1Hb=%TB\\75XDPa뼩rV,~dH99dH #qfEOh+5bЂ읔w-נu|Ta4:z8db S:. EZ&=l$T[Fy1:q_-] HQtlFh 'A2A')!6H&q{؋ ~ >ǤwV7C+*e<FH<,5O5E559CXy漕[o#j|;J޿BAOʷ,W3h5+E) Do,!AFtUхC~@ܿ@owRZ{~@XI̒aR%U> ki* O' V0E' %.?C>Y6K[ S M RJۂ)z|))cqPLFxs}fmDGz7ӫCE#nE EVzl%B6n$@U@:J/X S د&(c#ڃ;AD#@S628[Sf$³j%攗R?b!ZMS0 qVYtiě'4}q1t#-ey]ŹlIWhݻXsW&Vwl%_ *+tl8ݶv9F@#DD/:UjuYkdgE>!xJ GYZl, gƼ$g\A;,'DęPε^jaϵp): uVFjaԗuz{koXy 1eIV_ }!Ca,bF_-bI 16y? ?ӱdzr)=fz']xFɃ4;^a^%Z my+fiAZNBmQ%hFsQ+A 3 :+zW 5auȜ_|KY xEYf$Xd }RdY|ϓ_B)&spۚwАînز @?۱K7뀎FqqWϕ8vjʍpbr$1NldFea^3]󆝝 /w*CId' N#S 6TE8}tN2Oc$[o$PLQ}:XɁ|c3&+*h}@;5ѮLٜgLUjN SoGn)`zCjXsUKO"uлsCx ELAL+Kg`£4S,+F7.gj8 S-ؾ1?&@*w){~{jU}Qv4\V 328\Hm ;|w5oZq"dmH$)*S9%0a:|O ޖuBaj sA0z ?LĎ5riD uMBV `G+F3ji;ӲEN|I) rc!^oN6DJ<@&gy0Ĕ82vyذ$%I*~Bh%xER $̇ӁIZ~v*,Yˤc;tQ%oAХzpv08O"%Iؕ$?/o -/Qs=x3t 5Hl&9popXX_Z7Oَ?1 5j7Z5 uƆ'YK&M"ţSp!?!=;gPS zQVt ǪD6 >; /_Ty9kpY1 HߛV _V7ÓNBiߞ pMJNT.fN$QмGGѤ ihY|LS sg-PTЫgE+\:QT !z?Мcv~DChb8ȁzf9l75MRAd3$@_fXD: Jht]Gg (갦\񌵝-'4pr8ɋYμC1oX-: w!NUzcync&%vH<䧹%RgibH^Ԫ=Mg[;Tr"JMA?.J0?%=B` ; "p+Z X"4+ڱt[zd&.7wBjS )TpP!z_&':\1wGZ不]<Bw`d!Vn!Q@W*Lo|"v ,6V⮙] "m$;}ϑJB,7K WP!àZQgDuZtJ'ΥQ('PlxAx(]Gt6FMp_!Uޟr5:p5)-CaSSrOx76ꁿۼ~_c図fT4jLMN:U`2C=u"3Oߌ}'ŎI7{~@Ee< a0W"N>{!^$-|N&շBCH6x9I߫dz}GIxήαн n6JL/"C8UZ@#Z؜wuf>]]am]*5is+8!UqP4{["(Q |ZsD[(Ռ)q3䡋`qVŽ C[meXctfm?L%|yErI%]~ÂFJ|VGwXN,ي WOJ AHt<,ĕf-b'ܲ5e-1Dg%! !®PĆ T&>'jVkz'b,u.x#GZ=7edI!Y;!ϩnupXfp\|?eS;DWSZtCl:^P'Ať*~:<Ew%΀ h+Υ^Co+~ޥg.+x4Y@6ŶX^m*7ج0+!$n߸h ! x?]˟2Vxw2TZE^E$ȸ!;oԋ4/k܎9p?J,NX!5ݎ?/=8| C!6YAmL![JV ^3tߵZI\:PVj͂+FriJ?='YaSsM`Zc28{fRNMFʰENaLKjjh޶'uJ…FƇ0}qkoyVm#!j5^,&hAD5@m+܄m<::džxyu[6nqa-¤ǧq8eQӀ.i:әoxq13 zSLݛYF5yu'ؓy[F@aa0W,<;)\ AN9Z=,iň$D7;:Iw Ztfg@J U#mdDp^`QavLU%`H e$1gp jĨ% tpA_QM\`|sL`DMqxVC8=QS. |,#ȏSy 5 i_^hli) q.&S5Rx 48XT|ԖMyJy2]ԩ0ɚ^U#,41YI-A݇HSc1q ăT'gmg߈'_*q<1ܿ& ".CV5gH&OPM!jJ$/2&9xw_d\goH/׾aN1!QaE $%]cQ?}jzmu=NVڙ=)9# ǺSMqLz_u[FG};DRL{SLyD#Tm3fEIr]`35?6 $)V6w0_;u`X"|TEz4$!y! IB7Jv SZ|-U"'tCƢŠAF ӊ/ӹEh.g$A{ll!fƍD@":yp'Re9ƢT4M:գ׳-G0;b!1X??؁ s Cl5Y`M} ?^b9S|N{HK+v ]dptN\dgӅ)l =+%!m)9Nu6 N|O9,Hc}Ie~Ed寈ng8a7{ۀB+ mmA;=QO`rǕTǼzW® l3j?ʺ,h bhtnaGҏ3sB~Z}՛>ɶFYC0hyх:^Rӎc0F$QmG hkǑRPypg k'k5O^Crh dV l9+Cֆ,d}&1YTwEДNsxzO\ȲÕb;ǒxdzPݧCaڤį0m%.W۬jVB csyܡN9o#F&:*%i^| ^cӄ=@4k8_yb ЉQ3~[J agH!Z\ppRt-)4ɟO% FjStP"Lc7?Ѷ8νtL>6|n?R6EAL7l錏Hzo my(g );Zwr*ŀ2tQȈzcGMR*ghJƅc:GM:w/Kěz*ܪSi_ZCQ)TZ!o{a{6`b #)tz/rj֗v$}HpP%rﱓX]%c@G(xՇ\x#7H h=!h4 lORc&bu9jUˣKH#Q#2fMW aEvς&e_}ȍZ|hB0wrMu/]{svgDozkJ= f:F y&yt1r(X %* g!ۧ]=Av`~RAP|2 ҋݒ-4 t*ml.Z$ Tn?{.T1(!!\JlENSan38YVZMT鈾6=k߭ǚ#׿=X݀{sV $/b@~>t1*Qčȥa]%"7fcV \^LK@+9(z]QPw惵2xBQ!P7 3?AS:{)GS4 !J$w\a% N&rMl{Mc(|Tӳ_T\n8 ե10ѦioiPM]zX9N>Mwх'{3 @`YO{ ӄM(IicQY.rqR@ @*ϔPa1JߗZ)6!g3RS !P=B1Hylo خG|V_O)P{ЍٝTWV0Haqg24z1+4ϫXqϔaMHG ^5[~ c9 H=vū*v;/S.=mK;SB*BO5XEH7@ڝR TRnog![5Jy6|ٓ/@g< 4'G o;,2c4x=8;mLj2955R^O1y>T[ڹβSlcmDsfZ<$!ne%% kfymn֪3پgPdwHtT.+۶GavY?}Hz4?6zUuLF⵴+!Q}M\>@/ zgY!")@FQZM[Ɏy 0bZJY٦+ @"5Ÿqͅ{r7[> +I^Fm< 0eE7YH; Q$ ю& BRs2d\k|SiXc@@TpIQH`F+zcirIMcڸЯw3(xIφJzSB~hxB KQ.o'Xhb֚@ڢ{MI1d;RX'dg yHMi/o )1[UԞb/3.|D̂2VnB.J&ϒ]V =~-p=bcdRaX%gY|zԊt ?+lnPzMM%CE#}0!aXo8B Biw,~&4K$*_OQTWr-"Ԉ,SՊM.]S@5Ds'ʎa}ک4WnX W(ShܸZd+3Ezy707nX,4A<-ءiXm[rq=5힊ޏ/~t@kAr;xk@TU孋 A5b F Y3mc (G]$;(6xkq>P7\sͱ8#vqZFF{ .)| !LBc;3ngz:y2xJ8y+TF(hhԝLkxBQt0$ S=NCd6jh}Ղmm e2( x ƻW'kzn9!o-O*)Iz¥UW\MeR9.8/`*º_ܽؒ3X ~9G.=`f)Y V$]-2Cvчs4޲`NuF8wE8{QHf2Gj*y;epT @R\x}]~Y"Qt4ߥSH[w:~7sBM, k8Bz?4[m&FИ_FXv2.#8YCNX 5w0ܿi,B@ƒ巪ʼQjEWQ޷)RCIKd&fWR~|݃ rk>!J qq͉߫y, _$]eQnF1'PYrdQf\k̺Xz[ArF, Zr$6Kӓ}N/Q&'#5Ÿ&V:d_hڜ&FgTRrbMvd^IG#.1é6o3gN(Djշ&g ul3pYC{v'_lN}f3@r{ku #.^ o$bwӮ$`S9 a\ia2'fft>Amԯ#34qe3<1 /|a4j *բehys?ʸ{x$k01TFK_1)1BavʼšO G0kr/r޿LIHt3hӇ` '}h#5QTMDWl!mC*)֧.ڵlGKۚ}}v`ԅލw _MA6H"qV?~lKd2ꝛ έ@ fՑ ea>@ƒ{=t# S9P#SqSZ65nIC^b1<~#~L(%ODŽ)   ЍRqs#eFtB^5(V%=(VSUd"e3u]oLqRC.u(9լ\Z!R4nG&No|ycm,C/aQ%Sr[\Ws˒tS.AVSLݎ<]p!!qqU%jYi1䑝ud0[ 5Ɔ%G^h7N%v´#NabkYrn:{Q- AOh#*:wbtsČx|,@*:ŝy™ZR,ɶo~@#7WzlmBc4R )B3x% *k+,řjqG~Ш@h|u TϏ]@nrefT=h' Ov;)Ɯqu ^C[aoPg6rE1O:cO})os535*n` QX3~t2s:n/.5>T c+nr2˖&otfCtzjT><ݣ[Y[Aš0#n".C@B.uOKT ˫ O3x g M#*ȑQe\ut 8zUVa{mTkQ:xeYEY648cP^qy`Xi?:WxT { elW_k |C8:Q:mp" z]"};Zq1 }4 '(aS7P&tbfĈ-"[G Czl^3 ŠUL EՓ48)[=D5W,FuFPw6VBI?1I|J3l0m!fYdز䘽TΈp,-JjL5Hz%6>wK|?ePIqEfi+`C*QQuazt!.%Qd%=45`2:9~QcLDHȼ!Q{dXswt+8sTKBDMt8~1Jh@H^0hW3̕2(~N+s*kPy>䦬Eڻ hq9'h.6,+)ӛ?Ɖhx$׌ nuF HZ"*q4Õ4"janUREe8@WNK ;6o(h2C1Bŗ9d<UE!21=A[^u&HydRpV/s_4,94,‰į{;CDk`@tWWD}eb0R*c c< D7U/GAB^DPV <J~ua_ /.O9_k5}QJ/~JǙ3uJ-ْnSV;?ycTt[HmLX{C3ڢa5MM·fiWr.h;Iҳ9b#ω c9--S |"D,#C,hApz+ b':Gm2~ VO"?d+hӖ,jQ ysfS9 f~lJȏ3ݾaG4! Cai~!2V}p# (Čۻڏ]㯺3v& @oNo"r ,9I /]lSiWႲYDJẖE)*"k/tE)b|kv)aU?Mbf |~b?dV8k5OґP)ubzU]K!#c`cLJg&yv֍`76ҙl܌EIdC(I@^.3Zp6_?,fU$3 ;B-z|c_~+V8W]?`Y^c V =eg\Kb4;m{9ۘM9&=BkHX.9KQ0<ܞί ŵK"ƇګS;0RnB?hҹN>gSjtheP3 tp~r/X 4ޖnye {Jz(|å1s5:J: %lKf/lo B?TUjhMGߊhɫ9c"q(36vБeR >lEX.QKL@5B08(hK7g\FIVa4B\=ް3G=Ǖ:JT7Zh&O&Rek,9i+e =:E MvT(ID[~D6Y+h=Y!b|NƜ${x̟^BnHn8(ၭ p/XmsXCڶ5/,T8AlX*9aʧKi Jr Jpy{$k=TI$>pz=i/rnMR2n+'/Db<Lz\7{r3Jg9:m>`bz{d!\yk/m[mIS#BLfB0 x?25d- ko ]meΊ,l6OҲU2'~;[*=5;r0(JxNN^ 32Gv9(DR^+^؝cVM0ld* ;-z}_ OG4Z\=5e} ݡ H hNQ̜s/p념GFWt : 9_"|/> I]LՄgǞ86  I2E𚆇BwoČqKfM ;켶;$z$ȡ^}צ~-/VU& h]36as&]xzkI2 ө̉bafR>HMFE *j^jKРZ;RRkagb@AsZ!&&jP (dy&!C!f6@RI`mpғR,lm9OfȕoڙE( &԰sC#1M`ƖɳKJl?>دg8Dn.(F FԷG=ZH6/~]`PGWDN {1Mş9dQM.#)Gм҄rDdٻV&-ki=vTAj=#dG~Jz2$ys9?%~8M^_]L۸/"$: )H)PISpM[dp+x=pu{=4ܦ.tm)Ҭo4Ci0SX/@LFFD7!&86f==w#8$MqPTS\ёĖ{d/Ya֌B6soMhBBTȕQ;7 ,[Ffi@.dG|dw(̠wN{e_ݙTw5Wȩ`V\Kʑa3g'[F^>R)'G`rsfz'և` ,JZigJ{di*Jjs^Ty+댿k,N$Xi[lNsexʢpԖy+eWbũ\ICҺZzTav Fb]# aw74Ls,m>Cx(6IS5y) ۾ 7@ .>'=J/ k JV\mBԄ9J >v1+꺷Ip ** Ix:. Z"h2oJ @5U$i[} cRQ;Vɮ͛];7XP.xjf+qj(͇^) *@P Гy䲈lа%Ƚ A XXdRy) lO0*79 6ޕyخ/,>v4G{(V?x*T~O?ٚKEܡ~te2/x(Y+`瞻IIR7g:^{^rוBɼ9O|̑:Mhq-VKt?L/!,)-^umb߆ ^#+%6J'78/t<ՏKl4$țw/kO,=v'hjP2 āqoe*oP:՟eZ>aq *PaFw60p:K:7Z]Y?˗ i gR|`zd/uuҘe>cVݒ_ԥ%؏.ﲲ:?-^lY3Rum *w?_(CiU]1\na@&L3ӊQdg+!ŝGڇ gA0z=&'D)=ؿdN'Sxa=EYA`E`̼_f6!Y"? ۹[ kzF:1.:A HT}!sAy=rJLLv9&Of nu>bsWہL)0KZ38DŽbzED<FD%гةX(u?@MH'M8zgj'eE)l+1LB;;ʺbٿ2էv?,Xvp3ցr=\x`X a2j@g`Y>b5F( xW%QA7!#A.)TlG >c0R%R9Xi>Q~tJTN18?j|%_cUC% ݑ(+ï7>E"[S̼} Wz;0s(+Bn/\Rz˦S|bySñ6BQu?>86 fl8ewN}^r Q-)i7}wlf;E;K.{Z$:[_о>qQ# DlR Pbj(sm@?{/sr]T]l %J] ǝ IDN9[xE|-&{Ć'ch(lo(V6ᑫAM a)KHM@̽蕳-ekq*ɲ| 8|S=-h@8> %hu 68+oɖ@51yسФG.]C|uX|/H9¥%Mkڰ=-Y:D(+PC*W L!G!?"/8llb8uc?cId8==vuYy/GZ( h/ǥۦ^sjڜP|] ax&3FTӅC PT Ef&+mFs|[mMfW;x 62[5`9IE8۞,>HTCsʾ˱ObT^GZeQppJܾ ?ac6" ԀY_-8=ϐZ ^54F s]-xpn ]o' } 7ȈO#{T+?)\UoI?Tsd - ] ]VA꣚@ཱ.@gLx3 k gʶi)2j+<;fkA{\Aٲo&wq1fr#gX4?z|  +N|@8`=J)ۇF ēBO ۆ-ďX58hÜIj.dXU 1B&HUEʞèQ^*Vl2'h2 Z*TR6/>vhާ{.ݦW2*OY|-ё%-y |$ǃK$Ԍ5@m>yfbLVyc緩u, <i)*%MÜ X- %gQ LW7Y#>TbO]9UUgmN֭6&̴dfL9[Ujr6%+ [3 |͡ $. 6ǐhO'sC| !CDFμPx=oǟ;#4zi7?iI̿+{0NRG~ۙT)RurV\[bt7҇/(QBCQaQ4"X9/xURړoDi> \U }UkPz>[*. ZN-#IM H2ZJa5ڈգhwqըGu %1\ 񏈌%Ñ\q/gs2J oRS% ض."uE;8 +W[l,5ڭ

P"ᔁ#Y[6<ϳvOujaib;Sf)Fk-SX_,IZ<>f5ԭ89je`} A}GFjՙ?牕CS]86NL;QS.?CQg B/AnG+AUKT Xn ucF%6Co(.y "Oo5O!n&K lK`L,)2W!?ehˠCm}X5<~ RL@ tO ܃a7|(R@nΚwe i"cG:I@`LFtZНoTqE*fu(]f냭 N$QWBрPe$UPk_pKZ[34wgyu՗iljzc)F,;+|Cl:(a< uԷ"^kJ % |eZe*؟-m:͂wӶelΦw?eW" DDXܗ\XՖm՗Z!2,%_D +Qw3~V|ykA/rV51Z'rmAdnԇ-"T}&Jiܦp*LBHX݃GPa5źUYExV_B<әh5 0@Sx2z!k~鸋~92h_G[zpHyHmmIFg*;onj> `C<T-U9yIMb o'K& 2ҭM .`ju$ԻnVwb_HD+$aƤN ij9ƨKva) ׾Ja2FBN1cϡW&ۓX(әвpC幌nn{}.  A]@QY+ɟ7bą! 3DjJvl$KAK5ȼrJsSAh-UaFUt)m5D鋣xQ&\STmDͦ-Ţuo禤3X+ OãUxWMs40Dbl91 |mG[uF\eOU ?60et^kK}jн+ lϊ6H>1wC Jt=Zbyp>'D`cݒhfN+ quRZuQA]#^%u~cRZM歩cIz1qaRcz"aQ",1[_o"lܷ\c?]ǮҦ'kʕz|oHlXANL`ABP.f+1v|ES,P"T]vM\ɳn\2 ^Om;MRns7Ou~ӿ _j| KPG9^JT 2}/&݉ʡF߿Wg 6Q܃I.ʋk L:Ā{g6-N0Z~z=qk9Ur#9Xg'ήCjG֒om~K|}{Ԇ(]rnPf]~3s!9ڑ}k˘1₿Ptx1u` HYrzj)bQk<'88?񲒢ŪGah}>vrI!V|4"R}62RL'kVگUGl츝^ ݋_Q?fiᎦy~/}tPx.MO7w o$oB`ņc;[m(!"|1cF-FL)\Xvp6Aieed6@q0qZp0<4agC\XUX>SMqTBݪ9\IyN%’RJg ڈhQHy>йG^w(a='As %{1;Kr Z i%@]+MG{lrw=Jš4IZ=&lZS:%:&+M >D=ymB5PI闔'^KW#"(Z|ݯâjfM2gj̵#zS^#le՟#役Twn3 8AREFGB2li"y1~&NfSej{d7Y{'tУfgrGSU4s]1+c ʃY}'CI"AEw6K{^p}?%jiQnz8#]&(zf}^cf9 M dSqJsf2N 0e;J[46An2=js&< o{O?6*g mӓʤ&`if#6Õ_ oIRhUݔ'@quw'V1l$ӕQbuSd9H4nlRT7ɺuK6i!zr4/e± llIJrswwU ޑ29bǹZ˯(#< UE UL7wP\2_U޾_5Ib\ p-Nΰ@o[{ ?->;' 7PqFAAF-og9DIXmWJԍD:FB}ژW@ȕaYV'b [0_%)?3\AՋ_GOWí~X)=X/Cx!%mFte܊O 뜤5N8\=qF/U N)d>%.Ho>~:ٽӦ&N1_!#:p[VcE͈Jݻ@4j&yh!jT4[XBʍqH>(H-Pb%[W0[ FSr< w:٢O<1ؐ6{#M֓X)S;wqC?{+Z>rb/%ɯj."d7M3(Yx\bF?e:Nr iy[k:9^YP]4yY.o0!" XQ0qNfѲ31 ѕCl76 nepO`CW26ǡ\ɻaINR/p2>TREX#:IC뼷[(}Fm7Oe4ֿdZPVu$ ZfKt1a?Un]V>SCҎ9ݽح|.Ifߔ u#-wj(d.ZI;QRΝMD眄 )+)uE x'8rK34 S)af6-bd<3{?x?WLoUHMb޴ =+S<(ZieCc_ٵfHբgē-DMV녱3f/ f!%T~9PyGb[8[7ʺ2p1a,45{kxY[@E$A]?4 m *-%>T2"q{ڣ&Fpcf |)-%|X߂,ZgyBST90XV#KRxzqX'b{*cIPYܢ9~,/櫳H)PZ0 j=!|)Ʃ Wm hzVM^(‚!xޠ۶2ef NieB~+QY@Hv8qY{TCOI(q'ܕ5JXU8\)rA)i#<E~NX¸̸ H~%4N 54sA2垐E(3SmmWnG"o TJzwn31(xzb%GKe$RjiT;~%7:CvnoBъ‰&+O4k7Ilg?!mNl=-XIE 6oRG]jNJr;r;vykMY=/]G&xx3A:'mnhjb8#di lk>yEnET@ZxU-l Em!{℁]@p¢kay0EsڹR'ߒ)2MX}^q{yH,#=$gri[CZ|V"|흆Eb ^xU8 k} i8Ҿ{&"ඝևPşGvMќ&EfS E F-sXRx]q'=$ Tl.i7$&1DZw3% $I~#tþF^ǴUqy޺j;XEUmbsa" 6uDQUCvMbqNtIl zGLnJ짾ViooZ]_s;˘آ92/!tB <. _}0d4ib Wy˻ iU`=}vFE2eG%*X$/igR%dm؊Z#研qhX^-(pBpq kȹl@r N?"6E5dwA-^jW1Z.l~X9Yl2I 0D(džm0u,6=kס[RN,/&l#D)o$xSCR3?ZjHFGMKRv g+WVݩw:T^(&B4$ ~r. |<FoHS8p+bg +R?(d4cx4·aGYԢBs#k,eL1 Df{D86_?D!t'W}kWlkYb@tF|7djvq?{`xHhp~VezyTYi媺P_`' :(28[)U“X^Lg`G ʅ`6g=zɑ)kUߐYb"36.!/5DnkeIƻ4އxDLEۣ"?,&}>l-Dyi#E*H so(:ܰZ΂i)r=)Wh]%{Ut+sބGxMۖ94;f{<Q햊_Jopt+})?Y<}"LC7yhQdIя %`+P0eRqw5xYa`fkiE($-LdelJ10~Qs }+j+RVy`1C*gR*DB0 c/?^{107Ngy۝N(=9c,1J vB6(KAom$Clj JA!N86]FBZt**9X?7Vɽ~4׺AĿ~N3)dt΍ ooh_IIJ} T%}K yZ;ݼ̄|&ȍvc|wلh &{YI!um/jqw_kw>a)Pæiyx(=W\`Z~lS(0P('hSh| f'QϰRcs<4#ZKPͯ{L]\u#~[NFdxшًsdZc$N8#^v_wڪNG(6')aQ7_Pߡ YVX뿣*+D[t3ثQ |ȣ]`ۡM}s!J-.̓݃4\ڲ-9]g'}^cTlҸċB*< ~(_'=lElCZ[l`p VO̲y-qth>R"(:0^[{Roc㪇[um!F{D}?\_Ղ$po: u7є}n(l_|iVpv^qV^0a1P>w &:yߗ[zA*0?PfIOʿeĤ,Ydf5jC@tgOXE՗`iΘC/[ CSy0lh_7)Tbʕ}CaQm gH"YA%Jp5J/ҋ@X P2?kmԦ}8 ={1 mr]A[|il:Yϱ:{޽gZ\k&P #q:Yl{t`4]CX)Z D_NpA|K ,nvL%\Mgar"2@6יp 5Sc>I"mxeJԆ>:_RX64#U9/ >/F0Q$*Q ʷi=hQO&57T6h8̎)I/+~8A؟vfV Uau"ں'K)=G1(ؐrrgh#j-r2,f]Ͱ%dCi}.46ɴQzEcR9<z? fdŖvu=qef%<"gƾ1\6F4[p'W],:T<6'gI&sO_*s6}&֯%q7AOj.Ijx@YF4to &`0V&15/WzXk4s_١%_!4[۲)lGQ6A*agwDbU s q74{Kt: caJYQe^.#vkz{EqX3q|e>2`bjD. A@C+xC!  f/&PB$wXy;/Áy81þKEEѝM`޾ْ}f m^!""bg(¾-+'sJOND!y^h'(9OuІO&Sn^a#e3M /ݺAts+ǽ|O,.,j$ӵ.ПL\%rj8z!4U,o{ybˢ;LV3}f/ފ/pJ fQ  wO19N-i])W(`A^ی QKA$3noR^*O88; R7e4+0 <6*i|}9 Zu}+f9^sjA *TE?=; Pv"nN,ꎟ8~VS!gVTOY>1MDRKT5ӄ;vcmsߠDIJ+)yfcR}461}kTT ޿ }nɟnA?c|@T-O׈%^exVjRK'\*hX5,&JHCTH`UƟBnu $Aʇb#:]—=u"f8PïW;Cqv&JLG9‘GhI fNudi y.i R+3<;_kUGD@K"! ܠ,YxLȌ:s8Sq'C ;7";NQDk{tmDmi3J+Tt>(M)@+4j`3vOGf޻Bv_u-,ɝqT]9x'륳bڃW᧥()6]WԶz0W<_#&ӡeGR% '[i1G_}BZ@,]o6b$'p#OO#WW^9G@rN *\jl]C1ѱ<ܓk#!2\GHT3M!)6D&JgbM|f0Iyj+ג &EnN* ߽a5]lRJOg@_9DI]ES' zujx<9, @c`p\ IBuUL=uq}P`|[?P7|Gw2\^)+li/ߎdh;}nI<Ӟ5[ :i= x>@K|`%ú'4mkiXY weXWtcnHI2ж1ִa%yپ#Q+(߱.G+3x$!gLOrY\%SƆcf+Z\~uV[@ߩ=hە.4Vh"~ƍX2]5`"<,DP\LVYOSkvn4~ "ЬLͪ_Υ?UMƟ<YYoO>~sx/*)*'%\( ע2.X]FپWr֝kr?JJN?P EPZC,rU,Hߠa^*o4rWIpaC+mF:i{K'giIl7+Tӆ?q1DƱ @;V.x/J""\g56ZאlXe69MBv5^rTl2{qE/3I7D@ + xxQ@n5 &鷃)g=RƨbNI='oiX:>;-:ۀ+rǐ=fGĦY`>-nA'E }7WvnS6)(2VX;.qL1ydzTzI%64MS I>9DW%HȘ2r ]T+kD^%2(o>ybi/Eј`l͆{J+Fl#'@hRJԁL1<.lKٜr9v KWP!Br5_נmUf(;+,9q#U=tcVY eq({E*y[52D-\"N:G'DύVA$>Db&BC ulCt$9r6L+𢻇ryԊi,wΟD]ò/Kǧ8 OϢf(+z[D&,cߔs =%8DUJ:d~T܀ĥ]ޓ7򵗋&m{) K~ <^f/~[LDopȍ7ĂXiIH%qRDS2@CE28Kq5!:Bʒe?$,񝡿;9f bnv︨Apj:qקSա7㺍6Mݏ>g3abhv XأM#MfAAiɂ, rFn[ V@ zT_3:ת٦ k&K٣D$,'I8hz/cFŀ;/s4HS/| Dk,57Eqܩu%pͩ 5r<R>:yݔk^q04P}x.OX}>!i m@Ю} zGu/bJ'iG/]@@TX~/ͱ\U@[Ujͮ ogwwI4~˿vK3IF#|+M39Y_^o=ws,Zr` ͅNX5ikK8-{?AӼc4T(F`Ku) e!äɴ. 6AV$3[=3g;ИS{Wo ׏_eݨuo B#Wl~RpJt)pՀA**9f`OU@l0 Ak4Ъ>K >>RQ[!.3jg b窩9:9_|6nɷDXuD_Lbъy: M%%z&!ݾ#5"yRnb!ȽT^ag ^) C/T8(eL .&3NQe~VM,L:-iʒSl3s QKfO$a.:1H/qt>?QσMdʽF)Ic40wKYT҈ BW ?]9Ϳ' ^o4BN [6׵( eL4J6H "e/ -N>ie8{o-wHqkɊ˦$o|6+B\X6? MS['8qߦ$`0rѢ{լJ B;߸osVlpޘ:#磶LJXjq]p P"ԮP03-8b7ߕ'd{]r?zzuYB+,$+=e~x̣$~3͞`ڵ-Z'!h@r *pcvL6!&R88ޛ=& 3"w*m4| `.ߩ tcYLF ,gHӂvQRzynU47 9 I>1o% HZ>T5xm;Md>M?X"}Ʉ-4Rk-5}wd3Q 5B"շY~;hR߅G a]1 xzyt /g :Sd}[ \JUK\ũܿ2/.I0j_4+|r\UW].[?tC X&r\i)e TMa;xvayEx29t.%Rcu%ӯ)jSǻCm}SKZ$1YZ,k_]5Bq͟#~GI/9Ƥ BeTtT6a];z5k">Zb3UF=+F/lgl>=χcN-ǹtZvYX*=F8'>Z|jZ ƯU-We3n,Z,@r3ilmF3WeŸmlxN ?_M`\} >JFo:fRIE&@~FnQ WCÛ-1L-x'ӆϟ }[Bpsеڇo"fVjd5MIp?w1zQ9ƥ*y!b=Х_$-arcwV-Q_c<◸ F<*09ʩP 6[3V "H Uk-/?@unՇdn[zHRn*^*=xw<4o#ԡbH(Fo2򙱉bOɢPJ;CxԤN1RӁ~p!̦xLZRm81P4>P<6]BOmznȵ}q)gv JP='4L;[ M5,Tztv8$Ƭjnj'67t X5UY'I+2, 6QI %Ncਯf_꿎J~I05K8ٖs",i9mlj{o+pG,'52672{gUfȓix_(݀xLxJ1"Ŵu)s: aX>vHcy! |Y=P[`t97p#8 "Vu؉ *mrl#$ mܒ<9Og5y1i#R @Y7}XζiY  SzӼAlu`==&aLjO?L$jDr >m>;dO5?j e^\-{? |?G C:%SuEIφϐ^`΄m55)R3avt gԔ0*ob%]1\/MIY^}d_[V ,!dgL̓ Y؀9Gbg§T b7l82--Φ n'%ʉ[nYX Vg_3|[édGFE'VPqI%WGA8_:g1]i.ƓrKV`60 L5cQ|QMY۰UI1=B?`9$x&uQh&AGLZ%Mrx!2EskB':`u㿛1@s Ly"Ӽy~p7\KU :d*-|9MnjBP7Ma_kgeJ<8?D _JejtV5۞~.dDDi$TWz0aFװ#_P~o%nfYrSY [k?Ggyx$gR% =[|u s34P^j>~R=5&K#m&qcR^'%9є% En#*^j,;UPyQ)S@cc2 EU n^YЯ쯖_N2̪GĔ_oB\_:h}G0\:HקS#ֹ>]ͨȧvRoxůN+Hc-="0.(#x.ԼTŬ0)FpЁM4m c1ii 4-_c8'Ѵ֪,Cw\d qdCIb`p tĝl\Anyͭ=.f$kjt0мtOjN+l|/o pEaImQ^CCKh ;=,٫44VdӚ% ]Ɂ^8q8~N /o&;`1#Rl9["r m%{GVjPNւ|28/DbЍ >Yž[,k{8_`|,WڔlVGh %; zM5s)%?坅s_% ~lW jgfP*Uܟ uN S'+.Ht蘮fz_*qI82^4?Y' 85d+tUYvp:k&%ˏjâW,sGmJytZLƦJ=s2:,? Vmo* uwwkE?5l&Ct-*q1 <2"bȪyϔ%VUs%\wh!gw#q^V HW/\Vգ۞ix#y9wOW\UH0gkGSX_pBQ08nCT1K)o+㷵X SU3X| J'q|K8?ӚԲDi}Ac-se`_3++@#ڪlvD]K>IQ<.CX fbp jd$E eNQ(ZZ>l?Zwa3nUWW`r˿w& z_'I|'hLWb69]foHcqLwSZ[AD{U~UqFPfx( ph} IExiL!ë+жW>L4eVJ7䗕h1x]&7eQ}irw/CށiWD^߼AQA6:lPp:׻Z&+L"90 ż2ˋC}ԭA??%o7Ҕq:Z(GCΟp^K^E.z.'!D4mG *z2]L:l 2+s89] yay%͋pic62'::T.#cTk 1[_i_T%NSf?0vRϫ&*fC<wP$IzC aͣ#v4}:}nj B.ODq[,Pu7C,̢(i" SA(0 "]c]R1|NAH;Np >ƭyd%Ϧ %uq54lo}1z(ջ cn HaTl?rގ"Ah>Tf(r8DYn$"- |Y,vb4d]i=jfE;VĊJ:`(#'iMdNΥ(]PҀ'|6 گv_֭DH-ev"6֏cRdqI7+#GມYѦͿ?e YB98@#TɠSl93g`pGr(a{׾_&q} d̟mR#B ΂ ;k+T۰Jwml}d̂ѻ1N2癵 |w֩t6⾤q!IB@ |/ H׃{I;ؠZ F_,DgсAXjM<+t'u$6ytmBG܃Ȝ_ɛN] ^^D>eh #X˜u:u26>qS3xELd4>rs^`1k\5r*3*B *" hc.܎[w'K`܌H_h r]a,MbJ]HgPv @\J-)7noG@5}]!wI@wO NZ 94jMF°;RۀaP1>6lRg~!fE a{E8x5:S*Pл-WuWC&:@BZ-kְ3dq_EC]Fg4QTkFS Dc(FtD\B' dW\y ZO'N']Il7]eݩjusg1#L?想o A32Qx.T3bZxx,#"lntǖgL0OpTQ:)s*Wݯ}i&tѾ7cčԠTCU~\(=>!r]_j_PM AꟃxAY1LemAfцv6 v ,☨_RcDSňh9Jy?<9Fo`_igX[(\.˧35|ү}qoRe~P: T7 7:S]D2ȺfB —=^ڄں-c(d= ҥ*$+-I̫{&[K+Nm]\&Oyt-l(,!"=yK]/,Mb[F^]`5c6~m b R7o^[DuH&GBʶ(]?Z2ٵDojzKJ rlJ_#$oɉԟqxГi20?$IYғK.!uO y-8#8edZ]4t'Teu`^'pi&Z*XŽ|'\T!z" Pkp|@ZV˸[EۑC >̭By%kKKju‘7-Nor8D1dqΨ)$V\̥Zycf,Yd8mZa^ =D}}ma4^3|}仑6.5ꅐ-k+UxP $Uu]z5GOOKI{SV ?FDqϲ+;*DH_k8]'B% QbfґN[BM${7NG$ƍnIeJKU!PpyP2J%{Jߢ%Yܑfɟ y¥\IIi1;*έ]-4o&.rQυ;eR؈vZCc*1@] xum! X+s]re>agWgG3C^:CĂXiKwcI.h\t@PLfEt$u ^M9]5Y&T4"4.h]ؼ^ ~CzvXAYآ!g=:ik x]9L|ٔAbGN+ wf$V͙D{V%\#f5Ur50搽4;~djsb?M$NhB0 "7*Ehz{ ~_tQ{bУk1a7t1xeyC1xJoFvQgI u4OiwӮՙ}׳%TYϒWŽ5 j$|ZXSJr.9` 7NJ^1r^>Y}0F%Zf}ZHs.noVו7K^V;`[O =V&.G1cA/ɸ18p 1}bŃ}aB C5ݝ-cb1z[7̌fJ.5֎0(؜mTpe*{t ɇ!7U^nUDŽ UF;y ogaui '[93Q`Ğd͛ Mm }KH ({u+$zv&-JxѨwx_;+UAvۑ jK)lqҜD,uoD!##% z.\Uc󑤘Vxe3svݒJpH"t'殮͎8hAyRC99r9U"7bO:\ ڸR^_E5c1OEJR옚;QbR 8p#ZZ) qxt2Aq)S< Trpƅ)Rc[VXPEC&r&9p|DT$uD+E%1܎Zn`F[B҇E-y&"h,qo:l #'dkKYSbf˹x~*nceIOН j)L-J-Mh(bpaxƢ;VOVҚ%˗/-n+WiFv Kg0{i mº_E )NtCjpY}wF$@9BvI$l*` ʀzmJo)f~Np {AT}t'~lC"B/EXEŨ'T[{?Ԍp|Umn`I;U[؜TLр}ȀylWB4][l(4 9/1c<Pu4(_\5 QXb{FrTLic^)fwշO#B^W$Ծ+J4|:H9 XpCJ8NY֣8zxMwCTF9RH.~~cnthe-yJm%¹ng)GY\Nxw暟#1}Yڧ8B֨k j!5Dg/c(=*>^0Jn֒h6æӱ+e2?JsB/ |Dt벻3NX\=amnhl&eٶ1~22ŔTؘJ1J4dN(I:zsʣ b ; %ULq()ʉj*Ǽ"&E;>(c Pz2)6z 0%-,z+l ivg[l/c G_1zzxH L%%0^ QnI/ɧ"~UATW`JT#xD01WCހϒ*a5n+FsH_*k) ʍ&àTϜD{BԈ|IPM>B '}id(e~!Ζ@tP69K!rF@x V &%?MDQ򦑟MSqkn^cLď7?aERŨ!C,lp(/__'Qg,%k-\lt>sĽ-p,_zMKc?S\8<[YCefpL`~@\o@goCNKؔ>"ZGjߜ 3gBc<ҥ}8n=B:͊#OD|t7aLk 3yl*{6?23 _tNM.bUX7a!5Vp-!9Ӥ~'OWO;sKAHEe` {`5˒c!M>(q7WA\=-ֽ*<8ߝl?>%1c%v0w6p-pLnzԝ9Hg]2 i#%)hVQm#')!ޱT2ѼH{ONPA7ėU^er0*VۄI꾸35-_~1-\WTqw~OvIsqh=>f;U݂].,.qDXm^o(r{ޯ 66$]_p4/xi Z (e,wige;=B$F*Bʛ>6ǚf< |H́$=F~ec P@(+ړI%OiWg vq:XNZMsErɆķ"4IQ;Nt#^̀S%I/_{:L8JRWh4XL{Nڡk͇۵l+Ff5P-ŸGx8Om{ 7쾟&'e]Umz6cuW\#r. 20-g6V2"P]S{؟}V]"C%|!k҆2aXkW碴H D=o }ݬh/.̑ ȪaI3Hj*9 *^$na*p5rK ^{le|NhRVCß K%pQTr'~}X(S՝8D۶p; oY˄q?#YMl}֞x3 gv&%}UX>=bq9mZhZ!5Vְ>8h=Mi 밽őI&*V9 1fracgT]7J);AS]CmQ.R(2ÝPpR$n5Q0݇V@ MT\ gf[!ȀTd{:rek뫉f3Rhn#t@a7p)A !wi(=2:">]o?s/e.f9Q&̕C*XPDB'iMT)vȔ)tGxkQ날,&'>k u'6Dvp7t3bFZErݟMO342%D:Btl)pAj+ܭ|pJA̚cz~s`g#:uVczϡy t/[bLgV)W:9I:.!B|CLwCyLP)G d&(~g8a!9;Sqg\>`11q)'Ҥ ywGꂐ[5 *7r e7WQ! 4׶g8vь+Oդ0T @UDj:  rfMpK'Nm39!!}2s\S qJ>_P6%+=H|bOppSQ0 SWm⨵jFR{!jtӔ1i7ڴqw^t%i? |,N IZ¨Y'VLcE|cU,H GO W9/LaLC yN'̱jl4+`"yw!Cʿ7"K^Z.";'\rTChZ\77E;Ӳŝ-Pځaג;->Yv>ޥt- 6=@i/ke#ћArL?߷%H,3ːF±qvҩiUyXtp_Q[b;,Cej2s-}\ m2Bsf=UfhbbYo[Pz&~&a#K!DVLӃdž'jCS^Oo΃Zx̪e2 T U^;]_+A6[Օu20D4`Þot`o^S=>>*ʲq̽lıfY2iڑ{^ՉtAN2йsHK>`5(ߵe5a ] [0֕륵| xiEHw uxq[|GêGJw<%쐥/Q+#JI098NX _>Q>%`Fk |W,N?N $.g=w3v"]^C΃3vnhߌ|sI>:7Fv!\f:a %Yex %f/txzu!iVW Mo:%U43]>_úl?W|Y{ZX-pnOCp~)?,t~=v$P%9a6+7&FZ?JٯF=cMѓ$$~t>ccfv:DU'}68ihLK-.T]Y),G޻WwvgE?+Hԣ`ls{B I )CEˆ<0gnTbC#-M?\y֥o="H,"2E-D̔ur>\f w%PemQ)qQ迲L^ 0n{}Bk3?2ݿ(45 /*{lcq6uu%qT~(P{9{Yx"`qkFu PLru_] 3v@-}@Bh*.A[|䵧/{c<7/K KyU%<=ˏ}DjOVn+8Ժlo{ ڷtE!f/31$rCKn(H(;yS!>N!M֥U!1Jb@nF A+s2׃F1"t_A>I!{3&yBPгƫv㾈?a([C ncj3)r Տ"lm*]1ϬIUٓT:L{GB̤t,mJE2XAnir-G+rz0~Փ :1; @vA ВsS::[aFQn V#ՈuخFT/5 ;dV8f _8*|EjuJM\j#d6Jrf~Ϙ8$F}o _KuXHDW e ?pGrT+C 3YNk@mq~Sf%)-UwvEX~4ťg~̮$\YKM|wns3'pbP>UWz3As),iHvOl(/II 5ؓ EI0w| lfo+y'p̍\KWǶ`T(:^ML-'\A{sSKjo1Zn]L]>`z|!^c Ɣ/s*?Sb}6j)&Wy>!}KE͋YVqo\vX?³6qkXMi&]8jb/y+/ŀ\TǺ1u6|kDãAmE"̐End V QSwO1fyM$qlڨNV/VQ g3vrj.|DBByº|F;c婻D]O[5K'Gw7H!Rx8*ao [$v>=0dL-FU 2e-xWN+pW{8y^5=]׆{>mf^Pbso˟I.D+X)KƄ.adMu¸{;c(:7Ddv'@o=(rU`"G0힉D]Tݳ\7,|%_X;c|f]WOs#X$[am{1Ia2 :sf_˕}D Ӵ#Q6%J{嫷8 a#N&ci/|1zw``\\PW_qK[v KD:TvWI3dFL2GUm1K_փ '[,V`\XA_SVEnU wG#\p*C>PJ 8, ># 1׌~)=-ti}m.jN/q oCُ9'GZflԉ|Q& wh> ;Т#G`|Bb)`6{1ۺ 9(.$pJgnm^ȦsR[RяJV_!$s< fJvL-D; HX,ѥ}3J  nqCJ|b'*2e4/h;,vh27>mXDsy=PgMi/p巠?,.KnPqb$҆|UuckvР|WbJmedH9xdq/kg8U)&+z>7f7-s 鯻kt=ȳCV#/AŖM~j g. \jn_c٢y %&P0f)!I.IG e2(9 $tO"bT- :l}GS!E-ZuL-cq vC.[%!yd{@g=2}bamY%m!(~qf-oq?րD 4Ѐ~;j:e.O"6qx7 ]f9I-KyHa]*٠ZgaՂ%WՅt5;2uː:kܨ13:cwmkuh&+.oWa"]cxr(=u Cף\!g3^+uq\T^\# ۏ|^~}٠*.d{D-0U'021ĞO@2-6# uLv(n0l%-;NC9߬'Awn;&a*|OTQG9w,.>sc6%<=d;vNtD7AmC[Q3"T?|!n]茬8h/DdRaϊm(QV +ru-j1svDn cj/- KFz4 魲_QRmK,6HӋNNmHm;YЯ)(_0se?:ּN2Yyt@$T")4X#,<; 37nE˔\j 5g#Nao= 븠Ss쐥>~R0de1+£eS6'u3 Pjh%`~S6|e@o>GXFp{%9ʅ? Eiv&#dA,8$*Cj;lhKXIC ]k>f `$v:pոD7. }Fc`tͶ<^0rqnIc"{=$,@~D`/ 13ӱ1IGD6xQt_=\u۬7ڍn 0Ea8[m˘"sRb}IQc|´+c?fzJd[oՠ@}+I 3mhfÆG;YfPB%\.:rTrC;qo r|4uV9!ϺiXM }&ܪ>soKF+FӦi, ʾ!n`UcMԆt΀bZ4S1Yc@S$=YqD4L wM㭹{Ru PLkMbFyY[, A&6c]ϑE5)r6s gN&L1#}ŁH͡L=< 2gk :- "PQ \DknX󞽵욆-HH!bg #R|ՠg?OfHm+Oeu+̿ENR_3QLa3PnHavpC$@rtkJfZYIJsc͖rՂ3Rk>`N ˵\>w% -ia0r{ %!Ir4|nA9~q#%tB^)/hW'Lyfɛ,$Л_Gxzl}|,9.k>H^҃P@Oq|ŷ[K>5%.iDldUn/^S%eK5YJ]PiiYX&XS8W[UO줾=jҘ ^UH& qUV'ś'LUzS {ʸ}uF`i܀>ح)ͫ;nYioUu: ӎQJaʴ:8[o9##irV")\tl9 ^iPޣLX _crOZ@(ը'`MY 9;_gv?mI#ǓVu:.2cV9-7$9Z8ŗKcxi(ʗDT;9rA uR$@4>j@ѾhǢ;"ΫV%V (ׂ<@;1 l#Mz1YY2R({ʏE1n?dT2WDk?Ry JR(Z8 Ѱ-njrc5y)Iqя6xb,U,p-*A9V`8xPI4wX)i߻M1[?mJF,BAQEq_kz'5,r. bG]%!>miI$(gLmW:|z',An|geM8:bp5>-dE'-pmP葜t=>r)oy }HYKF␆>HW]ӛԩ1 ֺW>I18sW;2B_NTHnZ{CA㪜jJ:j?4a'btzQn]>Λ%9`Gtk+u 礅JaMyl @h_8m=$ֈiƨגaIWopwjmbJw'iԣ&7 ֨16`0(˿1L_;:9Q%Vc2WxNBc葑mZ92u*e Q)A*jܦp'B`n/}Lv(BmMSn0xBkdK%W@4|%ǎ >tI| 5xL\זY'2{G(~& D 1[E7!s`!v](ӗv< #Z?u񥋴`JnݘD/*%85"yZpVሇTΕ]4%0Xܚ=#\4$Fߏ`{3sM ھj#.WL`hPѬ4ibV%z ӆ떾"YVNu0cz>\:5''jRrČeT*{IqőMTDqH78I 6_ @l є)>sROB-XƱyG|ضi&4Yoƿwg^-F l/~;J`ԍ#E1r}P堇؈c$ ޤ!mb$ay3Ybj_' 64bVc3#cwLnbt'QJف<{@(}+\-\b E4oZtl@/^ÙENW$=7d+QpMM:g6x~w@d ~잗Uf~@-BqV}.?gZ X\4衾 !>VSSg>L|z~NRyMaD4F̯zmmy#.IxsDVgA$2B*D%ƕ!i-{]c5)m:}*HJ:K.IEL7`qƝS:L`9L90W,zū-e>ʃ/tQ ۯq0D)9MN w첤J|o`ž< 2>eDmyK)*wV*Ė=۾.f0NxZ2Q'@?Ѫ;*)^/đ 3qudǷL%IccϧT{y BQ5~L%ng fq!):CRvOຂQ31nҋقV𽄊FJvF ~*^2RAOO/=:eM}c6ncҀ`}}88Å,GKٽyHv.Ǚ@Ĉb5* #$ǣ:c [KF5ImX퓂g#`İuDN2mιdٕu 33pӧts4SoҵO^,\#Ŵ5b݌Շgt."$FA:̝JOge.>yuk?;\GbЇΧ19mqҹ,YrNǽ&!=50aiĠ`Dz~!wv<ri|2xxA,i\`|5祕V[p/9bv%~Z2ގ0szl(Yhx+F vEd"Q9d{eDy=X6keRwe~y=CO j`61:9ln8uٷaN ԕQ;TG՗'w3 _2#/\,[ 62sCty"ޡ6ж'u3Wq[iz#;g1SVsU}e:Wp1`j8DZ]Ìr㵌z%InMD=Lz+߀#Q=r[ k_YP_a8wE!;Evd.SQ^1frx+.t䛡u͡g.o~D%IR+)vƾ*M6{.m iE:4ojXft˞scюX!my**,+0Δ[:7&c8 ։q!_&2ac`$/ﭖMP`|J'` .(S CxLc釯XU9mn} a@b\4% L)΅b+T7:ijV zmƹ[ħ^R Vn%q{`$hu}FȦ[Ş18s#w^x刹Z3^zKfGI{ȁG\rLҚN@Ͳ86;mjр![v1@G)2R (1Yߞ#2E:M~Ԩvwp˭(RdHԱiWcu,cxPx靈.l{ho,SC>!3ɦ4xJ`R:bѶoQt{O=o+@L7Y[C"o_DIٚqV^zreX3pZdOw8qP7| pq܎hwy~DX}:ů{Pi,XA5ҶmCR,fnƏ΍6EIhKJ9rrMEF-w\Yv& UKlwN!cJ &w dqc0Z$ZQb bbK.{hG%d\ q;=zpC0)evNm4z١Qh g:4: ٍH_+=ʩ%/bm"l.aQA^}$s)~qbЄJgƧ fB@2-CYV)|va;X{n Տ5ZmԾ5[dtlMdq4pc04vih!O5wE,O-%YsP7VT`oH!$/!+6.GJ\^ZrJ2ר3} Fozđ36c(-F"M2v2%/@xzr冽p+gϠDC̙:45Z(a7[6]qB,+TW dEla~4CңgCQwf^aBx͋ F⎲w-t\Tţh\c|P.IpfatQ<@o6Ʋu&~}@zK@BYOOڸa~/k:G@QYlf zJ0n|vq基-bNaFHPUCd0cmN`ل3Z2uP--Tbz@J^j? _wVΜr"n(t}ӉPK8GN#g8t%-/f0jq v?4JpFٺt-![uL4'\V6-A79f _-JH͗2V(* E hy@ HbmJ\[cK. &3i1e:f^+ tK.d|l )0[6zwJy j &A&T>ZDqu/a18f`'`׫<2J8ڮu<(b.DuȝJmh#{i:!C8X=E݇ٗaԱQ& .̟R.:0kZiv.>`OEg}ҩ@,=pzvŐUĮOY$3h*37۵'l1%oBag'mqEQwHEfq"M1X2YٺaZ-:e kJmrj_{b-tc*cA5%&E x4 '\ٛ]Y c[  iunlPh֧<9+A{<0FY+A߮fS(8~>e@Xžg';a),518zjL4+ >87‡VykG< ai:'#DX)9Ԋ #h߯8@+YA{Zxz-=?k>Z=jG{Ԅ==RVs蹔v8׷=`鑱kA &qB|3uDlld MV%j%]Wˆw+EU)B׍T$5%4!5D+d GBAzfƌFܞr< 6똀|u_P?|8EvkOyCw 1& dG6'*>4GDrox +f *KP{w'bh&dIMFt)˻%i>g\vдHi3zn)iMoP_4L<^i-t:vx{[tt END^_Ρ`槉JIPnjsx)[AEUJp_W [`FQ!ʋ(4#chP@Mu 9ʐ-5&t'AY).A3qI=8)0^ԍ%D",yiktKP-@RHSu[,'F0Y.NR (=F13 ~=jYBv!*tcF x%!0SS7EFxTs|d«Տ6 yb:URX( a[h%{ Xkzol[zy%Z\3#zn'̦T\{BPS;LM 47R@j;xGݵ5[6a :ϧK=$KrD{A[])H@h۲Td3PMC-/u8x+3/^%qQ͌L\ dheQ_yA5RYȅQSx=N]OfkS~9X'`Bcыv9>ekm}G`ǂ8Y#}w©G}fIJC$8e~F ׀~~Re\3}x},Zc;zMT*$ R"$v-6^Yl&BI#8ma|~6ژFZ l12PAof:UxrGN3'vexCv #h]N`yY_[c%|RJJ13=7 hw`)0愼H$~BRs1oBH7U}ފ٠^_'B̑̚u)'/kD&0jZgΰ޸agni\/KEڜrE¶l)$ΚK溢@Fvm d4QL,𲚌N  kLj[ն_ &lhptHa Y{+Γ Lк M ^kp? j%dFﮃx/JϠiawm٢k' -r+(_<օumDCihwcw%WV[M5:҆TXE;zu@|FWuyq`jLy--7;g l0"%2!8D D޿jFѐqj%Ffrd ^suʕvWUz%I+u+cǍfNg` 4hZ61VA ΞWH(nٚf|o$QjY=t pYbt5dr9K4r:oz{OX.X/@[:WxSPyyX &3Fa>g | -6HaBB -Ar}I+fL|}X"GlzxuBBgڊFkFq a.je`/"[L\Y+ǰޖm`Mjw O ¯dF L_һ6l>8]L 5bNxk+M疁UoӖ##6zOLNzDWk"@1!~DeJd^#"scY ݬiy*(RF>t"m|##zOFF%lU1J,!] ҵhYboua?zRykTdG`C%`M Foq5t7]c>nVhʵʔa?eR?|$@L抟:< `rcݾVW`OV>J.wʗ'z'¿'Q05OvTl6ߪ1lqDIuSYLHS%gC<,?)gsw^:~F2.CI@xNWӠ\  m2λb{[7FX7 b')߄/dl[">AѢ 8 agᕬ{l)nn|hR5mt쨝t<8WT !܋˺$#zm6M+2²%^+M 'q$g^RAA#6,Ȇ+dَ˩0G֕&*2 }֔ƞOW)Q|k;YU!eٴHK2"+QNK_T<0"ǚqL BCSH K 'q_0Ƣ]u`X+A 럹T.āݐC>ԅ~Q͉GOlvVl?i {[2s >1$90\/. 55\wƧfx%p4˜)OU:.r\T> @gH x%A=' 6YZ'>/M'y_lR$+o<2#<kmeŚA#gVfbg?5x+F=K"8+[ ǒ~5 viI4fS$։< ^%SsMG[յLՕ%$'MU hkUDlcm %٭U3,C` %̙\m"i 3&s^3Q)^yR*JW2f欢3 SMs%IW{<Oqɒ zB`yWC@w<UHe HNXr ֍N HB֦r 4y"ɘN6nt/mLOBqBZxBK\ uDl_$v^gL^d :&o`^#cŅU*$$Z}Ӂnu_^&"[Ip:{*<w`$t! MA&Ɯ4EW'S)FrIVgׁCH'cʹbS_b;Q&dc_@˸ #fF$y lGq(Xj\oheG&UL\ ~(Q S.ťC!v"xkoq24~_8~iqf}S_j%w +Dq@6H Zy7{F&Sdz~.k(}nzʇW0e:Р&2ufO|)K^i^[\=:bn:Z\+RZR$,PbSQt䢏q{yrnPPj"SPjخ[iZu:Ĥ*ESR"qyvET(rX$h pDr62➤n$i&~R0xvދ)z b@)U Cm4n8U  a> @pRZ_foZ_qZYps)Z@,Wqh1s1@;&{4Wغ% k:8Bqһp-K;! V"V|>A7ϦJ}ڹ/~bS Y}sj'IƪW$, Vq7/d^Rs}LM7bV9[ԝ:\3ů3(5ndZ y6sFj>/쩠LF,JăxTW3)RͅW}V>IT'vm $b؂։SG81 mC]츽>b­FxҴGqFv:q!xg6ȃ/+JUd\q_T-vAe8À &[W{ݨ켗k,}jQBDhՓO`=,R rz"AwN&g:s!iSZzec&ֹ&\l7&%,Oztz_BGRU*-ޮ1u^J-!Em IA/9f#զX~P| PVӹ4a(r3;\،$L7Cz,4 84U5Ygмk 3|EcSY$4ٰ4ʹ `.l{7!lliuz.[R[p Kr[4D4Ks rm)C_Pn,nyfC}*\6_.ziw< nG?1_`Gؘ`o}3ԩݎP*gxLɀ潊ߝn2ya#ݥ5W"݇&M"3N!̽؞41*=?6R_|J0 ^.C?t_Ky2Q.*m(NsЕ6r`AlE c <$V"5T77}4p/#ԗ<şP`f FuQ s^xonjWth7o ~U9'V;;́鮚Nlٻ>Qj~'z1rl6w-3MQ<.Ly{iNM<++A*^ޒ`N 5Sg(H t_BB(pW' (h[X֪&c))F"P+\"'/~-Q\e YR.[ Jl;J p%BKFelR֧{dWby(tle*\zÿ4L{Bn 8Nilw Q}l6õVX\Tx,YO=b?AI)".TlgeUP='ⷌL;Ho0lbvk^a&f*TjUNnLLJ詏 LVJ%"o`+7@iW -z`~AWB>; Ϡؕ2zcks<)ԩ4?%wk eg V @u)eb5>O[Hemh4 .ǀ0tk+!|Hb yWh_¾ѪrEw@韷?o㒺0" WE ݃_4)mKH=tCR "c_\o_#m hfGIOh6P D(ӅgͳQ*[-X.mr\t'xXCiAX x*F )Ozێ/Y-z soWN|CP*`>5RH"്Z*ՠ*%WsMr}a:?mkv؇ੳS~#/WDgR-ЄJS5@v3o:^X6,D&x*7= _Zlhs8L@=;sm͖O󙸣|htv\" _F¢R?VRL;wjV.j쁚ÅA{e"%Q8mZ})/5Lּf25M䒡QCO<J//6VEs'7vURAJ)ޡr0< to2BF5Gҡ, ~z}@wB-=ݩJl_M8%b^Bx\ ?c\;7mQ:'<}摖 .E읙yiZ/cd2X:flfG {My󲌍7(RX9̀0̜p W5i"^MrQ"d@\j7l:ClKC͟v21Y/re_<̐=,C ,$Ss+Cy.-6w}d-H'-I\^xIfLzMa{OC+ ?&陎4l /|cP}w2Zv%3)POϻ%-ӿ N Ϊi@S`T҂x@B$;ω⊰v~δKԵ=WhrRb0> ;"gyI\DHz#f Sgcv5g6/!Zie[n@"IaLXNn+_I0ڣL|6=Tz~dnKh;*rOUrrs^8H"n> h|ngO<3U){2)J47myj$%<\!2.Ւ564 =DCJHnc'Uxć|(T2aE ܇@v ,`k~P{&kʆ8^HkTӣqğld~(y#{}$/(T^ninDAA'UP,HYr܂rT ! v}䥞v~-# 8*H&F+c/IJ8aac|dߌ[¸^@ :}I3,gz)[LQk_,NhXTiyCMҐRbֈ: -x:3XBh4@`5VX|=I"K932 Fg =jAHÇƔn,*B@G3b]Xdwk>#7K=JxԼ5fgddh6`Q0G3Zb'E0 "Zvn7$48.^-X|DߎXz*gQWe~Ul vW%] &F߅@"r(TWNu4Ԝ~R잞Eg]fwMkVDf*:}42.M+m%8uż&V['xg";![Of03&qy[6}=Md>XQ%4:l~@hKa(MaTH8B!zBHiA l4Od]pT! 9Զ ˬj @蚆/q?cTyEJZ牪fBϦ#s.ӫ̴/ެc07q3R,n֕:bD=7* mR I2˅ #Z9h_d?$w) RQle3 Gdީ<~JၗZ!.-IhHe rT>[ S|q_Q4oq_zWI%B#fjX%ekn,ak69`k-8{ǐsƛС;l< F'A!9XPV!m=9Y+F [\}#oٯG9̞gjB.o qN8*R^e)"f#^}=Q|Gyi>ܻiIۀ9b.g2r'RtsW'XZ՜{}NX*nHo_N27lQX9,Ҳ'#6pIn@hRR+=Pzhz?R'9mg\a.LqV+ tvzY~!!}gu>Cô`WvSNA8ZBIpQ#26cirX-, n66_''vÜ)g4`'=O!Ĭ_jWNbTI7w12,L_9 9TB' KnhMD.KU71O&4W?U㍩7o}^?[g&LT=~t3VX$X ClP5fW _NUkpZm@.cI~rOؒAxG-jS2yc$eSTũ 8;BuﲆzLlr(iRr.7Tp0KW[8\k7[LΗH=q3 cgkp }LG @ _iϤ䎴+jL؞[Qʴʲbч|7pL\2eUuͧaemjkB~. aB-ˁԩӠ6j\vJnbO 9m?Qϧ~ITE2uoA}X/ŭ%Wo aVuD,.q klj?壟ѥ;db3rȍ D]~(: YͲT-\+kJ[ZJԟ9ze6\tBH~ tf@toQ+Vas{@/3cp\|qutU% @n}bOVBsAXBm jux3OCJܵ]nkwCG\&k&:qy8_ 5kPں0nA 1xۅn-V7!^ߗ]3k84* mр6[Wzg T~%hFpf`9x6`CAˁDx?Τ Rٔ,xpWœpx""1o$X2NTM'1~51L''UdbR)c/+a'> E0^ b%erS/9T!nTbEլdosڱ PN2~/:ݟ+;}498|$3b@1$·ĥQjmfI -Q\>ÍISXB-bI@3#4ɪ)9)3"_ EKLw)nX` I&9ͼv042VAHZ'n-3m+]3ƵzlcnLdXFFW]pY[EM $\Cld#G)R>*`\$$ >"0 ,'R,3?Pp \7beU+ug|҆}=e)USq3O'AfeVdu v:%=ȑS*9ik)g!Uk{wWc0g*#$"c$>eπTSOW\vdѤ']I,8&=,%,V柀ٱ#6c(`93Qe=o2(_SCs6;hI5 zߵ4j5~snZU뙙Y\(M;P+TkJP%JMFɲHZYjH.T *փl{ P2HN3AbO=E乓X׳^wziwX|3R}ڈ/q°sPiv7}ǜDQJ(Ȁ~KZ :~x0 ΢AGh2E yC DDBC AO2$S~H)Ġi)C9*٠ $x%( Y<0CrժY(BIcj<: TpZZ5-gBV2%2h 8,8>)&MBۅZoЧҶ uX1k.L~)T^UVf [`wb>k;g<FX!)VVd` >q;~n3]JLJ8}tx. Jյ!)rBAѥzw5۳o^pԇ|2cx}nw@ ,1e}@\ULa$ ЫA eiE(ߤ3k^X5}]Ȳym* 2+K$f|_3 zАu!$ȻS:%b2 Bj:UEAߐߑtXR ! Q);G 0~RM0p9B0<FN cP;^r0 ['6[q+ڬcm4rwݑe(&$-~N-T815Z4$5ۅpqS(a沶y*Ջ~Fd80J lzk S=O%y" \3mÍ?!dK2v=$EK |Ey_5-rr ZW klglqr^Brt&n UMK_1<?\Rww{6g~XwxoGDYI\M58.l>s!lU2|eB5Չ>B"d |ANASQ*/ƭmށCY73 6nѱ̈?Wt5s5phNY d)6fi+F퍭0z53z3ܲVwKk^g .[ 3GT >BN 0 iJ &Ci Bx`.4ZzPk"^KUy:k)*^{] ! \{ek.c\җxbUJ\N='fdv ޷7L)h/pAyYK Aʥ++T,r^xD1Dm@y9-z*Pvǭ<Vϭ։v&ʫyIJ<6U|m1G50Tٷ`}zGl͔IWɟ2C R1 ר4+ޞ6=<$-opr&0/"Pփ x/qsj쁣{\Xvql8F4 ,Sx͑.+_E JAAND)Ϸ^[$m{dSM'BoD(@",6XHĕ <X:P+X43V, ^lUj4Sfw5Иtb\{Tz/d{  T;S@N1w*wvnz]cP ƅ<»X`F!f/ux%^z?<>%[1؂S *wK8 jylՒ`+qIg 9{b:xL~© 8wS k4^ZPW30rRIbTҕRy=2ŀD=m׺m&["gWD6G'iZ& IǗ Y0mc7w8S_7 #I2tŌ8j)BrDf`Yc^(٩Zr[~Em|=G^|]ܣ迀!÷Ȍ~+IonɰDL۩x g&րziS 9(yY(OĚ49 Kn yg aFe(ZYD "3"C{XWfcs6$NEֵ,-Ptu"׬ù3l0i&X5pXLwAv<: NΑA`Bi~Td`žLD-7dջ)~˧q 77_gyɕeYş}<Ӳ 1fG?faj5m芳4MUcC^Ϛ'f?7 R JL)yb)xȜ5I)|0ymdU:|$G^ME'r$-fjNKp&=~x$o' u>0ύ }nwlV|>Qj` cXvEӤϕ RFUxn"[DNٙt"V sw,e1ySA!_̓ԂT|{d[ILvŭ׶wM|PaU{uK_}=3Yﮍ~dy 4"9۬ ͟y}$Rw^Cx_Md>~zX-(;Q*eQ^;.rM u$YIYх&mTXN4{Nݤ@ib) iW}L+MOj<c8o2j[ Wx4lS%9DK2s<ΤH'@옉1- Z|mRȰe*Ai֌^,j!ux4̦`x8a`-!;WVo1kWELzZNV6 zƉD~3W 4;]̽W!\fiTO gUqxLҧa " E(8 ъbcygQʢ,@iVJحB~psܱ_aɢZܣgB`S N:pYHJ$og]lP& xwߚP[WSMu´׋- .3Ҹ3Q./!Je9V+W2/v/"g`5~F9d~\r<^:'`;rcDY9xwBoR;Ytq Ph@s ejTasuO;0"r.4PTٴx0\A0NMmֱ!u &YiL֦P\EsTV(_M:]9B(2?se( GDTSNrV+e/~?zsk`4ւO0_5ܞũ (dֿ;KCCIpYԎ#/w(vF}Z(ϧj{- zcFbRGEir]Sz\N5kP \e}⺧vE~'EIAaD11Bٲoǎ?=;SplÈU[y<.q42O/7:RXh=TqXJ@l3He5JbaN }~%Ȣ=0Q%8b8Dž(BISc]>5;8'ZbϨNU.i] 5?n:J\l4΂&T "z"mXX/gnj|hez>}FZ!-}; ,L3[\/Zo*Ksc%>x *r5&#ef'W2ۯ ɵ ƁzdNsC2 R}@tÝ9H~:JN0D3&e.M &lC~`l#k^\LNY.|Km75 W[w=aN] %Lj͕0I:g1P{x= pУ(y?gw3-t3^~k6xh3jXr( L5<Ȑ.?~GsJBv% @([ֱ18n1ȫ@jB$Y ChlEjC?.YɊHU ˂䇱IX>^未]QTւ BU+<8v.fʃ@o൐qi1?C^CW>:ǐ' st_kh pW= 6Õ<݈ܲi׀/ [:. _%ɴ_:QNy>V>WxHCvEe{o ,/{~mm8a ˷R5OHXJmf̍{ӎ4+avu;W>4P4t?6RLU-grW!r 0[4AuR}&)rC0 xl,7VRiY$f0ޒ4u@ڪՆE)( _#Óڟ-۰h|v4})Q=.-a\` ج'|,%ZؑB;Jkd$kOV+U閯((Ջsh!*ra:ѕե8pӦ|=Zwx]E3<--#FW .VsNw!NHoե;x=`ӯ!yp$"q*5C|ѩU0Uٳ:G%m9|:@=\qeǣj\l\|p`BӌHtf_Z5؊UWۈ %o:dyΗ:,XiQ԰3zD t>A̯64;<\ܽ)ǮU#nv>#ePob&%Oh'.u}x3FRU?&FF O.Q@Hk }/7gq|;@Y^N].t+|uMsu%ƴ~.Qyp pu6rf_-J߮߭Ci 39iJAO[0M${Y,=:AaZgMϢs"[JĜO_@)t:5{R/os6c=b95ΨuG/kj>f-Y=,Fv(ؿ[@ =bx^n#X|~ Kç ̋vv'\P K%fr k0_i\\PR?sRՓAhÆQ(MSKtˈZ[s9W>;=R)0S X 8e5b73gUlU6^f_k V+jeҘ{&o0wǰ7hBsv130հ~!c+2_eb*ly4WqՒ1e{ک~!/k+Uv}^fP'%=b0;ۡ+NO^M-; VޓM@jiRߴG.3PЪR7\fH ǃ)3aLY\5]g:I-_Ug-g*S!!v&Gdl +Gan 3B@7"Co bXTXvҟ"} tE >WF~k&b:\.'@2HnS(=1]dqlgr^=lݢr'- fam/)'p'(Q;oaO><|B3z VlW?[V<6^!_HҘ"}q&Ȩj)~zk)yQfaBb^8%8 [<-|YBG(|7\W&.c+x^YW}>+WB  \Owܯ&3v;q8܅30?8op7>&S(~8 T"zKf ʼ9n5CW$>ȷf8= I 26P!]/Z4jc ,wW\/X ^Yf*r6M5+(Y$5" S (⊩y:Ybb82r_',m[6N]l\|ͨ +Lj(RVwNWR,te%'3%IN}vm5fdі~MO a^n`JzYHt48F-V(/%D֬rm[Ds!h)C!AؿUow,=M7ф8_xPWHk֝0uB0m13yΰnդuj͹np~MsJட$J8'IJPXG4ίoTM9҄/]25 6=-ǔ~ݝ8w܊M>p6U\ϸ]\TRJ3|&nP>2S\8ocY 8Xyʕ1ڜ(bGYiSw39e`F'2RxzL6OœE,@}t4qV?8<جij_Po*v `q_'Ķ3/lDFjC;̤Eu* dfH%/]@RdM~LlB| phRH֚XCw!?x*kTE1" %!n<MKy?8t|?;nלpH:d}DT""z$#Xr!D7"&WJH[%PE]U % l7|u9'>ĸnZZ'8Rq6 $Fg9f: %#VݽBf ȏ{ F!OuCZzGfRIy54}xSŒVU)i- т+,">Vdx!'Yx dQ:*XZmSqb& ?Ᾱ *.<iR<'vRn:[溇r h@'=OڣW0b_SvIXr 8ECcj:Zp^)uL~+3}U= Ob-@)??jcbo'W–L໓ v~QuO6ƀa`,(u]{:Ću3h(Z{C:Y06{XH YlN3'V^Qͧ2q,?')Eb&B al,3#]qYx4!g\H"fQchjU]Kx2PL=fUHP"O*#'NQNn&uU'-x%JE1,R3Ls.ϖnEiOF=etTX-xR"4h8ZX|V-qGѩx]$,3U#6wuRZ!͆`>O!`dK< xJtv QC=Ă{;,4-*/jڝ@ s(FmɆEZNKsUóAarMPmΑQhGKG&R7:>^6@w Hqe6ٲǜLbSDr$G)okz/*%Gi>d௡AH%*M&eDv](HwffNhe{\Jf\Wcxҧg9MD|=HjVCaP>誄!R?`݋Hj0<4EDc(_ꪬ Й-bܓEu$l] .5[_bnA ?,i!P~6(#z,aug!3و=BW }fc"␥?ŵm \zuU2'o`\0~1Nܘo;a8C3j-'Ԅm!nv"nxwTwډpZ *ZIlE Tz1NubB$n1yI۩Ie %/F)Js:B֊w DYndßQ$3Kpʥg2wu=46PJ֮ \:=eKEf ʹvP&1N ]Mˡ?N5Ԯh.t[&)jxQnsR6ʔWF@ }[r[ň2X2NU|^pWT6.`.'D[5NcQI~ۖ6KB 2bB Ϩ.e1 ~*_78@w0O[&UҍQ@+ /~0>hxgn.txz@>KQg;"=۾h* d$$)[ɲC*B`}*uesN=A%xlWL10seyLtBCPW+%D\|hdoxOk:z!Dl|NF ,t n[tr-F,pQ K *-w^}R"b-Xnq&@8FЂ9sB}3)mr!N~y0aWM󅩠/Ï&4,24Ϭ_jޝvRbh< HF*9-V梒 =SJ䴧x^$q"_x¥D>'U5,3=k3JxАBZ{~wyxJBk Ȉ8zMt4?N8N +ƱȺ W+ޕRqcˏ=@'&^(XZҫ"GLhnR.= azy(Ֆ!Qќ2çA`p_NoU WHg[Favrl5(|9FnRݯ ?9 N HdOMAyR.yT\ kF8ܭ6vr\NO.Bg0'5E?KbHP[dqݳ%{BrmY ]`w萎87R_F- aC[ڮ͗oZYucbͧ] X!#HvPm}f$*Jq!7#}sNyc)toSgL\ʱjiQAEܾYXr>J;+8 >Mu~Yh5N87"Ԯ{i۫v^'s("v^텨~;z>w&C&mN28$nr$Ǩ4PU)6IQ'zԭţW+nPɥi[FԙSİ 3>:ό>g鼻'OAax7ۨLQ'[AϿ֭s\`5Z\ 1hjK%Fn1}"rWJjjt>Z{\oޘƧc4'eaG{L7EW(:дd8JVT()%|mκ"A%W\׉`Xf*7x>|ɃHGm)`hg4 wc?H[%kJeY0!b[oDSصTDapFU@[|@3D-#6Dp2V~eC7\LpXA/8~;&!Sm6݀e%UI}~GFi&qWx})1Gʖz]U \lD9H0ʇ^=}ۨz'),OI9qXja5MI-^#.7D .3$i^?zF\ td8$ &;-bH[ˆgsL,Bxߕ~&Wԭΰw[ٙ<)!K"O7K;=t޴! Ͼ}V`m}(R 1g<s\e*40~+MYۄ>x GFU&lUvy+8r("A(;kAʨ2IB`0c9I3, xf}1Xp $KbàrOu!)s,WO,8RS?) B.8֑.ś4A*A`2հp?[,tT.s7>H_;kY]^49) @NX-rf9h`3ml׫-Jf%ނy3w3̾miI vXJ=u+h8KTYg}a9r,X5%jv͈&!Cy(s_.%% \&bSk8@6 +AzlHrF-0" Bmx#;cYfP޺XޅHo^S6{Z5+p7Z~| /4r^?K#q*WKCgjv:\yb";e;Y‰H1"&RAV9#ju@qM "`>PEYSk[r 1=XkR`$Bp\2~Yno),'H^:UNK5{$ [84{SKo. IǟT't`/P_U|95 F }SvcyI1(1|fVrŐ 9 nXˊ{ .Kx§<& T'4V\GBQY?S=_,Ĭ=y%w|@aQaUp+ʤN:j%e?WEyUaM2l42`#ogjl#= -l:=ڭG'.EDcʗ"CW5+n{,g t.%*cT"4Vf`ٔ""7\M)BM"{hFOr /'2ۚF6/"q6BU,SiѠE6h9T-aÈOx0$ܼ}4FcolXue{DZ:P=Vi?k܉L'O)K`oលNr31քOVw9uؚ?t̮=vud0A }IK 3 6Gt e/1R{ǹk=B̾p'T (!A{>vՆ`%vu! )ޙ\Ro#1‹ :fiMx@WDŽ}GҸk_,>ʺ["1(FYE01JdЇa)6nkrJA#xbsAaЯg[t;# (>ڌa 9nL՝0gQ8MEf׼R f7jUe?IBpDMܪ$fy[r6Bm-YsI@$vl-JpeY_W"ٞ?g 1Hp(a?L N]ȠQ=Ef-+hIJT9!5.xmWhIxcq:t.KFO/'81hy;F=hdM :2WkZ!5?,!>@ …\'Ê$5,ьj E=>mY8/8Lm2܃7U]@ivff.?+BxlCg@CL`uC棩RĮOr9c$ՑYEC]v4Ս7+&MRJ?0߶Z8 S 3=zTB*C6#v]6{nEVO@&k1Sxa ~9v_x+P59ke66[FQr9u̎3dEb"^b8 6I{ &* KlQX&o_jnie@x̤(@*O!tΦ3<%zThY߭ '+air)S-!gH7R;I ʔQ2 ='jZ'Ieght 7]i }<μ 3{8cV >ډhwˤȍhfD0 ~M ]pvC~5\lf}bfONCM ; L`[,CjO=,m(J=X/*08fs\ѡ1#U$E\yi7TqS..)M~Һ`փIylکEаFf­g~%P1V,r_1;K>^9%]+kL)e;\8!IsH%ۜ>"9H*g-'w{DOׇHgjO{iVC؜6LU%v9~oӉ WW㨙a.nM4P&` >ۭ2`m?"]$O"r2*tꩨP}{J7:Bޘ:H bbSuыrh=BC]L")\s5+y,ϏGBJA4Ἓ .pzO-#ltDӞ6F/ i/2N`5*SU(?ǫ#[lz.VH=~VX(bzn(SYWGZX௃^!Ev fECO{JSZV> ϱd 7(^z&sAyA(o ưoo) e\8"cSuiJ @dgI|Y8\u~HûvuaGNwBl`;%Ucz{ǧ#9ZI|1l={#J<΃vgv\Cke_mSz'wJ՜c/0rwy99x - לG x"Ee~Rg3 Сw='a"䐡.G"=~cB|$ ¶(~Ym~2ȋwz<֞D8v(¥Q"{0]ViO71y۷mweT8^p `ʸK7J,1ϴug}f_7"OӀrZ86@dzU?[~ }{S`{9jpHڻl jL[ݩD 2Y!#KhCr;>lcBl.w A܀cTj۩ 1/@w̅(m$]OaR U?Z"J>ـUe)I,>|Gd٭-#*FWBҾTPrZ K@wOil80Z%paw|3jDýa3D.p_cRpe"Yx:=T! 8!җm!:pI |V!& (篫%:;XU{(rhUVQOl'k^VC" [3XP  Rۙ%y!Hʲd߽pa3˪@"mu hq`0gm: o~7 ` {dς}FeXc ooJ=sM"NR)<qw HMPzp]4%R]dB j]DٮuYgw oYKvxX}\K5o?ÿ9QO#Vh .nX1)p׹NKZKK)'>ݰKoU^R#q}FZhsb%ヘ`k{Ɔ28جUתg\4h^%ކlϿ]*nɶ]7 !mYnz0!%Bk(fiHD&/s RM̝a!"Ψ{du#W$j/޲ S]Dyyųpr+(?N*?M^P׉ϒJ8T 4n]G3E6lRp[YEocP $ fza^aAbI'mKI xC}͂,(`ᩎtnͧ6mz"N?,_|t@-6+!gw EG:r%$`zPrJaTep!=@9<&M`5%_ԪFq ]_Q'2OFP{p\gT1 pp@2" w ڪ <PkDGQS\kxyʘ8VSŸ[Z彺{}RdB !+<Bk`Aӕ{, >Z!ج3(BtW!6ݓ]N!c;|Kp1t|C`wRv:;qE*2| X4x_bCrĬ0bU޾S6P3ąd+NFS;9/pnVSf~=o%rvęb͏+8r%(+RHZq%L`!Zn$F(e "&1-)Ϗ*p^˘ŧޑ{ jU*Sҫ'-ב t9 DY)˥UT-RI歺ʳ=\CP$hdA(0FT Q@K(Y~wG_^p#I x2@+#(k)N氬NLljwm_mO H}R?Y,RپvȔ+&)e&떤Q5r, 3bxUrVbn;y@JjWN$j&]hY-#K jCGhSN#RT%2{9E~\4%򱴚_rfu׿O$.z<`V)m.U<^=C  n:лw44Z?/&jv]EW])U G;-MCV^R2⧣ [Ԥ0hGSA̓iE &IJ/× Oe)Xͥ1 Y]qbhI-R Hq6MbIY5,4E8x'7moԡhSr]8 NQ^&$5!YXdv;HjigW{O,KG #g$[<+KǞ,qѶNXk>ү8a9[(̵/YEjXr g$o-_7|^'3,݀}UnMN7,nPoeI567kkGji;|<'1X*&qx93#XW 9}1ʈ?6 ?EAT$56M`3T1~iB~`3+[)mŮҵe7j!ZP~?(!=2xjȒ=˫0}&ZOdxˏ3J,' O+s[?Y. H NHIDi&|juݪ ѯ|ikX*6Mc.YhdE{a4jEF[\yTRxa!OzUS3I8 Kܰ fP_1#g~cI(zv;wlx] )oX(j֎E-T=MвTNփ(* 3Inb暘b8ߊGSהrbIO\v?J4Psf#"nܑ^7a (ga _cI{Hy.`r5qX@M=@JzFxd[Ix ov%ӰhexoDtNîŁOԺCv*3[ٟPy>yyʢzU#--t܌)\*.n:OhxQ&Ӄ-(n :DP8!"#c E YweN(ðn b\PEt\an>ZZ=ԍɇkpocu$Q=LE"huxR!?(MW C_sJS|BL\_>jAv@7'GEfUHY53b wdI^ jȱFFz?h٫H)~*97;XOqU5VM*B:TQ,bO/FzXO&,{ޤ)E&fYyJ|-vs^rq1k k(#$,#CO UZ0ꓝלօ{>G[:Jk6!.P,?ryP/g/i%PZ1uΌm+aPL˿~ KOX4PONVQm٧$V3Qҽ*܎I4Nw?Mѱ~.6i;Z0zxEQsr5ʕȄߕvީ5s=N̺KxPԦoTTisgރK8ڨ F_|8 > sE_,v-g4p]|WkApc-y;S W [ߜ 'RQm}B& ɆEN7hGޭD}! 4JۈRXޏœ!k}8i}t8fNׇKӑ߮(rJ&gɰt< ZZ**hMq_ZA.6qմlg\IKtaۼSvA*x 2U`dGb1;H`w7Qyܨ;]ڳf=NZ^?as`8m UAD/tϠC?YɦfCXxfҾETn?ΈW|^p I$(X#J/(' .T DHi@Q{ئ̽è^UN]s5 yqa;/!5`j!Ն3ѱSqh [*& PK*؛3l^'M''vQ| fֈTB`!j5GspX~s=Jl| j>Y`H(OtY7@ʂ7[ ״(F h _jY"".as$ _&0@f+V H5wO%_:/.課XbY'j^O,fj7ȁ p-yY;ŽAWۅ~!3D|/iLD#2Żj%q3 YR}jAe6֢[P9t/LAPzfZ&ÝPb{MtiNa?Qsϩ^;7y׹Fܾˉ;>Ӕy~3bY( óat> 5H65&DM{˗$_r$|lc\X47`x(r+= v{Њ Q!+B\} ^5+V@3@ 9uCdӿ8=(4o .n+N^bw)툁K?½fZ_[%EBuspXE%NQOZ<[6=h}ĭןo7dD/6E+P3TI %yڙ4;6yԬ)=08)`"uӏuXaD͍3; xȒghկ7|v!&Exh,È3T)TT/(IXD S sI=Ih^~W%GcJ ~ɣHgz F3;0uQb鬃 ;(Q/?'IH1~4nӞP<.>-]^FxZw(JYZ2%8ٛ!S1Fċo%ā(RX,ۢx;JY3ֲljvRƢ!cReƗ_؈g6K vܾ4"ړ]eLnY\ "WB[!s nkC?I0]5ӕK ?˺h'Rv.ӆf"o>%PctYR'$Ys~m:tnں='Τ"H5 -ն2dՆa-|/xF+JxNnDVwt/$h$$ߏ|/n~v(Qt>8217@J . '%, l㦅 &>tpԫq)dQB9`&2$ /RiH.ͭ#A01Z6_v: ؈jPhLj媴صK\Nє\E/P]Q׷k@;/pr>UF1tGTچ1FT?`kd2;3f)DiO3! X7lØ8e)WFg'r}L7&j̪-SmnW)\G.ȨX_8.#k|f(7k EһȘ j5}2rXw#dBo^p'FMwq<&Nre(ʅ 40fp/p㛲 #Pa3EyPFAeAS,.Ji=h>$+``YS?tYɗ@( G [Gj4bmYI6D.C$$CgWJI鑂@}V.a%%[*M/؞JH#Y vC=aoc'N.xI!dP@&Q>rO A:ZWu;VQ}3="u ѦNF3١ӥa :S82ÉG^f^yH9i:b"4>)k/r RE?U`7YH/m eOG R,F&"r< \]*g.!qA0oՖ|NI{ᮀ=ȸ vۓAvE+4~<ߘ~ gpL2IJ81nCwVU?d30 R!4kVF靕.LuQ 0ZT- im_87)tV ie=׍=dEÀ|w4ӭ#"X[(*gTZĉIw^ZELSKbNt1NwU>LFwf(JQٶ*R ۻ]/DoR/39%cLi򨵀[tXNހdYnRZ\mAA>jYK?b_ʪ )ʼCh2 #+>!Pj\)~að/L~vVNcGU@soqNgqGwJcNV F PWZ.7}!'u"S\h( vŦFE(Iݳ}7-td>`DA'A̝%l뒾qUe~:3q-yQ<-j2zB'C]f_EJ4FS+{XrcLU3d=?ǂ.)mPknS|_BV3@ӱ:Se`K"Ʃ8qJT؊FBս=uD'!RGӇB\\e+찰0:7X&(9Qe~B;%)HЫ cuxAeL ݡI "R5mT~i3 A T71C%,ӓ)s]p&/014K/.Y 0JHfw]ҶtK AI!WP^Xlv+D ,g#n'C`Om_Cq#X=[tUТd%M" ҺEnX]q:[_`(pt Zs۸ЧN/o- - n[Ұِ/5jg"|h#X71 ;1L3TիG? GCz˰:$3@Cg&Ԩ٘u1؀\7I()# gipe-E׸,e「|\9)O}^bb 4#ЙS<6",WH~r(룸$eOIc./Q\̨=gM ."Xؽ>iR:bΓ;CV sTU<|-bu⩀7H'-r#NY w5mȅr1Qń<Ж)v"ΊEIS41!2j:bh0q>iftܼ` \|86oLj菣%Os~G&!!?~/;ƪx1ސbܑ␅!gQA^bV `7>Ū,& A1P0szjxʑ;볪+eYtQQmR6IP]4dps[s P=+wcd~~ >R"B'[OE荤ioTf:&s9US?>1t0`4"~ZP\@J?Gbxɜ)M,̰6#h/LeHO"ۆ Dlz~jez^B`&*F-Hun F>C_mcܿ =킿*DWrJoH)"Zb] m@stMIM)PpgGsV5֧*k sÉt&f@Jp,]Rz|v MZUwVh&ix% LQ~FN|;arKPeḦ04m]n2ES(t@jo[U̼/\){%vj拉p?ε0w6$2\{k ]P{Ʊe2= >sQU|]6ȷDB-\R[@H.H^Y{ IK(,[^]gCRH47!#;0fpR:crUOνҽ;=.zȵ],i6vYJ cľQe֝(m݈ 퇥Y}M8wyU<3FIپ N7z"<{:U,;/ٻ̃XWTkC~(Qi!3vfؼC]?H}mɮ+Y.3t !|gEԻi_=K9Ω[}%9ӂզϾ3:mjPmRw*zG# NV0THGG>tbz.q&Qj|u)/= xl͠ Seq@5j9 }uyy#}:߽Df v6jâbAT%Y`NM4[{%=Z,"[oglۓb]L9>,0{o*ԋYE{nՀל7`_ q(kzJº"oLUaQ"R-Aa NM]rxEeSlg}-s*^}:I/F t@Fqz/c}3Jp֤1A5+AB1zcPjJҐ!вu H~W8;#ÉFб |H*YIH, Z}bEsAHNw‚ԙ{(,fR Њ8f2CF#Ǔ@pBdὮ}2"85PgN.\(8W|58^qvb 22/ mO:"a{t6x ԛ% +!㱺|;=~\w1uz/U+_喲hD^?̯ N7KZƙx*5^NVkv3d=0d ^d} C5ӽ :nq>Y,u|8O(-ϫvSr1l9:*aLh4ioWfWh?|.FUa,x:g#ģv-1ll/ nYUўc0BTMC[$ 1)%jzfwp9 gF&K˭3TWbuZֿŏ\QxUOe/Ey|8V9xϡf:pͅ;y"O8Odr*C)}b[n0c/z; "GYR)yIفK"Lc,t'M՘AYy}ffDpc#x\zB$%ɚR?dn+&=J{,ܝ(hCdo4z\Qj@cv,GY~&յx:G* c/R]PKΰںRxׁ߬0VcB{&ȡ@=m:A^9G^!3&wuC%j:"RLvǰ9TJ;B}fDڗ6 2YX {[\6]n3Ni*cjq K:` s|GՖq-'I%˦FnRF> 4S:Nĝ;e_U=.$[m0D>mŎω#7_ Aa|–xR2 JA"lVt sk%>B-X2775:˭՗6|78{Mf)} 92 }4 YKdڏw =<n.;%+AT7;I]Vܫ΢pYYoe*\6) ݹL _))LӼxILUu.Ta`3/H+},FgZ~f:a֤Jlq{IM 6u.MWC`kPa%UՓKp:f֑Z_$oe[ +Aeտ]K7]Lt{ŃbDﹲgHuMi:%:m(Ŧֈ7Afe&Sw??[޶[MѯhjԊ}Dȕ%i;S 38vb b+P+ 5XAM )a &rX3nXD "3񨌭Hs^؄;"\@zS[,Ԓ !1yUs3,P F0aJ=ߡ'$E*/X-BQ?ܖߥ2kktYk!sc 1v-hƣbc=9Ihѯ68u۪__ŃRS-Zc]ǃQHY{af:u:I*dY&(H>Y[ȴΣtڼ}vQo-4^ sr|b^ф&{%[#]ǧ((w z1N{@Tl̡IAC)R<㪧x; T k=.8W]I%P5pY٧)=ez%fiW YCTSh&<񦭱G_cl)em >>6+}uE:4!Fj U¶5ޱ,C,GQ䙲 8;g)n NR)+z_ QY`0u5sA/.u4*^SnBR2U,C{@yG-~$"gX2W͛_dGDM9u{8Kxv0* ?Xf^y<,^]VJuEI`9A;2ж> gEY-`Jr%1iku}7ˤؕ7&R?ѯ]tU@ a,Uԏ7tz{? ~Et7 ؿDӜ# 4a LrgoI~ @Kp'/: lMZ@Ea4vu%[F<q09Ik+*SvHsy9"r6ʃ#s;s7_h I.) $7,4,ARvݛ6$O :+6]e0dVmUɀhgyX=#8nT#9]O$әQW re5g~ ȳJbѼ(={wI܄2e劇/TtaFeD@=R_G 5RcTpEzAGKӬqkSa"x3nXhSg5*?:z=^;W .eYn>'=W*[\ ֺr#U@ zƇ:-vqZ5wI,L*e`n#Z7 JjjdA*fKvHd+PɓD ɬM)YkkbҌ . Vpqھ%/Aך3saeSup:|s*(eTivZ%*ؚN23Դ쪟t]5cp^C fϕL* 0ԡ>ƈ`.l,kk;RE}#J&UA*"눪2ڜFJT3*˽ (D۾< BfbMǵn Luㄗ;y\.Skf,<ͣ \$x->#<3nΠ^а3*B][8p`Jױ*cޕwŘ2=a-B F۵8W.ٕX%f#R ;9}V hI;fT"΋!Gg.bkX$ srg(kuj. aĤ)y/4I8 ȜydUgqg+6. `B3^ɻߩAeem *H '[ySt UN6.t CDw "ۻRyS3FC:cRf+scId l%c!eNnQIws{sI x^L%rW5n~`^c+_s$৆8B]y`qxmEr01Qz~T"`m9t +u^>{z(0تvQdWV1;ys ʟsp0#xt(opEY_c'G-hc"۩?9 nڸpc^>%1@[/n5:3f@t1 Jמ5)'kJ[UD⭵ aQV:Ahwːנ!y#z x|:U;jf0 `"QXe6cZ/H~Z`lr3Ԗ#e0Add_fWnĄzn|3QW+Oɜx"':O;!;aɬ/T#Oh&&IF_'K\е6]TB2$ҊjEv]aAz ̳~MpN]Y!Ճ7n nK>96@PeX@6喜zcM6 OKbRf*彂??]猒#7=VH7$e%)ۓpbQ_y78`\J՟HCfwH|w>|V6 mzx mJ#-L+8r7F_epfP qgjՑ2 WRH})ڻ11w`7v#,;{,֐Sn0_}U;xܝXl[`ܫR4` m܃Ghz;soڤ}0!ESEqS7,D?*i2͛5mhv$}k~Fm-dC+SFx wY"8([E0 @>h=sAaAD[O{\fF\ܗo!i8_gs~Z*_e@ʪXH)i{52XVpnC l-ù2yLL_ Z a'%j+~eכ1`yˢ6v2NS"9xcޥO#+JCSV>ׯgFҞ- oL073SW/DT$s nW[">{/dϥ (2,(˟Ÿ򭬘weuD qsv7gk,l}mntEq죶2i@jC@~m JF;il^6:eU{iv!D0xY!jh# ,a"Hd۰޾#L-ddG>Yw]Iځ^>ԝyg9cC5KLշ -hŞ wGCU'9 kέv5"QyQ?hKG 2Rct %ԡeXֻ[(+IFbD#^pܢTAS8Sƣ|ѹ!xzKW>8=jBJ}H "5ồ D ?)' Q@Dwm2w ݄BMelwwspⳄ3/&>p4C<16N!2ˑ1⚼Ճ}cu^P݊p;Z&DjDMBަ.9}|9ngv_|!Xmmn=$ 3c2$xRI6,|% I-n CeS efCs"RmIuaP0NּV u6̛ka}5ra!ZpgVvMGAGDEzWbdÌMqsU~x/ۆp>߭Q>כyK;.[.gE߹j4}[FA~u';1[i' 88N;AMb-<{+߁) UC^!ztW6^y W)WhwG}4n,u~><ѿDĽoIS仟0W|q[҄ۮp|̳9R846s~PԔ"F8#G`bW[2x^}w'`Mi Ƽ4KQ6qj%kOn[ZОd1rY|=pE F|R\Gyt';a\jg(%o73xlggGOqׄ0*CMUWΠO, _FmFAm b\$:5ں Apݗw]3qk"aFZ')'U\h+̝]\m1= ЛΖu狥h%#? D( CIld{b0t-ilPBATJ2In n3bӖYju2&|PT|F mZUdh>,`uZ{""kDêc?N@?_J hn+89 יVOq$i\")\ T+3 ěV ~eA[G(nC L0]kZր~k{+ f0 1T*Wެku9s A|碀o:qַg~3q`Zݭ%Q4j&.H_xtos @[;Ŏ='rf~ngvy  ^>i?Tziåk,AvE1$Ff#M=uF?M /zyncDv64RM5wv\-oC o,x-4[=Z F XPrNj'QX:3aeOO7~{Cw~jgV/SiDK[9961Ș+ jpQ->,4J9"FOېp u;zCMnEg}A@H_u&D^Fyrż dU(J2\Y$W Z}-X2|wΞOKL~iW% Itܩ&sLHCn@vOE:T)ty>07;yBb?>#Mf0;/PjC*677n_ţaYB)~<omGDI7d'xS;rw*/WI}Y/,fL:<8MJѿCj 9\PY==rObpcr:EDhqT V I R[CD㍚/ $c¸!೓+-ѐA:[v_E8W-Oo'K{?j˴kz[;h(,B4`O nϴ4\ӓM.NՍ4<Kìtt,^ZU+/4@&ݬ6_3Q\)oaa,IakE@ 5QJ32 4k2SNcIyqZyېFqi]jK. q t`s"gqu˅:O.8_44n0M}JvsCP a- * (*͌( ( ACwe ,W7k2.kP(k.ut{$}snY% HwfwFWP"$:J)&p;D)K|Eڞ.`1,GNqTLZ[6)f3V d큨M<έcDH3fw6%t:o|{DӔ]Z6-T(4BOZʽn6rg@xG|ͮqjzB!Ð%|PLgi[KEs~%1  Ix#a2zo uCP8 Np3q}?D9%eIC:|ȚCH~fn.1uw"SAT~C[x%㳺w5]i{IdG(] F&gƊKsDuiȲgr |/xӉciÁi%)/8dmK_d.XeoŁ2l}E꾵Kf$H0GHeI_fxLbWQh}:zYTbMB@ɰI6JM: Ԥi0B| WsWAx5e_X-qᾀOr'{ô.`~=.x kϏ \:NH.=Z:"`oHɼK iON\+Y$hT+|iI`qIu?53{; _fƝL:ՕVSU]פZłB3*|F$[wFi(ېs۱fԓ,1H怍mȨhwd',ƒlxꠂ;`.+'IL 5ARSq9֕={YJt1J!&74Y,lt[U RxN!4"cy5kI)n5Y8OIES9/<$F5QjEvZzIY;8ìr,A CyjU?3 _1$4p[>RUg0Q޶{fj_#pcKԠ18ork 2tT;Av˵K&+ En,@1 &S!f)VXV;6@A&3ȭM Q]F$֍,6Ut{p1Z}z$g'Ly<.ڟL)*aX{p{WNˆD5PFaiEICbfK кP`jor8UN1o6YDQk%b-HȎAr7%ݖ4o:#,|6)jThj$ %B-i;3YΜRb lB{ε]82A-"4F$ ?b i-"xw`V pc1ۮe|wm]9CwFT>NU肑 LS>:Է!ApzCD +ҬB=)ޕvhvڷ[4p}HI+@\rI.58ljtbP3QTa#]IM `|jud][qbN k]v }vo.˕dWjx,3,p nץ2ykm> ߡ=%ll՛6z}nxQ r޶ᷤBb{684X|C؈JbD),TY *+&/UI"ŚAUISSĠs݋|'aK&FV&bqBlUz [ b {ӰR SB-bro.:R?k5)ylE+qSmH_9Iu -nj0l wUhz%}rRrι\^Hiگhi`tL]IqHZ6ٳ7sTHe͝SJmI)4j>ksZXs5w$1v1tךZۉFNyQRWlR;.:n@xA\1 Qiy)&+\Wj; yV!%w0Ou6R݋zƖb|kb/@5ړ!LͼI̢*hyO'Aqèi*AgWsqHI$ݏ2%ۖ#ӑͫ҆Cr@y==FPCEǘİY;) 1I4tsL| ?;MϬެ3I"W:4~jkḃ͡3t/7g9BF6L֝'[-d\yf.Sݴ[2CC"NK7g8CY6x>B'xr9~E͸(NL_RV$I @ȦꁩxaK3Зa[#d6읫jZNZZpUɿtQ32U,v8VȻfI1_`2Isb0bfL:^hρف5&ofdɸV`5u1| |FrWŴzQ=RĊPMm.`A*]'8Fonƺ%-o7 B~i!JP3XEQB iщ6;JZT&Ҷ퟉CqC23i`bD'e2@l+]*WPNxlOa@i-u۬^t Kp3~켄IgJ "4/eDh[~pQC SVC`O-\s)˝VNA#~פϬpWTMؾ &Wk=‘ZVZ :jwl XרMVm1/ۇ8&@\Yr%S$;QB,U/юxjSW+-NiTF;hx鏴 IUZK&2k~yP>eDdoKUٚ]k*TCPE5MI8$ʓ)U&aS< L#PeҔ!#ɼNUd?ف35]ua,^̨*d[0'`"R|0yk7R D\AyU$?ь Ԧ*nrFhf̈́n"uےu+a8@ZcPі s=K`9 *oY*-_3<}Ipm9U-u"4J}Coa?_0A\Q ҔזBӉPD:Uh `H|T\V kMC)&@RG% f}dF1@,V1u6)V'BQ Befpg|Fm74rYWlE'Z@6t=6@GS;dK}8@ 1Kϴ25!'6N㨌eQ-c IĘu3 >cA3+*js?kƾKD%Ta5$5o>GL#64#̄G"O 1dvJotgmOX]:LV+Yq>Ì$0SӛF,{= A"pǶ<WZ. !;>/p?𲌇@Mª{P 2`m g 6tK| ΐ R=+>?dI BѰI:cy}'_Z8\!slݫqo:F\YeEC6b(kxL*='R$acA2ހWB/e k~mZNNHSN//{})9(}er:F=)$GoSt>+kۥ?lgwlnsZۦ\j2g-w o v.?9Jή9+oJ(f7F"(&gbPVzd.9[޶6ļb&ݪ]ъe)[l$,T93E,R2ڃ?##,W.Ѳv6Ѱl@:/Y@5xqtytZe`o7ĘwVSC{_^Vyy4b\{ukVfߔ! Uzp4;<4LA%ai?[4YECyyIql7lE?7Qq=2,z=8h}ާ;g=X8QLKPWk?T `40B]F(.ѿGnÅd|D0x*f.az[jtp5rPk;J>3@B1o_}Viѹho/s/Sf&|bkŇ. (;$y p3:?OH\߄O(,Go4;7xԠU?mHI3?mNU>ԸG,?Y`W;$C֍P,\6c\93m~7ÖsŠ J/a9ɧ+Þr"<A[eS+nJ@)Ixҏ֕bXWpu=0gR].8f` \~@iIUk3*3nG[pLֶ>"GQ>lsỞ54i=vU(JG|>jd3(9[CTa36a~XSHnߥE&,Nlh*E;Vt (bQ#yvZ04J#KwSK9 ٴe+ʮvHYP4-{rOAn&7dO2K![㣢) g̎[VwH{1De")RۃG}U r+3r9ޠ&ye=ObG" ?FEݝ'*Y8Djgkbh 2@S, %p-IEnʡ՜ZŒ0D9&"?(|zL~nkHK&iH7&W>ؚzFa;g~S&ܼfΟ#p}鍚K: ~x</@G_[=+}.,)w!oK*IJLsI5(r.9ς ejk ϚBo& IE&X'RuEO$K6PL3g ّ%ԱX٦$qbQ*RD.w r##gO~Y9Ȗӯa[ a=KZ*TȨ<?gъt,zx (,t+7 4 T! ڦs "yRaףVX qm|}}TJ"X.ed:%(3Ss:ZyaLHe+qi{ݚf=k7޾u`Z`/J⏰"= O@䡾hb=]8oЦ&&M*|Q${Sa(߾V4>U0XBޙR/H5Iv^V"KaqC9f4p_Qc@RBQ>WL:UlBZ-QE5$n &pyj?1@dA}6 # }`$(< f^? OץҘan?دËav2+!pYflfXfn&Ohdq(蠨 ̨~v_S5#$] DoĪ\RJuWg>pQ:Č 8 *%nc1yĎHa^Ǭ3&;Hm33{dH+h'kUP<޴ VnZ(csKp}MVz)U v3<N:v8ݣSmVxM(&]@~^E#Md*qx_ ϫ Oxdy\U@tEr\"}"Vov#0F-$QdcU?Xe@P&Ì^|g<. utsgTMu6rwÉla|P*Ր]Q:< Pa̷8 ^V~9ma7պf$`Gd49Nڅ& 5{OˊH&Wݽѱ =K+;/>] ݿp u= ?1DLd$g1{nW= $$ i8PZҊD93Fn:=C;2/gl f„Gk:*%G@7=1m7Um1k|0 1ͣDNJy6yk8t=r[XZ. ']CѸd*r@LLf2"P2^՛.x+(ˠ.Pyp#, ƖBVQ*88(K kzЅ65Ebs:E-²ob< ~]P TF$1Qao)CpZ =|>PyղNw,i#7albPaV@ 嘗fIַ$>>H)$on"Plck"rLŎٿ8Ci^̐ϱ-G06z}')2rí]XmS`!R]E˻~>W/x_DSw ~5 #R7 ąK g{:qI s.h8K1q,(H3>\jt3_&35=/[V}L<>)em!;Rc"^s :-IwisMY: cJDTxm+Z`JA>6ûheΚsIDkZo*!EAoNSĎ*XO^R@<$ƤUaG*4MUddDwe"-zz; Nqe]4QZf/$Ԡm2>pO⣠>Qwz۷3w6PK>mSJ wMJ^=w?u,찼M^QXrd™_:?}{J˲^-9HeTBK""xf')hjj╂jT0ujwcʇs~hsyAo{y }V3xG[=Ng 4^A[ ˫ ?kޒ"AR(*$u;/#N:yHt|*bGGnأ8Mk.@y+':Q ~>Fml}-EXdfy|#} wgmٻQH(t%Nz[oϴvE2DIbw;h" +g}qܡ“Q"h盽{ ɑ}(AHϋ1 z $e„!̢z^z/_W B+i-+4%!ZhRF{@%I&NQՋtWRIY5N4mC3Az݁>a78pcw&70p<ZCs fUgk>N<vo,dԎ(+aӜ+3ʖӮ(4mqy/.4Kw&␘E GUTp5X+lm)MBgv h=Kk9c.ZUdĬT\WojQsZԸ^#RxLmvKRGWFӛ$RToO xD MKv`,U|G+r͵¢Śm-C/LJed2vz4:ԴNvhV1T Vj{hwGI5W]6I;N \Xnil@]쇓,Oi>h^.`Զg88;}6sqICr%\fHmH"I{Жoa`oOkO:"Kdz9VA@o6M/b0{$e7;ve 3!<*5;?<GTX7>줺1_E I=8*?f. m` &m'Gq:_*oqbJL oïdآ,RUF>o-&D;\&Q4 cUL3Ս+G(potO+lX}l·*]\fq`3WҘJ}%f(AQ3[z0w4Z#7dBQT֨!7sπxWzZ)Kb{uy6(ʎf"مъSjfڪ ܲcyd#u{=c3|kTm(Mr$^] D޻{{ w̵ܛ q̿Tn=_ luSGř$){tJtF gUbC !XS$̈?MnGvHe͞ߏ>W]vF)uWF^J prYy,vPYT "ւG1|$/t@a H0B#M;vT@j]'*?:AܕU\MT3Mjn(;osXW,!V~fhasu=d12m0c6\Y y%wU-Ʒ7hkC<2yN-<4{2Ζ˒v'bD?Ly hL}ol (>&Z|Gp60俋ow-P7ʂL״l.z(A# ߵ-(!4 ĭ/A1 ڿYvD&?xmǷ_2ƃN0C[hzsG2̳U'TT"0 GZ5mP,aN.|i9:TMPYs[yC>K3d6T?[la=ND2>LpnqL]h5 -^p`iۉcV\^;ݸ|[ A)n@;p~ZqO@`*袊,K|7c2#6v@$^dO Kg!m(e-醫 I2%dZf͚nlLs G!kc؂Z^͉[%t $vVFJ(j;Khnv$"{f3<~%q [-5(m9S2WyKCs:ll O),G(_e%hp-l ]e~2<_Is2#$tO"}4\l"Ou޷ && !rfxRf)JT-%'Ḍk4*>T;XkiSU3bKN.eULlRp&Bm(հ%'kЦw +$kٟ˹ X: U14jA?˴܏EA{4B[[?8n9 +5ZqS7jϮ0ejuS߬>DT,ݛ +vC“́a38bv$6TѼp'+21QjK/AO=aՙsYǢ1QkB.Z? ~6`x5Ma^H%6Rw^r[=Y) àJ;དjlUV>I;Ķn.mAWlJUA\BǴjng/m^|-_&/T0fG'h=0)fK=tG l{ V^ 큕emFղjhfV"l-RL/ݜ5_d B25Tմ Ppͥ*4V=V[!$R,ΨHcHοbs+ WLӲVU绁:[8G1`oB=f. y R2cy)*n$\A|%RyK>r7qk(FNLc" slכ6"@n!ytIy!; 8=  (^2k@uAzW +UWa嫒wi, nNjp.^ߔ0hk#89@1~Νv"u㽘 geA“'nfj]²aZqY^ \&$)4 Eg#)Tp)?2wC-R!n#}hAAwVA0^[_jӱXWA;7Nz E+O2S'3;f e"OIo+ZE()}e`vn>;Uເײ!d%%:!KySNRi' txrGΥ nfyc ʠNTOGnLXX\37/$詃[5`EwXO} h [CO!h E\. _SM+1g+N>Mz +i/2NŊV7Ώ Θ́õͪs{ 9鱺Mmު\jiQ6H af"ȪU1*,3y},$+}|gB?]q,$a.i1u[цu4c:9'/( ;5zbS*[0;X&72-+~np&ڠ4٢J-†$LuW}WaͰQ,*puj+ZuC> pwQ@J+qvh}/1Ub P qPѨc?Z; 2k>]zA\ M6ёz6M~dp*?Դ~f~\QrYm Z.jUPv@gmx16$P͵T$(EW[mLItV-wrqmfȻ2eU7iW\e(g7}m ?~0u'>)se{$kdkRCRpӕJb*zi8m8 jgD&z$}aG 넃9^ 1tm>ݎC =yvp$l#:7p2ӹ*3,c!FOIpb/~l_a™VhF:Ɋ*tE>\"AG^77f4>Եqfʩ7}x;tlZ0GB≠(h6ifw GV/wSO_,ލ 44eFܟfYA+->16aμ/Dخ^p= ÷PUU)ȭ}C`NL^zq DDm5[$IbCc9 (0:VQX7l}bј`t#1&f7&&7>K7< ˪T"l[Ziu p)~q1Aw|a"X|}O55!]ĹoL[XF!q#(/H%r?ĴCvSՁAf Gm=u֥&bV,y|g[^Oe!w2g"z6xGCOȟ>x>^w1m->I̵D5p8FT+i-Uu?)D߲, q;zdt#ޓŒ=K n61>,W* 2#긨ᎢvLQ J  >8|(yUҸ6?Tv1a|;to\ǕHDm$HCi`1'߰!&ϟ-ynrwk ]·l2QpɳbGWMHxlD\dMN" &}H+d=:[LI*1$wҦ7Ջ&2}4n(R00..#]&qHBz:-haXH3< і&'t =+*S[ՕLk\:_YCh2VVXeA@B"hŎF>")vf˔Ʋ%*Y;E6G#bi9p0e`ȧzKB얉$ȧ9TKND֥w*Lolf-$ft2Oeγ̫gZs4y!D/Cfx`}@\o/7?k[1qO_ myOR IpaZu9r['Kk~ʩ^:rȼxr>Ve3A-@ ނ|V$XO GƎ@Hfô./0='1hݛb@>5kauV29O} vj!)}C7]m{^XdpS&6'rr>23tZ~ [3{B+Կ{zױ3Uɀ $`jv[meZ%~d4mty~LBI7`ö Jwg`zbЀk`g<>5zB5jY9p_J_2f(5":嬅͸iOvg(p-a["e\QoCY?AC8j0 8EGEQBR cVtUĶM!?]% FnoR`ƌf0g9nW )p5&$t|O=5YFb26 @tr-z!B ?ohm8X 测uCe3e?Դ 7K'*$|X/#p ^<7'd=?Ь(.Y> +i5tegW-n2_x^{mpgtcbuh־:EÁU+x @8Au| T]fwd>cג̳p$P?1$oBӗ78s#eKwY'MxM `8&a$52߬SV(A Ed\~n@qW%:B<*8_!SLcc1s00_Pę#2Shs;;*,qEWK.Ȣ*maE{CixhÚEF'J3@>L#HK@{aClж0C?:c™cR3v]0_7HEw5܂jd՗=zj&SN; 3D+0jQ%T4@g~g_LAZőtHYF dx7)qvgSp3WFpeꞪ Ĭ/r=@zoSe,vP,xSmlmw>U8YfF ~SZxO4z%GF[..%NA>{G nbNwLq wo%Ti{Rqe٢9l.d%^Y瑛9n4֌Ti257ѕO\sC̼<ZU LV'fmx6?mC*~ Q_r:4:Czo@g˚\ISS}bOL*fLr>@DLb]zsrQФVЌZ@O쐬Q?ČB:ӳ ٯ;2#(N\<AZ&)u]8@lYQf&1S] К#v:=S,bi\Cf2pYw p/Ea 2$BJѾé9=|sъC=0]0)Ґkߖavxi72L4@$Q^`K'Ҭ"XKWCYH^ hu(VwZyv⹝&I&ub\OAځVkuvճ ݙy@%Rh/[BB.KńWwl@nXyYl0_ p!K9|tNj|ljH} Yh?\[5M6 3*5b30a-s,тWVMIt+Iׁ:Mb[!1#D[lr9ONNU*K0s'CnGPզuY _ȭk4lbGUލ`,!)B1f!ڿۆ7QCOBmi8ꂳnd-;Yo :)E^Gq^ݦ|{k yP%WV-`P< C¥M>,!O.9zB{TVeXfwq2FodO`a@=2~.qiB FZ[eM *d[^m@06Bwu-[`LIVXMWTv9ЈN(KǗs8(k&˾~羀uUpgO͍K1K_R gbgrfXE;bHEYQyo[4hBM,2w te3LÌSC8TՊhN3&d-_cՅvX\V;\,}~36 jWIٿ.1wﶕ !Y6mEDNGhACucwoJ[vxk;~*- (j5#pd`WZot"{ԵÜ*'C_.dg49h!@57"f#24=ّM%˽bӈ/X5h7QJq!mM{tp\9U;78U+p";ga؄THŒ Ou?v¾!,]-F(D.؛Ctq"ՑW7p\}2#8T;@qNogZVDY @Id[zԲ4/$R*DZXRG@ 7A*) ˉ׳i<al2&fDɐJ]g@!yR e" _+k|E-qiړ(WԻm;͙Us ,93.I >1]nc;vV;pCle?VY̵;AiXFvEAS#L1] *oAَg|ί`tch'cYTUޝʒ8]6 ƀgW6e95Q8,2_- ~zgk~D,]ՋJ hНD2::X=+c4 m"(ԥR`>=PuS픃4e|_XW-镳}BJMσawQAo`%<C1gDZA24٪iv1\>*Գq |X}갘Aþg0$w|ЙaE7 ʻ5 `ʄ%y=-EEUX,e[)aT 2տL %<|T̫L5n%D!2eo[v%:Iþya8 LyRO(P %ܝHrD-LMGJ7:CiэXe Wd؍(`'бy]HGA{}*~KxR^t ydާ}l+W%RUMT|8yuX>b hB&PZ)^-28Vr.fISE:퓡Be=__xf*Uc{YC](H0_!jFqӫ`N{e01p9} &MmW,X %|SﬞpKF)𵝝 23m&7ʗӂj~V7CwDRr "&Gjw#F!hx` `안@7GC( :$q Hjczp;ϲ0}nQ6&\zGC3a_AڀÀcm8vdW Ru 2侁˜gN6?:ƻK.;tcE<ᇊ {&3` |%t3!3*dğ8 @z1|*OĵT%tUע)#A*4:=Jd[ݚ7_Iߍ P])i?1LaxuYjXn\ɶrK.B+}]lwU%%rV@DrqcV2D @fBW6. (}w+Z^ki {R NЕ5.l@micDPxA҃8({@Y&Tzg#׶2G` I-`Ma\ͣHъ̔Aj7,XN*L]?@+ /('f:zTA&?ҩɝ0ł(z(?XGW^ kbu_RbƒByKLJ^gnhI35띌nWx=-Mm1ĺ^֔jB= %(P#tDfnwg [ëD|ƿJ'Ӽ7!)N"f=рpsGK>)ܱMG6H\VGLE\:Q}\{\Цp ?`IgqoiDM1Ylc 6ĸ-VXhJ2C S\AYT тHPE7:ՇJe: Cw;ĜcNE;tgagbvWw/Z>`iLV/gt_m7]_]b‘(TLNhZ$nX&9cQ/:Ki=RALb?{c-hѴk%\jۥi-G0q6Y*)ze?$Jޝ9*CѵAㅊ=Z=\V4M$7XhZj:)k+2Q&o_&+OgOO9g i"$g+сssHrkBr2X/ V{P)dXqӗNb7RB3,= tV}{:۳~AV1G5XY0! ^JTIMkDCbg\W\~(-PC~ x>Ra@_BM-@i@{pDBfBqn O|R . >eY4&ѺҌKhB!E̦Vc#IJDe=_;eqb `ZbOWYl}sLѕ1 K8%/S-q O9bܯfsRt$_~MEҴAn'ZspHv =b^AYp$?֩q^2)313{qVzQ]bY 4*,U+RK͈F?/-Y`?I®@׿Sȭ:cf]p}2q0o#vye|vliw*BƆN9:mQ/ƈ`Φ"˂]`/mIF$\}ب|nՍ󱌁u%T ς+`F\kwt߹zM©ib e;gπ߭V>1Wb!|k#Gq+1H,0s6zDhtwlqLCӞ(Ѣ9,1d}8N4)Hc0VS"t4.mmm96'0۬fD-9F7z)r7W$ϿX6cL9_[:\&7˻O{.V/ҏcHrɠe=0lS\%PJ M(+k[jAl:)BlHi6kúN_*5ϸEuL浡 \`w*;¤<\?kv~ &7q)2CZ{d*ⅶ޴n!$TPu l[ЈO`dh;^+M)acς‡-VUM;N3Mxw:1$aavLyq@] PwѣfXಞ+;ʯ|a2JS vf+GΫdɤfP=`] FŕaUoY)QlAVp T=>}4޸۱=j-:<9Ia^'r$(YJvGr7TGɦ" M.0H{\a*B)E6; h_Q 8I-뻷L;^, ?)B)Fj;}SS> c`} ^jeʖٳi:3F5L+(jF-{j>Ұwd-joQ,yCCN&Ie[JS2sS]O\UBn# 6暥kW~H1UkY:={]Am|`.PTNgt?AT6y&Nʁq44X>r6G,IڑL5(dVwKV Wj} ?mvv<&TnpS]ODN@#1S (MkPT֎@ (OZEGcOSjzϭ-kccKӾp<ӥS9cHr2h۷õv- AYM[H/:8 {'3zJ^.nI\0p)vxr>t_ =Lz 1P̼S! 17GBpC_1qـ[g[rv$b^f{ӰQĒvI=xeת"_fSTk]!NQǂ`lzIrYQkw;irk,ǽ'Nhtʣ_|a JR-Ҿ05f֭m?k=ڏ!c.P] s[Z:EM.N|H$0 Cb=¢O,OTމZT:ƩcS/59\"la}(<-O\^MGyy{OZ ^'F6իX38ܞ1ۄFm`ǂw|G4N@+l*5%~7\|zl4,"nxDL9WK2qk*w;;w2b豌[ZA v$#Gbl?$ t^v >;-V6Qs+t恑1U$4YOٵlg'*FsN[j, xˑ#+OMG8ZGP|0K&u֭.lumUtGsJw'c~MsP.c./zh. IÂP;386d F zz"nYuW@ MlqϐXĈVm%(Ve!yZ?K 3$UC/]\kAR]/ܤ򑥤FmCs;nc !oQ*HK܄`G{U^u=Z7ɜorN0[:G*9!m:- .˿׾4F^y0;ɘn^i i, iWXξ:!aLJW#i'Ǡ3%!>9`MNy,ʊc}A6)1t˗|e-w3eR10)Xk^[{kZbq+kk*q~]LKŖѽ7}•X*RX nЖ#c@SQj_g>&LbAltqU.&j< AI6(9?^'|6) ҁz~X` ŊSk5pY}C^M[0l[̆sjק3~ gՌMޔ[aZpNvKSt'?(#dR)ieF9Wp$AЧp3Qw/x([_2{ML$وHܫFHOXpci1WDnUӤ(pfq2a DunZ.r0~#Iˌ '+x!sL;wdo+Ohegg+R,{ra`<&PHW]P)}/ݿЈĎ*y1[W(kݣCuY=z@unz\:4*@KV0_񍓾a-X;)tkAvwxT#0,pD9tHb}8vu {O\\y!U?b^Rfuמ99.H̭ F l-TpO/sy͙=S>!A4IvS2K5ƐĵF 8J? ȒeHJY=~_D2J3[,k@XZ[=K%ޭ-.uh6PkPO@qs J ;?P?go*hVKH3o]rwXsK*V5{ ƈ?_Gљ>Fh VA Q;L'.w6֡.=4H B`Աv.CC)3MHΪ_4aԱC usNiTaRp:^m9p HE1Iܚ| 944w6SDV@5ɳ ⩎4ed?ԡeN=8BT~j;:Cxdk!h=W /%s yBKɁez'o2Z!7\G o4'|;K`r^A\WRl<qV (vI7 6Mu'ȺxˆjY~G˜\MZ_sij:S".20F.Hn HAU[$ʒzWZ>_7O6>_M\8 uKT;J38@^*,FtJ`Q=0][&^Uvebe)|Չꩢ#U'PXTG"i3?;-=_//ӌb^Q9 )ԋq@ ǂ&GE!g;"_B𱂉華QTi/~<ր\}M3Zv4eN8逸ZC}$!fT \eB[5~wK[]F`oZ&ļ{j3Ubs& sb^KML.b^HVjkK0ե (s4[o8njW9nCQ+sGPLtmd+чŴ؁+}C856Tx1=i^6B}a:N~Z *ϹZ;|at@lPLy:rG(Ɗ7GD=xXZӆQ!0`L2[zEvڄEBik.9rB?$뢨2܎/D&@4f!)E ǕGTll"^3\JiޮדU8:J4"g~s d/#~ b+Y cªBŮA)YWf4AʪЖ`*ꆋMy_O5bv7S +\s|q t!cҫӴBb#ܛ@ԸdU6 _âJ<''nR쑼vAY :mNiZ&q+zI= Rt.A.o+Вk:-i*ᖅ2A ͪ1LIau ǝ3񌤺Z਱|1n*4XVsԬ/#GH'E(˵.&Ϝ=_&W4f"u s=jոDAp1\rΫ{ g469ovTrt shbzJ8sJ\D{B$jM1M{ puS/%bˡ\L)hSv$W$x~g,_4*sjd}2ɧB_3\^OR6`ӹϾ$8K!9~Ls>FWdcۑ &ÐX+su%G{r4'QDuIپU * LS/A\l+@v R{S+ YOw+Ppf8D(U~ֶ7@ $",=i {mWDv肾vSDIp|ݶ%:%m!GxGDWτfv@1c)-Su]8)x0B;rN?CSf"ʔ5=#,wg[h,yz2! n<?׷41)<ʽ? Z_.R&u%fw` ,E#&pq8'~/:"x˒~|tw'SWc4n#dsrU.w3> dҜ U}ع$U-"|m+ZP[7_`%BH$6ՌhZ2oYѹdS!i|Mf!;Rl3ĸ|JA%V<@ լpa8Zj}d@' !9h3 q?4eaOvp1O Sަ>R|*nkB\NZV/~,c!Ɏ8#ᑟ$okYC6ٜxj41DlyŽ4,fu/Z$23k~-q?(k-45iM;8c'/>շ*ޛ#y~EjDȵG]RriR4\;ԫj%wM[.°TFۤb?ə&A@Ӗ^#d5T_85SL>1k@AOB┽Sr 贆!,|;JB ~ yFkdhJ'h. ϿjNX>{WZώ#g!9z1I0?  ꎓTz<@nJŃ 1*2ax@Fu78!`/EN#'!R׀]&Z.o7掖Ӿez?}L wXbvzQӆzSy\coЎ(nqؿ @Yox;3K8273ɚWH_)UFRz~",NO yd3BjO,P6N]`{G1t9긞s9DOEWf|,4 wҼ=ES3x%co|)/K >@N TbC;NK#>Ks@:fv;J jX@%ݓ=?xkQ!TٔQо^LG2`IOmJhY,/ӏŠ?-F?y4`T,3Bٛd4P^/xk=:ԩEKږDAd/Q b;(~m"|h(ڌο͔_qdJ=:jctKxZ:Gzs), (QGgfz&p]Y@҉cQed,n80X]qQYзP;w75<,&?aꬄ 8~+=g*C?`KRlHَ`Ԥm |5X0 oty [gժCpcMA=U<q8sm;V:\=gO>:TLO%ٴoIDCK@C"fSRTHY,id$Q6yϤ}'Tﮌ&Xj[@=8*QwIwٌ6wKw̧ vɟe[a0,x0F@@$E8\; ݎh[_4-ZUQ Is~/\4ڽ}.k4Bֲnͺ!Y>rJN<7U9w!|C9ʺR~A!>g_dE/bVZ#Gi9y8EX$i$7; /ɘF;;M5ceMz ឋrSXpG]펨@q(9Uؼ8goVs}kes~vXH<+ui'S;9'R.m/>yjG(R=/N*,;rF _@a=93ǀyAD ta]@$[&`IT*ő*&1JKOU0Hr3y#8짻VV LPb+'_`Q^KwVz%D7 `"1&6OXP 7nI/J C@|CtDXy}=wo-f EXϊΌk7BlW:0X\9챮^ mw2Lǀσ*kx ;Ͻvs ESʎZ ڨ+0\);A sJmn?^ͥ+ w[j ԙ䝚Zhuds8ϔg/ʀ(-_i4$Gؤhb19߇m~~.$ `?!K֔qEVGnHX0V˨\wO:8! acssw;qxzR'M!*M?:WlC|oݽ3ov7j6&Ҵ22^RojF3]L)7i#ھ}n._gC'fdnV0!K ~ ᭨i!cvµX8kdp_ Ϟz<'țg"clCNÿ! vF[=QwoJe@-!K'Ǿb "͕ Bӌk3, K/e+qjLK[WTngF9}kަKN}pzjV.e32[)̝Ǐɷ1ף˘8s3n= >Y .tMCJ2d+g@䶹jv3x2(',Ge ukdx06~Y,"$uC&25gO d {`Scv9{f:.~jR/b/\-P+&L*| АCzcSB+¼8p%bvƛrN{ryU'1ߊtQ߭. !xn_@54}@ԪQ 'ߋor8~O|CNvr P&)ȆVxP}T_ƼfJuR`yScTJ 8}'H[Ȏr(<ƇvHz0ZڏFN_}{^I"5EmB΢-Lh,pr=ֺqw$vV\{f[17W?h! {?E:'$rV߸'qΆ8\<<) b딤mNT%HK5blG 1)cBPpV4 7^*MꁖuE)j] *s*钏uLu-ǑB Tl`=elp!Mɶ9I)qfYE{g|BtHi_x`HXWJ4:%\#n`+_tQl>Y[¹r@. =ಀpoٶ@ MEYF^0YY$D մ#RQ7W?V-'Q?Ta+qܝN&g]t-^HSmH~DU3na27܁6Ԗ'8*{G8a@snԾ$;oǬJ6[1Eh3YTY}eΩܺV~0_M7OC2HWniw0Ń'2GڡU:flBHd1JTI:_`W#/Od͎4p_iPw-`lH4Df+FԄ:9L,Zb~.۾Y:bi f_J@ | 䑌3J*\`6 #6艡 ȾᦴxP$u:.N2G밙^Si>N{Ƨm&3Cg?MBPr5Fz:ֲ}ï dcwRh/Pk. -_RcT FPuءo',PwgS÷ʎswwixys AOٞ@dYj Vg)]gZ%e V:u%gͺAoMPO41ANW5{xG'C(O/BÅ>њߟRƜ"ER̎ "F},CXcUU4O9O#-`i*=o*S%0)hԻAr:h?/~|񠡑+EOkJ1n|dz>ʖ=%>'w{8?&鶃=G !`.޳8 2V.W 8 b& TmyE!\`շj@ k5AǒNt$ck0*v.eK|Pn"yPX [:פ@9H/~JT*V_o9Uݏ,"cg?Vj`֯*g4?'&x : ll֗.|FiVXvwa{h+Y}aՙCD%bLxm &^[-e\Xv>8(0-HEжP=ax^vY{ʸ>T?r^G|T-f(.,mZCc.iaY V_1k2]VD~7ÚuE9$'}mTM 2O_jn Zϯ8afur&eRxTY 7.2r0FfڵVFN:a0+O٫uqȵ9;&jSH:uـ~&Xj'EQp5׌4OJ J -YrJia)? }i̍wbŅ7FVݾ'BluKz!txߩ$o. wZ# 5?NG(v&.XfǂWFf!arVT՞~Y%+q(0#M@?w\h3M#Pb/tPâL?!ٍtW0dO^PHo! t&Vf !%f ߋ,kP4ܕ`H$T؀~7z+nN=g7ANu8G6 x JdNj'{3W}R\al;~=Mۻ!gxId6'}OEgGKg^Qidlc'kc"7fgg u  am\7A$]?H:JWM= F%皯颢LUCUN iK7&Rf${kyPUV ivѺ;LV&m'>lqE1=9?4r *g8ఌSmʅ2ʏ-m[vѴ@{syٕԫVˮjZ6չ@B!X7>smA߿}dʾ0?A 9wJ0hy!#X,Y$-/=!a_PsZ]iIvPeF~A- 13pu?aVFo7{X5d]*vC 3z0,C6oMNۺ:Vo0m?FdٳG[!Y#F/^kdsNK)n s5LRܓיt9 CV p~7[4L] 7̥;}ǟEVԓGfLGhJpSI#y8V,hbY;!>V0-J,1= ݚ3 #''Fq ESKjuIc_|ࡤt*"5̝yƚbk6vYnƥ*H 'YOxHC$Piz.Gog(eI;em\Mם;N ų3Ȕw7pd8rnOG* У-ğlh9o ׃%I%2K~`4z׼-U:i9VW٣ Fp(66Fc_-7б]ƣJ5c-RAX\;v22O|hC9yTۘJz"\*PO[J*ZyyMu.g`hal܁-e?n8;.JL;IB:Dr!sztЈV#x (Rrm[~&(܎llh-3k _a$cO:]ui\b1xkYUѽa\kɓd; l@q4.D{krJ=ˇp{E^:'mKmL2"EPwz0Pg"҇ZU&Q=x)f>Ye(uˁ,,4[_+|8ܻŋbW.qt݀yzwˏ$*Kf7%aT$/78ɷG)!%WSf6B6QKK(҅?*o]xO=YϞe> }]/bEBpm^= Kn<{rC<%T C%APG啕!o]7OKA- л0xX! 3б{sWmVĉ '6WcGIאҡ Ȱ@hϯ} SÔ)YJ1~ X.v8%{c'K{E9rN1kw o@j>_u&PU,.Kiڝ.DAO^Ždtt0U09 W߳ ^+'qm7+\'ym .ƸӀ]_<077I5'mš~ <|58 `6ڑ.F=C׵wf;c(T;q>IAVS6WD{0[@>*l1{R_E\(Yf"#q _-x殻&c) $}{v!N߇^$cDWn DAXO:;cb 2?.WT$Pq޴?THjeBO0+фCnEƛDc3>}iA'T> Á*TM`^, Z0M:-i,,B*72 h܎Ts^IDH<٫Ȏ\c$a`W 9iV-WԸQEj|ŗGr+4OLI"YU W{3RqVwb_SX;>@YxWlDEI5OhH ^LN08&NEsp{-bK\i|s ߸mk瑃Jf(-l:tq0f԰tYMStLUVS. ' DNn2Q;^BYڏ̼åK=ș&y̍0տ[cP"cwV ou~Q/?QhB'l%Nj25p_,9E}{.oDx>kAp- 5bexҥ$/Ww-ˍ7=Ew:9r0UN,X2Eފ%d-]4;3鰩ZB'"xϊ\cA)gيΤ+ ͌{1\aσ/>=kynO F1W"DdܝxMʜxi@:u-kۢ\[=юxR(g;‹:T%BmR#W[-Cy_n(c>s01e G*? T_B:5pr,_~i#q$a3g8{ 7Cx10Eeq/K! iUjFhNv I#u1/T ௡Zyy"إl?Bo2'٫lyұYES٘1*?qh (n_8<Gq?v㏣ӵ5EՋ"m2J pĐ m"aT.EwԀ[Z "b Lb5.xs7HԶ$"oFD7 F:7Rc; [U(=^VN$mMFb/;ъמ8I2m.喂<0 Y, <-kfԐ1k\xAMRӇqKC"ndKM61'gqY&I^AqքIQw|ѹ[c%AeP!lɹfnZA]?bMa|h>ԯBlx%1Ԋ%fPh'Sc]YQVW4`I(RC1R/+f6aF^sŦ ,QwEM0 fs+ b{ \L,-"$'8c a+PN\/.%|8aIE O0-ursTX'D5š8Q?ɣCXVE M 3@DQx厰5Iuȶ~EysfX/Z̡A'wdc@)!Tytr, 1qq_CKTmnP|{焥SCnhrn^L:W("ۿqAϗLn.[z J_M]e N"%]6Bc23'uN:7ueE_P^DpӨ նA4jWI Z/yu#θ\waJ9Η vf!Qv _\X >OЭfv8bIic:Ge2$UrGʎ /'z*1&-՘OQ1hyTկ 7R,q&4M l(m1dzd8ť)t*ͣɑ ! UrHCSUR}vEx5NDE0XCΔ"0c]t!.ll\e 6smȽb!4$UghijDu2+ I^SOCWZ:9oe ⠖΋f׈ 0$ͩځ ,. Tgڐp5>ꪍv/"pIN0bIYۮƉE֓ c}lM_Cog {n©E>4Ƥc5_"6u)Aۑ ^2L>_G+i2a!ܙEVܙe.:#ʵǢ@fɄ܉~ Sd`M{ U; °`S4 n?\$a91`:(34/̛2r_pk.olװc9LMB }zhh0=ءaҗX|WHE+5J߽B˟ïGV)QdDq"W|a*cUkr*$xK"nX2a1!?/{t0FIMnk/q?;R?L=s~L$VVI Umr^~?}K81,!Ej';g?v*p&+[@@fMJڦLz]kŖd)ƫ|ѢW'@,CCor\_)`fa fP]ry0 R bU-O}"͢7].Rq,N7p9ח=7~127;ŝg T旘ˣVEz4gs!TV49{qP!h:KFzwE՗[1+͚ áNWO̠/duL(?|T}aDu|Tgm{+F ٺ' &`lSL/vUY|V ('؞Wdӽj[=LJ[Hri0et?xr^rjC'a7eeN Yn; wj6(ݕ,ٗMbfoeQ0X !)6"(ZK0PZPВ H%H DB,YY]5ΐ&M S _/1`ۙ5(:mʕ*D%Uۺ $#D[4|X 5cr="7D!QŌʭmA7O#G$M SlT: Mj豂8j@NGтkX\2[9=WZHr#v1IyUI_Z7qE8.t0A&`CcUpPaBNgQ5t/+mjՏ ON#7MȬ¡auoyI+a[&,X}リt܍b@Ogُ^=OB6 D;ǝ)H1Rac`L9'bBbW&L)ޫW&9&}39<}!%$vlO #[e`Mf KO/եT[p\Էf{H]780ɎySQk=[[n0+͆7TLYۤ<`5O]8~#zr"ۼ~^as,j7K*mPՀ3uQVԁ (-2f9EvXW ƒĥssjzby+63Jz-!JYѼ3$`$!FOCe 1%YJ_8k-U9 K(ycZޠx[>LCRia$A.nr7&[LJsYLz.%/42"VYM0^.V; Wt# {^LB)Sx~1Q#/Z8D0q |hie ?ր2êC6Yz/pXh-y4AƅU/̂Nc{HFz;&mxO,c@C Nd~i'o @Lgeu /3WWL'|f:iV}'C/"~SiT_ۋRT6[^O>IyG+)L#G씯XZf{,~<y |Юe|w"d U%XnAmZw_"^"22T720K'uTܒα(1 ryg( SjQe(]i\ Uã_((owz |l-0"H0xLlN M?5'RD$H.ݭ"w&H}ċd77tGbM7ڑgSKF '%՟G TSҋ1-HG ,ƥ\"=N\* ȑײFpb.}&aw|$_4;[7bS;Fo!C\Ӭn뵼!$DBMQ \ffS Wt]ܿ_3y")lbhG\=wx67ݾFP:_wLMz- Yu0UJMՏN ( i&T?<qQ|ϾϣLZSxa7Z|o[< /f2S?nb_$}s?C; \!1 YODHU}6/5:.0hR Fy y5= A\w]a- gKGghK0y7F=97,S)}wW#M,~9FzP~4ޜNu?AB~b}dh:ƣyAqs #\wu^`C\F=_OĽ.ɝW)R!؀6A#!Gw5+m2\Дi$?JSf{ө*pG*JwnlP>YU^7^lsRշ 9-&^S5[ {Y?,wu[c;S56_Xuq=xy{7> Cȴqf־¯ p5̓or(OׇO^(Э:E jFgՎQjYŴ$(A-SA"vOi6R*Ytjjo~k8 Q C_jr24 ҊO7^֕JvK_61ݑRcl !UE^Za;@_.ǭB.~LZ0b$\G]s.+g4f5HjGab@|ތL$IRb,UfJZLىu+YP؍1}pVaVUQ y7&s>u?$tק[_63zûT}Ƒ։ Fb;1)^~t*8<UmN?r#æ<T%M bepה3Sm"(h|PWS H~␟DӊFtGְ\n@JMghVþ$1݁{q[?Ц}tIT\E EfE%$ eԺ91E#ww!4s?W-`\|iJiJ3ВA *|$,HP7 .%J GE(!R2GmE<<:{Õ]I -з9rK^JR_ͫcbqȇ6?C?7")?>n[ n,+ d%#n_@ HKs$`!¢ R[v .5A) Z#?0G`yЦ)} kf܀bឡ? Qϐݻ1Eod=vw𝖖kU#>^ەA"лHB8оN% ?G7}oR- [v4"xZC5ݛ)LFHy J e?m[y_uP88pX"ut q6k=#JԞ~խa+$S1=ZG85pw+&Fg)RD+ #9+̴lũAԄ +)~>4,"xPbPbO'ŀߊO0J;,X |8lUb9ݫVѮ&\Iaih}t eX4g PiRI~ 'aȮآ jZ #4TUl WAm?A@q؞cy^ <}S8EZѡ4χXg֊=IQ4@TfW.vI5M;H(tP&\ Ī+?%sՔ7ajr d"~kExByMV2l^AۍXxIAZ d湪 T]x(?$@31F< /oI"NJNyL"̟S҄0ie`ҿ1֓L| ;|Z߻, SVpv=r̔RZ` Q7.>FjlhĕpZ+XX֚KQ(dHoN Oo.;6HIj) t |f=*H>B#kgIŷft` %EKfV_;9&.nt纥EmB!iOia?c'^z^<!s>#OB晾{NFIjyBJVV*Yhi&XGU w) -s,P8&썃|\ :w=5 Z6 hJ6{댋-1`GgFr]&*eZjϱT\RWYہ~K.NbJ]q(>Ӹr[Ji"GisRK{M]XSg熨 h7V핓pAGe&s$ ~TTKkբ;9 _ z%q6n,dJȕg6BOGjhxGJ\5"(3̖ 3ۨ󰕨<3y  5BhZԕ}BHcrvZXd;HQJ]]6-Ly%g G.;f <G!+s91Ȏ}Ip#gL[5fLנDI-p.`.0/$>e54xZFHJ'ti`Aq%9q[ .,!&E6 0>E` S:efj_OOKTPxZ^ 7h3=6Ġ1vmRjrs '˵Tu*aWR'E-KKnՑrZUUq;{~ߥUV`hKs<ځ:I§?vAp2)>U-Cj#t{U>%b6uFsh>@OV7eF̝2Bcl< vGMLxiڼObkS=<)dmwY%B7TJt7)lqpHwW`b=> 4S9 |2ouz݇?QޟIU^؆q_,n@`_qaz>czl<gGԍVT!n|VY62QҦ1Ǒ;\wHyd@ЀX'\Ր+nhj:FOֶc9-\M/ H߹p T)H5cEr&tkFC'OY;BL&M<8PA VA}P@W@"6T`ǕNkO^p3,G O5=9`6բ'h6u& t'֘XGA3(\p检CKEr]Us4ɅpkWx o!G4?sܢeMI5g/%WV6Ц,Kwչ/~Oyx'.a>O:{E fܶX쎓-Mn*aVvB&)F,"v]ed#=*MD6ypv)FEA%z5N7>ď"^'Os w#wվAuHCy?bOT(C^=hWxmwW~-ZOixozڴV/sMZ P(2BM0.Y>#G QQQwṴ䩚X%u)ޯϕxkqa%[wB-):;F? kE)HH";ֆ"Y"(7z$kyA,k`i6>ootIO_=r1EVɷa k"|:&?H}%'5|7 i;~bRrCwgA\!G QB k3tXVAxIaKD }0vޠyN=o]SWFf0(Px9g;XP5 x6u-L+e`>QIܬ#XG=I@TCQ% قqf%;H6yfJQgXm8$'"}E4[sQAJAkA\2JֵaZ8D5:C t;!g2Z4# ҂,`B1K*zTD"cwJ`xla61SxYʈr$jK*Tl(\ , u4P]4 _r'˙^9xI--2AWQ7ot!+f^fR<3?@>bRBt>VпX4\lS,UtxFdxw1y[]gx[WS=|c< 6MEQ~uw)x U7<as~ E>^(I?h8z7?"mW/"lS>$4p(T.6ǎr`z>8ʧ n_BF?l!Y[nXeoFw-rN>JXLoJ T`dWvJ#aO\zeNHX=dzh^cz2Η9zF O"`q1 : 9 yb60מ ͘[`0!YN<0 У. M}=Ba2K̈́u@V,T‚?_[ g oq~_=CotxKrs.jOvaK=Vu>_S /"nO0'TFk, h,Vg wщ1WU=p{Bcx Ӵw:{YڏMߛ3%p4m`/CK!&'J(9bhOs_~kp0?8`}]:t-Բ) HOU]\vų:C42~s e;$S["?x aJʊ6[.n÷ QAX\5y%>j21 tí iTEǿ$TipDK 1|Aza1G J zkzu6 >Aˆ);.$ 畈ԂIُ$J,б}~LC&n8B5%U0v2[:?ۤΪ;pu-u@]sAeXgY6H:8`+Aϩ@ş(IY%vh[:G>n #.#8;c(2A)ȶp=ѾaOwl<~$,x k ڟX;1bب_;^U*<.tVw(P2NJ-:9B5CK_VX7%sL,!qk$,Xk6&nål? 1A$nU ښduЛz%#8y{fܗ\$00"MȋMm)ٚB,N_4=?jQoo;7/}p2zN G?k'2;}9vbi_p6*|@_.POV~)o9Q}f^7G!M%v$&PO>Ǣ(gii2[p1zIvPǂl▥/,8T:d>bV~Kff"U2UytYld#.HK{6$4qၔRpEnfWJDKX# t57 Bb4o뉭(Bz1)#8'K(vF|1%v%os%/G%zG/h:?x*%~P$FˎbUC #6 {JEf4Ŭ;dj[U/P^ǟuUSHJZ}|,54Wy/] h=Z5t Ýc`^+ %/'Z`چU!0JkYKmeWd# v0+c~jnj^L {/Th^9 u~)/k5gAxX#Hm!ObL .1Φw'2FEڔ(Dd A(7i…Hù^H1/€$#yߘ53kef@WY?$ʜsw@~h:<+:*DU}_cٱAIYX1+ssf` Tq]8zqwF,jX&(- X/cO&ՙ#RbQ SCOx:!)ߞ~#@?}ܢrHoSU[q%E|Q9y2TR5K$x cq :,M8==L-ؕ|Fi.DОҝM%_H@a m]p)É/$D;!_U< TVPlT)unt ?S̑kps !c5痧))8epwJ(L'lSY<,rf6)[,ㄤ?{9S`21jy!)m,opK %dzVY'U L>h㚦GVܑ"o*Yv(f}(9 -oI! Es牜}*& jf$=Q[LDpm.4G9GYr‹A{63ʃ,1Djv[+E!eݬKS5_*51c⟿}Ad^SٗXv ,\5JmhEK|1`D ;^Lu$3k^;vVfc y%tCԄ0;uNb_ >kbOYA  `ftޝ& 9Vk/zb堷DiYR @%Hp ^_|-cA.Ui?=@}$P2qp'"}AX$aH,$8q!lc ]6vc iXȃq#4јA=[ Z ㍵,ũn_\?݊Fy_%|Lm2o5رQ2-PCu{DU.R2.zZT#v9Nvgܳ,ܻUT!Qwyadv{ܮJh)셤L &a2T+ ^qJD"ejG0w:ZwUN4E? e;;-$F nŒ#nO4W;{A=aLxQQTU @wh$i+'o Wy?Dc|ͼs Bt-ƬVX#r^*+{xͻ,j8zM伽VrC [<0!8'P1pUysFbp{t?zlzH+N-/7u8"Kw3u2ߢ·$mكߏږ3ܩUW SG)Z1XyHj`uX2 Bi"Eh9< kX?7LY7sm>-%r/I" ^v,"'C3#h `/~eQ,@=3m5N2 XB/NMnȗƗ+*y*.ЇFrd]s ˒z]h8c1VE𱎨4h>zJKӟ{^68r,qu78 E. 7-2(*yV2PܐhEdLvGrGQZO;qƪW6mJUhrS;;͠oU<F7^:DFX#`oƨwOҬ9Ķޏu'=с T+ *h>ps}1Yf*Nj%sV .,G-tU A|l;sqѵ uym0 b^~R^1j #ZeYe j)Uo(1ؖM 7zzZk BE*c`Q{AJS9z:q4qe`(@ ѡe@y 0[/%2h1zg-YL `C4KD@VդV!2\O٠3 _ 4͊Fy紘؈s&~v;^tvTxW(~P @=Ծ|]۫'tzO ZB+ O݅ʈKDM!]]9rq o=T`S61XL"^ I qRY׻~2r+j)I ՃߍŮ 1Ġ`T515R:w0NP$So.iyŽ Kq-.H<:CDDm3L ?s_ZԨ R6.7-HޤGM0yjzۼq5t(_wF" DNl8qm2&< QZ{Ou 1HRwjlVD" 5ƺ4W4m(~ˎh_;PCm!o^Mjby Uu3HiŋHI1(;UwcM' U 'vR@=3Xf]UG`531# ;{`Z@Ѻ=l s /E|%R@ uIV"50'ƈCPЪ8{C{B۽j=ylι::#|1nOiiz-#WRK$j9 Ő9jlx sC2QeZyΞ$?SX|gVZO+4+,F rsUH @($~= _ +*ߪG֤K<Ւ_ôgzXeQbR;Ӭ ըɫ'b6 _37e1y9 -Ą" iʮRu3`NJ[%'eT.4H?Ouc_c1^ġhЇg\0dEcWC_|wBJ-UY2=|cH@9pJJ\TS ˁa}]ZB|uWp)JjTР<@go'gK9 MM_zy+q0A8lgKÕu8352C'&`oKʀ& 23>G!q/Rl k},3tCץ(~ﲒ1LwCDzHdKhgxea7y1 v. @[g)Rt7fXpqkr_8oiJ|.'+?IWhz)pIaEIlWêH6&ܛBPy?|xK nâuuE~%2j\~1՞OX/?.`~`^USRyN~Y.g#"c./~#vC.U# bC(f uBZKƒ)z|2 פ|"* R/JJAH$hp逓;1.9w4@sC~ 2=CEwc\i7v45Mh = \kP:v>nQe` uVFbh12Մt DžRaӃ3{*սv$wSih.7죅#ӝ-{r6{qI?~TD!6{/KsM[O5faq{`Ysc_oBp@TѪ EVۨ8đ@b= G?\$vU2ϘEjSz..?@'AοЇ=6 ğ)kh90hր#";ZN."&f/3^${?I C?\>]YYDplx?rgq3θN(~]Cgf_*1~NnePG[^!De]6,*G*PʉIxQoaAclb{,k ]`0S̥Ʊ׃oc|` ?ƬFJXIł4uv~W!<*+fU2~k+–Cڅxm[$d&V("w9b&LPR-t^46_,-Ng㺞 6v 1 ¹1|p9'蚚^Q DT)Ԗ0&ݣ5kOcR AviO/7ٌ ?+ O=ȝ? 4)Y+3j>ucPq=&(ZiXҖBUu蘭iƸ *|NEU! Qr6p?&.sVG2r}s_qyOr&z<-'0{:6a q;X DY/A,|G"h0@UooGc_=fG^0Z,yn[$SWxq<L]^kclY dQwOP_24z=+2`T|dm?LbQť1 >?hU?du7:js+&ȓ5Ң-hIh9zsĝ=E 뙁Uh"uN)+|6aT-:/&PF؀9p1IL*7 S[<~.`x_CTW6(SgK-I!,Jk,!v@V&Ԓ;& O :6M\f~%t< 試*BXG [uFcvjI :C؉s7, u| rqpɩ=T?lFºvYp$ hGQ)~TGk'l|Y–=uuh0'F /DnGS֤cޭN*S|F(yPJwV]B~@I   >pzR"$AzzM)'UmMk&sPRB {el;Љt_짰fCݍ/N`5&snGS [nOL?^Kx~ MWs1l/?wץW̎ѕܞ^s"Yokɟt(#X+Ii{y\-v̗=tes>|;016G%~=JIVjy"&фbGZ;XvNHjHrzV~3:Hl^xEQۛВg{$) cRD15j-4~\Cu [myuh^~3 l8-&23'1)D8/2;oj:.W68 @ |Z m ")U5 %~Wk!BMϩ+1gFGkr{@ pAa@[lBf=Z1Zy?t<+ɔ$^y1tt TRD 9Ht`FzU#^"E\myN qKX79*+KI?"̛Cw'mh'i ~&!I3^+}" "T;FY(# qǶުeu_A#k޲|$i`IѧO1]hB^ Ar_ˑKp-Em5AM.a~x{Xȡ/gC;v5-NcQA5C='ʼnnBq]\0@[}[FQa%hR*b!U _1H(ϵ\IeWj"yÐR3Ŕk21ᖍ8A??)D,Bmr%nxP:kvݪ>#6G Pk;El+ !pļ| f+NJ6tCJBqTYO1  =XWUz_QU+q x°&_,vHI .гDqcCaGx5b'Bߤ2L"VWmQ13qu!b[Ua,^!}oQ;Fjb>?Hsݕ4%h2}W̹ynL`R-s}S)'V%XZ$2ڏ)GZ`ȫwhb_CLތ:wSeTa@ ցnǯ$(M@we~.Z{K( A ̊ͅ-6KsŪ*(xХp)'(xiM,]ٚ|RUCak b8E&2 ,;#nPY_*S@!IE=d+mtl)Ճ+_|ۙK+K^p =R$L&/sqiX"kʟjļ3BPyT#2DѠ_+X*^!]u} ;SQvkF;qNc Q$X;>Av >ײIDGw12-X3K,eEU\$f3V'Zx)?ere^wTGCj쭧kY>7%צ>h~&jcLmeU"a65~&g6#+^(L}GR״Qo6Lt Keֵ íNQ\ +/n7J3.3;b_, ; 滸XKZ ګۮߨQ(]+ ak$D̦ij9Xz4kaEʾۦQ)\'ykI6z2QqWbϺzH{=-W0osE*heS0% ',hf?}*딳`j2ʩW0\ɛv`0]{͛AE+Y6Md"kV Ff6rIMO .~Avcrld4֚5P%Jrf'\gQ"xgkx@ϪG"1qKe8P@H,gx}x7ðygsu[l\c|G'ߖ;I^{iIK ȱ9e5o QM%~N;ps`%`(=7IHb|W.ՋFV:'Os>- +\j lsqaklDrv'5USj> 07k7dj{/} *Uͻ2 BG/h?I.D"H?ʕL; o `6 kug8hյ zQ\Qu.,6kywXَuQ* ktEWu&aX26ٲsUF)w"S!b.'N!A0eX0AC`U~;hȧC]/?ܚ6- f"ӆmv-* A WN8`~OnUgUn5?zDXNH:8 yv~Z@"57P%ͼ6oA< yM=`[XS[A"4'46]勵e1wLܣD19 y{1ǡ:98m݈Iٖ"Ԧ|[< b\6 VS6/[QֺiC.qz1]qT i}($:h q8A.(]5)zS;:C8ں3⻿51F.uD^~i5Z]ũ_a0,M{"Ӄ4%K"N o0f:'EFc[7Χ_I |H(UrF0>"|BXH2v*puޥ3~i (Ҫ#6)3֞cM\1Cv Hzfq@B#^| 1\m޳®Qi!1t)/ 8I4\oaW#_cw5(] licWo}}!4S,;;EiJ*8;Л}׿YfICUHQ+.IPI x]OаjURRAnFsl0Fv"vaG7:v E$vv+o2oMm6qDSB>BZ@G{5yRQ#d_ͭ/k@Rb/E }c\mыϪ\"080D9jJG?􋡵:L̥=3.jXMg5;E*B[XVUm%LVQJl$莑KWB_$@9D0go~n+>S1sTF`rGtMN]3)#X|OM1ߪKƌ}oyC_ڵ5 T9dy(=Q W*+4{oa KuWQzKq q4$DF > 1;+*0 ;JL-7NԹSH6'g3..L o+m!NERYvymEDE3@^*blXmPs=`kf978&(oӏn [ m^!I:pԕ.ci?n;jLJX._לRi ~VtQMˊN|Hne{Y|%SiR†b&hQY;a{ba,>ef}U5Gb|A$1;l6J//}܃u6φ=:Ty'Js.\{.e>ծڊ[3@m=>6U 4c+EaZgWEၐ}#e]Zq ⢍\v^;VR?]0t=U%¥LP4Q@F%"Z^$my\S!{ېCKWWco S{(tJ\/4jȘ=&F1L?((1I7YG- UО̏%8dI都)'JHEndV] ~l6*?T# pLY Ϡd6d-q(^:_ٵ< ##sZ MdWR8(W2HV(?1Eg~0ϩSߤ80agN RFGo]&Hc8Vf_.`5@Hx@7z$!;:shIPSiL+m_cOtj5'C1k,WF`UZB txV;#v7}V/[con?ڰP\uR7KH-["??h$Wx4Juʸ&^Kjt⥁C`2nIY PE>{ӛN«oRnX)kPD! "G2Dp8UԪ)FJy)T[2:E`8?V%tUyh3Kkf&*_5d_B<~mCNYJ/ Wj:g [qiOjfYŽ"":N;pKȎnRXr/Hm=MvS:Lߐ}ަhRrC@ǥaTvQE% zr*U)k~>= Z,ҫ]/0_V0TB,OBQSNEko>ǟ]7WAo^>K['\ Ls<1/O ]*RDrUe:sRYnCk] WkZ2&ddXc.Ÿ5n1ۥદ? hBG&1 r,.%QAٯ+=u[s6w ҄)Rv1UpjD7L#<+ C֐;V.+cɈUzi'es:q|!YVUv~҆pLƟHaΰW]8˃!h5h&ChTSPVQ3!Y4p<` PXj$2lj{'*G.]b&s\Fsw}2 wvl^S3R6=QU'oR1PBb9(F&sdwRtU$F.8y|)~+c2=9aPN,O<Xh`2@iқIȇ.WE%3)yց[ID5}@{gX2 ЃH{>ɠ-W; `E}8C[o犚w-&OoȀ8{ZGgV_~?*e,@8{xgN! xݾUۛmhȤG A$_؋IiJ7NZ8>;!FBM-&6%HAu ]MIO¢1;ȍPS/u j4ZWGI6]h7RuQ,Ԝ`) | ?3G B9̏S*NgXfKQ| 3Fa55{^pG8Ebsa3qOn)pb7 crNz:׶Tq@Rkܲ7(EӚ9τ1}N({Jl=N xHNRttFH'zJF-XCth|.' q@ouInyn*x D^$i mly2^<^oV^ELAbΓ5M9 COgǛ(Hx&h..sL͢jK*؉aϔeUt[џ 1*c#76D10.s^ ]ջ;)*\JU]j~.JdcSJ'tvO];X`<}H.D [@&$ gǨy}BM]V.յK߀SjJU4DH>:~]!fעO2>I6?PagK`d}`&V?+Z~ahMߍ˜YY)D*~v2f(\c0g(~ q3cՄJir g>+πF./E{Lf4}2uK{/;{'bskdIug)~эpLWs-!&P'cHO:E`08+d@6/7Maf@gp{,MElcɧ\|cz Fؾhl) hh eP(|J4(Mfgs^sad(Z|QE/RyjKUqȑ-OiarLw.M’nЩІ_˚鷀g[f=$I B"BJC"Fh+5i}WczP·j[b \aQ|  e;Zu5r/*SSEݬ4pԂYeh~UnhQKxC C`.ׄiWḍ1TԄ  WoÖ[kxPś=lcY!< OX{?7b})ؑqЬRa2~=q- ڪqy\PoZA@z[|c ܨV4<j'J̀~ƋQ]>G_C <'d_|(RLS{dyˋ攺k0%by VSŸܘ) AI+kAתS[2x! "zH .\!Q(@4~ 'z,MoGLQCE^f ك牣okt;Yr&?B co ̦ @)϶.63f؁ۋҦ4tg,tEpUB F-#M/u?JcT-:L?DA6Ƭ0wr`*W#3< 1]j7ǯ( {hE}PA m_mOv3i\= PTfYMcBb$|GSJ6=Zrz40SOEu'oJ/~rO,b6<7|$8|(9!ɱp|ҐjVX#8k&z b]l1j:$*,*Rw'S W1&p i4Lm#b@My~B ֲL K]A~?ʭ#> j%b5lTaCīPe?lYSEa`tQ4X/0K gzR<6zv`89 P/WgT+ iN6LoLuoItaΖ,D}֒5biYȧLe;~N |ܩxٚY+Ź֥&yكwkx>>0\:IrTgm5K488:xP_6Ww;vn4"s jE #o9@\x=!A őwd*@ƴߏd3 ~a(S" :Ο1]}Wk3Dq{qX BӚԡo>q@CgPf`DSٓTp0S9J&$EC^ Y#A'_86# "ea_F]:y  [.qΉq 3!"R CWI?O# <~¤~:*t׾ZgEsdBI1ҋ6H)S\ٶWLH?ivM fnW rc]4~LOp_` ;D-#@k<L9d[#+&@eq%#GMc+g0a@/VΒ+34V1 2 B"FGoN:YE{=YnA\3Vufr겒XB5ӆ#B3t.g:r9\c ~û-Y,`\ELrH*.w#QY:7g;v6XpC"."q٦ADZk g;wJ81ĮDҪ|g+א0LAR˫.o+!3`~ oVXb"O2[XR񗷱7~\PƊ|ih0̚ B=ငN,@=n `J9q[l`:5xr;; ?Tݿ;r3`@mG^ioQ9!dE*-t6k@/];HLDDnfDXQ VJD0itotf%BæniE>պ6MwND>ʝGb'iU@.rN"Rsˀ( :j̺ ._Zԁ"]<7:Vل#Y+iO; ;fD692sX pa.V暬;B o;1wXkV|Wf\A) 5g-U,l݁˿e@-F!wWUr(*@uuJb4̆&Z7~([ 9%C'rG}o`XݍJ5adK-٩;ae%X~7JQ{3xkٵ'm2 \jɐ,:5$;ׁυc-s8)^+)<6,j{YK;ZwJ}6W?@< x =LqXŽx9\?)ٖG%?y݋KP;&̞w*r2si Zjc7BurȦA,W-JÝvUZ6zIr/lJү Y 1Zйl)Viy6YWn}? >ۀ u^$N:~D5K4M'ܨEvor#CM5aBg%Yy3kWkU(bS*dkLު͎n\:l|t%Zdf*;O8EuTf^l]8VxE:DbsKM"}e_z.for^^DH3$^r?Sf}iռx{Q`:Q46ʏkkzlq0lICʢDYS6~*Is|=QpH*DtIF>BYBqB7CWM\HQ33YWbr;>E̝9[ I8YfZ8{f6hYw%oG"=qW։pgo#hO h1D.}nµ@> : t(c0gxÐ/PT\[dp/1j'փJ|UWȉ%٢=QaYɂJLXG̗]qh9Aߞ:>G!"rCgmh.1,aWo)7,n7E\e J){o[W /s[ h@NJ.݁+qRwL/n 7lԻIG:c:Is"+(dWd ~߅|>u"$d\!z̻JmC = EʼGʊ͖axe V]Ť鱞'=W#QPzQŹpKsPAy:Cf Cg@ [z%KJ\7FFx?ͩ?.Kr+Y^&  as`!jT.6Э=ee~ sй#gE{j"sf!ˋu Ɗw$*aJ Q${х zMt,X6I9Qb 5:of'H|'04.՝ԵgP`Y/~W1a5lG3DeVqF?>N*.FL |v!tJt|Qz~!BG]cyt\oH[?N<+k3IKf L^NM(M2i$^ ? DZBd}51j^LF 4Z |ZPed4\wYԴ^ժ1 Np:ut/ Eņ7\Ydt*aPNuvӿJ||Tw>%NWs*C=35(O3KU Hfc=t%M֬ķdMD~W}-RM*7}C,x\e˵=H)tefw_HI,bF9?^^>|})_0d:,WڭUܔU ?-{TlTq>"k%,1&^/1rRlˏ=:0Ude`pѭ&tzLZ97,]el /{Lq[E`c>;M˄˲n`uLڭ@︪nM}9/ >}vM0 pBx(JÙB]5N&a':pJTM/Bo["i\0I5c%B7;$~Kp5ܥ`({#]R%T7|JWsyeP6.n(Oj^kΩO/'VdV^'F%V\GtZCɰjs nw_߫ǼJNWݫ5ǢFqěߗ3 Y ōߌiJ0ssg2Q$<j𨦰 0t)K3ZcY֎OaǫCmgZ%~#9Sq1(.'QtA'C{>"[-ϤC@ aoԞu^Sސ㜛l/`i?Ys|WG $Btgbf+fis7BU\Wl]w9s2:ߎ +qcKF::A2CMp.AbA<~9pՀ4i:B@2ySRd?[qQq.p+Bڕg@k2oz|R4l6tDe$!\&:8̸c"&Uc/T*a]ZY"7 @ƕIS7%[u]-mcCFxk- 56y"BQ7c@Ck*XliEDW}b:%G0twt{NEhFҕ{x6Po^eK(Fق-4NUkq0H͏@4$2N=&!v\C4 V_eY!)whAITZR>[cٻU"[&`X%3vFm3:R$5PwAMg̛ =zBX[HgfQ3폰[a^BW֊Rd~! 98?#[m>4T6QDǰ~eZgpE|Ꞑ{zq/Hr1;o+[ Diz6Ȱ4ehD2;j^J,8{hK9ϜBM˘cmn+^G,/\iB)b\TEwY[(S [`~gAQ="I2f1=.y)iZ{ N^p@<+o9AXVCC'Z 8$݊h› WW©9 i)[fVj j]*Sl3 q8<Ԕu*h3`[=('w"&Bf F1wKEX9@!viI" QʋH¹OV*Iȁ-'~[-j ƙ]HWD}v|Zy"5Zw/8MH+pDOǩ2U<3+a偨v rv=[KPnaR@Нp\m|#Ѩ!3U+GIVҟts=j&\of2%~En|У^ʳ]8j 2#V|*{:J4:~72Awku`IZqmU9%h{(- Ip-,B9t-O%j Ea](ub,FmfuBRS5gA6^;R-R%4 @+JoUV5¶_$8+aqOG{QU7pL*1ֲ#nPۉW*%nڪn$i7k'p} !O#_XC*zP۵jDԎ݅:@tWEFd!i Bz鋹x i`fN$O~8\A3J >3?y|k+sr4c)i@shTSLKSlu93!?e_X0)ʕ-aUљz 1yL&Dw J\}3tN鹾os}Tir9q›'}g1Lì'ki Z~R u`6-}5CRK>hk ҧGE~ .vqJkŅ,5i\tQxl;Jdآ196E~}6܎NxۈK7^ 8Z'FKeOkʓ[SP,?o_Oe GAm5_Uw~HfT)EzJ#beN/Š!UM or~xw[VtJK :r^) Y& _*]zX/# W-A~)<i°wB,EŽ\=i}7#+Uw+5).e%NQR*k=JzUy}S݁u0O}6,jZ/OL?:1w]`_՗:Ma; c5>/pkY9OBl;9`Mzc|)~$&3g鼃Q1I9Ԣq"BTr>ȧBCݺCKt8EcUkeb J"\{O[\G\F-> |Lt7oSɜ?{nX5V?ɲŪ8R p +.FO'7(b`H[I}4yҝbAaQ I3@1ad8> k1mކ gA#Xi "QԸ _8nB?ϋiSUuȍd_Kd&TEo aR,q7A所γ7 . C'4[؊dz瀉$Vo|"2MZŠ'g헩!sr&%71ذP<>q?ѺqѰF  MO1ؾQS;_`?pfFjuTb~aAKf>EPç),d؃F2 һ>G1Wk;r&>?ѝr+xEQf 8 S]pcF X,U t1č%<ƺ,{mh9(u& 畵 ɡѷw^8Bbxt?ۈ(tByvwTN7Dseѧc|1|%ӗ#v&A uɘ[:gLG+;iq 6cf|A (빸rNq!6WBP}_(y¼A.=U+WEJ)u Y1|9aίUF/J@:Al 􉽖Iab@L00pf.yቝp\ozV—ha_la&V,*@4#Fg!^*4/:C7vp/!|/RX/-As)أjrAxFY0$_JB<\Qxsoș̿c^3;3r{&ЯОkTkd]ԂzLʅy`LyG$n]=4y#)ܓVe]%FU7:x+BӤ,㊅=@WۦH@ Pyoָ/̷kus(50 & /pB?l̖loM9 7YgϷ&3!9yӧNlm`" 4 7uGC l)@Jqs+VMHBe?FQ:bn >EW1/|=H fԀ#w.O?IO1]_y zqeW/1an\i-'،y;{sOTPE ] ;Ȃ1"&;Yf|OxN/K9dcvޑLZ]}'$vvޘ&iYe9&U<-iAY4?j: .EĪ)c)rx|{1f1O*r‘բ8ܸGuPDҵKgmADmYv/vOjIJDHxi6$u2DU=o5^l$XG '-\"8E}=L0 UXCo,U2Q4'!c1{{e*cWy$A7$M'Dh/U:WPQRm-m#b+;ȐDQ&A,>cFO2/Hըw4&9^rР$<F HEjO!e>2 3+u; e ]$3,r^񘙰7g44Hf_s\Id'~"J_F.FzupN;kJNd- q**,%(\)/\"D2o}15-uF Z)6C\YmQ_!}ƹzkE&6K<s?dC^ijp&iBW'ᐂ)"<{2e9\t TxJ7aqpHX4Fc6R@_ck,kq|ɳEJRGa;8?-qA!bMFԝ BFe~: ~u! M=y0*49}!-FSf4$L.нD^VQQ&yY֎ug;}Hwd JTM`XK~J)F>ۢtPAҟ? Z 73-{Y"լ76iANKv6Uoawui`Q5gϰꛝC@+52"L1XVؙ_w%dh-pg#,d\{Mũhg?e{/z-+a*!=rIBQJ/[TuaH6N%2pֶ̊F~4D M'5ihݟo]% mxԶ볫ġ'3# ,ʵ9kzkc HwP@$E$< ͟zW5t X9c ~(3*du^Ѓf zHAS AV~6e"$c´] cϠߔ>16VNJbj 'JpcMƿrOWC݄̪pưD ɶm^C1* 5?;%Cy͖a0xbo=u(N-xۡ0vWsw**V$P!~٠)k}sǻZ~+Qdp$PEg?ljaǾmԡHMA<[^ {;az~wh8$3('@V,HNخlEr>D= 㜓ؿm52g5`,(9\vQ7Vt8!XVzɷeWNF܄ҀG`>,?9!3@6GWѬuFpEe%=‚v-iL % y3dr80p-붞j!? w#]o.h&}fH!' YG*|•5uuHݪPjȨ=&Q7)=HG(1%oLܬ^;paiSX 42 iFtFz,'PdZWd Y, e|D0iik)G3\Za~ςN~njcu o.^zMJĆy݉:h[1ICe4V NW/#h(Q&^md~&/n^2kgc'TRcÃI>d//)\Nxp&1r1v;H#:½s5 1(>YoKb2,( Z׶`kH&|B:"v{IvO*U3&0v]qN…n{ssFa%P7cЖ-rk+=?$9ܗ,ѳWAqP rX3"yxUǓ;H :!V)w#RneX)Ԗe#A"C̬'t}vZBJ1H[BϦ!Q[ѫ3J\mLѽs{0þuugqfzVbc {};muހyͻCθl[~?;7Hm-4z;-B\=sj,}oA_@pRU8gi뫴. ]mց.e{>)dɞɵN_mZ# #-̞"[ u;_g2PWij&آ9's}|2 ?TBW-@9<7Y ӷ 0drCȅcs=k7ukt8LWP7H/cZzqA8ʺ% wZQg݅uPdFШ~ۺѓ/u3 ?M<0+v+z" izIAܩąƵ%#N˄"zq)kY%frH2!)$@7E%cY:݅Co¤qM[k!@-\?T&ĈBs(O?nab];}VL4l6$q ʞ&kn H M7j Ψ0Pd, sf'=x~{rqUHdK4(7ؾtM`L|%@$sD)+,$] b&[ψ^G1,~1㍒˥˩kG݀gDUY㻗fJG5/U'aܢ6tӿ#e$Y""KiCC1e>^^a@`&I۫mpp$TujDf 8^ L4YD°l|L5^J~#"d(u 0aS:ULDku%g~"?*Ȇ! "M'o̎Cy$ek(}BpR=+v-;зY  _JxVI* (ZDr],RrAćd|Ok5гrQ ,)"pa1QܜYXYP+KaoQXV)6w[U0}ȋV9`3q)"ꋔN-wQnTTF'i n9.#OZI&&)ެ)6 >_2n" jHBx lHJ0f{k5z1Tl Y{}jX/)mh^3K8kv߫)\'ĺ3,DO)BoGV]Mۜ x>Q#̯/KTǝifW,2$6צw,9: ,MxoU 2|h"Z'2~9Hd,d{@e;7ZbL?9mLYD. L-]Dϫw(1?!a"w+d 7~Ԗr$o&ܯ_?we6AcP;X=4à Sة_W1 !:LJKsg-[8+:,bC8/oip(OaP,F^) N-;#B< ڬy,mB8-o8([uBcvs&!b:EoE8\EIV"c P%6;fY]o _a8d+=֗ PfTW7Sԩ-ZMAcT**9в/aců6Hȃ M<ЉQ/+5C(|92A|Tr|spnNotpaÓ=.*$c=?t_OdDAΌɖ Gb`wֱ)8^4ptjpOr{٘={(`:4#W3\%2d珒0N.;߈ cbEVÃ!񹜄ܭʉC%)9dU0®Z`]~ܯ3+M%i'™%yCKk"`l{]X߇Mqot]yUQ~%6m4$Nz'"gkGyg [ ~_W&И3.9“Xk/ݡOɖ4 (#=o[U#]JOQ%3e\IR mޡu)v(J>(`?Ӹ[3Xn V\.fuCۧ9n*Φ˩:.\YMvD+ }MPS]jѻb*ϭ˞K48 ␍} `vHαU.k  dL;6m؛UySVWI4P(V-|_Sj$@p%`Qf,/- Rei`t1.oGuKALAc<~%pKt;'jPs@A"<[WҤb;s_)`RFf+|&ְd0ч7> b\ٺ v3̽d>6}.]MIrS`6BX=N:$|K$:4qA?vvٌz%#m>遞>Ax*XXDm" ga) Adh pO8V/"M:~jfGZBXjye׿.bĵ!D/1;6?{Hqi85ҩ[L2zZVP=$ua"vzS8`淢`_1^7׸05m7r^'PV/g,=2+kmϞm;Er$APM %[ʇpF|Yop@ۉ"G+d<Wn~SwZODVЁyu[>C{tp<ᢌaNdj w!ae IVp+ρ5-[4r+c;)Pܖ2 \WضtAj*˺3[d a$u 'K` |.Lc*P*[ZgЍxWϊ0qAs#xZ/Ml7W#UzW7I{IQ0Z@<\{rȟtBitmo1ht9g{H9zOFd=1{wO/*>$׼P;bX׭]݋skO) =5gY}teiOtlh+ -/HP/X"9P@*R;M_)( };Laݐ=53Ǥ"dcQ372/@y;g_{"_XF}H(y>]y]#%Sv\z836XK W5` &MҠdwJNW _uKh y)c;&w5.{wk@LJ `$gٙ'~@b߬(bURz|k%>,%$ O7\Q6GC8i&"'˻[ۢj>IJx'm$,zT7&1FG12]jƩh˵|g0י%k?W߫V#r `&& CEGKnQ2CrPuV}e(S + >:: eG E m #Ssvfz DV]e/=)Vhz];-SfuǚT Q# )A4UFJ% ]d5bXL:U}}=Naj.uۈn XɥW9!n}H#;!AT/lv=oJzb:?ЕУ[)=|Z3 b$Uj5Nfާ<U>{徇=tܒj'X$ LhU) 8x|$j#]6A2>#’z_F앙N~4v۸=aĻ?ha|sYA'&&@@vDxvq;~gή⥸$8՟uGIuDF|N)v#ƮvJ+9 +gwʹY.\ 3mc7= VKT {ɔ?A&&̞pbحӊ7]%PmK(y)cyUJ;)Y-8sc,z߸-lW?:)s9+cY9o~؆3tɄQ/cQw5c`iAѽp@!=t$e-@`a <:x0wD@w;&n]CO_sD^[ YTq S9#p:ѡ}aQҵ@k{-bx.{v%k1d DYM 8& HMi4+K9G*GǴ) y{وI[m!A^1!c怑XI;>[ 9 hA¿y~F^$lY)g| 0Z ]C2(邩{qG8hX`qf ,pAdsIv >l%MlYLSb:>V?JB3^NP^W2Du_۽q<];3 ) j=kz+R1 [ E6$c5v-x2]d|Tܰ1Q2tUrv£Q.'Ru}qӇwso KSq Uʴ<򅮥EwFuH=2;Cz#ڞ}CBAj#<9JTS-3e kܻfOWim]Eguߦ![Ò6!^iSlg %C+%7L^](6dPG)b/CozowrHv;?=~K3--X Dp#JB MewB#2QS/Qĵd^?Wڌ#$~PD?7OKV!9=ˇ2lx1Dyux q|q|-Z8,V~LLѨ4sIII)$ԐCVB;rVh=iж{~TV/J~;~1GyMrn~ROؓuV9r=Db[Z@;҇Q,lIHO0؃4)7@Ҹs;yEg$Ӡ B࣮`Y6ږ2D9=pQ vȇaL$@0oa_ OAl)tX}`[r^=`>- sWٔ90EĝDĦ l%]~8׎>O $Y0"Ϙ ZV= v" xfEL';yGb*/H k hhlA1#tz(R{ 6]xO "] %j5{ Q<}pk)Jɉ%ۆag;y0"GaXҟ|΢p!LMV` #D,!Y'+VWGw3pI h jml~%лfቲAX%W 6٨0#K)B;`LTVǍDTřG @¦ۯ,=G8wɻ`#M^/?dRSޖw\ W&Cxl\|N ;7g4hƤOqGb {qآW](!7U]Z:uv9%`8.Y›wU!;s* Ɠ:)KtPÝ1OibM/9İ:ڋݥD792 4fG"~-{A(c8W[Y .hhA ?)j҇yb׃:جHZG>6,d9FbڛHtL,H.Y♏,C SZ* x0&d QCV;ܾn쁇Ďks˜4 L2?BF Po$U}srv%ź*6YzZ/aР\#%꽲Gr.blgAK7'%.O,)SY(J9˹XU(<;IJsQ\ I@# !C[r@\e]bK('(iI+KL-JK`(5#Rr< lV򕙱DR(Oc~N} i '}I!XզuB#)Ӵz7$-Rή[4âr>LeYT ujub*F$ e<Vρjs~@;&c*1peox(+y}Ź?jߡ&?/5t@ qoP R}.mHVDb{!Wt?71\^mm ⫖Rtb9-WAdF(zV[̞20B!^JmȌ2@Ƕܶ5/ZSK^L T.Jާ芞7U߮U$S* K5/L~^b%ڷp O2rb֜P;1"[yBlKbu|)0 ё=;^/ (9fn#zkZu%SnjA88.@(D( ɖF'd1ыY_AcT5DF-%sJ XLAle=FU$w.0{9u&(b_r]6D`ů'9 3v1 ʡ X+pD|DZa& 4{1r8kfw.dS:;5 ߬u-x%9e3#Vow n_Akan EV L4!F7i4G} syŘ2Nw{ls k ~SuSi%PGCcZ1d7PwF:9mA \fX7fl]u oc%׭V>ߔݣv[7'EOn7ݣ֝ziBn  zCCRN u=zlI-a`: $uݤY'iɄ:L9 caRlS]DU TAddw0FJvY{ރ΅PWq[@m‘+G+!@&B#Z@T֦P=>y718CF(Q]t )OkoN"%;,$_٬E_`EJ1эf>5duNF̕RyCO~xEM4fu3߲}VjX!o!Zr.ۓ ;A6k}.4F뉻##w$X%Jsh(\w'q'@-֏U:_:Jr㝦@`=. mScK "NcY)  Yg WsZZ^F0(RtpN]ss-媊&5~6J4s>M9vB4)PXciE=׼\ޅ%BΡSW|,0}TxОI+A)*!W S+za|=kw] TX [+$񱡀ެӼvdxԫ0uS+Gw %T ޖbL6bhPy  ]%gd<%6nKdO).D %i{d;ی 2;|/3Z@LxHh@ SxtBQF] T%Ny~n76o~(+t )ܟ4_z=45K% T9"a݅\e!A?PfL3}YvRf z}L-n/$guh:W/7x9kGIҡ_<$(O]Ȯtv20'*ZXx i!RN}jdJl5H#;*>xkzBJfX74vpJx3Iݜ1WʪnjZ3^dx=farR+Fc/Z|%N;֩%oMKf628|{ Swv:l$OLʃY鉏}0JQR'gz-3WyAO:oMol;5QF;M A-z oVJ}Xgd\9b!AȯU%rJqd"6&XpJXTBpdgV OtsEhy~@nӵuHs#b ,E*Y#xON 3uwvwUΆL]*åf1pkpzyIqk yT"0QcLpn膳速*xjͨpW SR>$ʉ"@?S ab7ېƒrvd혌XkB[iQ#/q<{ ;$R=-г'ZݐjNRnh(I.;N (U5퉍@]g ,{|$fw)bhtM5cJEieCÓO~J'<:}wPha]ZimZDv 8|YÊ_YG)rqniiaV R{w] ZOZR@µCJrG^BZ(}9͝jLK;v%:9Y1`nk=eISdh$$gYPbďqP  1 gȉ߿(.g[7Ey1vV40s] ⎸ e!1_CnF9NpL)%GQ&Hg`OW .cC"eqMpBLyw-=T]Uw@BſSbDsA%cbdGϿ^=b4Ԙ.&Z9kb/p ~Ř1jD_8@t$t-gP֕#y>Bόy*g6}b4]hWQUn+aJۄ\ o|"/'hGiTB*Qf{?b-E(?VN\HC[RZCpx$z<{ކÅWxyILyUu;V7B^+!xy`{;C1]g훉iq$m< pMd||IZچOÌF(,4Zf*03N)8ei gW2i[JX{@_rcG*v%2~BHWWLJsqZ3 wz1̹&k[ҠQ`'r 1bΠF[0!ի(~[]ǭ0yiGrv r$&US~88^jعl8KDusG54 BHH vTK 4CR5ɟGxP2I?;w&Nox'ؔbe@ءk@6d;/{AAYga8e?2Dǔ*Gfjv9N?٩ZO{ƾ؉pDl":G߫;ICزz..md谹n,c rs+E:o{Fd>6ۀQ1\U7]$P 3,+m,EcC/pt?B}G/H-}cK͜6R\H4Uz9Xوl$f_ T?!,Wv4ecB4{9Zf:͎oXC3˳=aDB}8BH7dͦ  O]^Q$ͩssQP4NJNR {cEɔN)VDeIa4JqIgv`'ﶹ;!̒e&d3ltƍ~a%O{U/[7.7ε] ]Vt`\@k,nSXTW.+T_bmk wd~xnćDwFՅkʆD TKU 뤯G_p"ܝ_Wf2܈އ(6(ZyO{feC砝䌷ǜY*&NG]$@!`JwjQcpK8W>^H$u˸ƪZ!geKs6%NpuFiQB1%ttHx=K~@s8u^]ɖW/6Z$ .gT~ \HP}]ig+hNDKQiPA,D}*|q^lTE-BD♫7wHa?##FKQ{{}Y'6bF[NS1jּȾer1{Gr58,xm@%`Si!Kbm7B)[B1 񫩷3ˇIxJϣSt+[dm0l@}>]$Wҟ7ɾFfs>ܦa"*8G@Lt +iZ^I{E&VoVla5EGh.Mg/VV^A-J7ꌱ%,dKQ\Ƹ2jxfU:r@33ECՆ_/瘶v2,Y#}k4kBZ_ }kV3dƝyFQ:.Y|O)H#N61B`dd:rL}·YP9n6"6FMR&jBR! ⑂|*qfFuR鋌@E`nd7"o8Ay V:ύ/sZh>: %(~ jbdOYA`F%晦: 4:aCaO9"ArGX_jzBOkNa4LAp^3VlfXE+|rxg=9 $(g g Y"\,93Y 9kcddl6|]O:M3T3)d9I$E&9祘n0p!U#ÿ֢B"<1 Z)%f9 |>㍧fyrN?Cj,mV 2X>l٣YZB;%/Bf->^ 3g6Q"a>VBMO|w+y+Q42e-A@gsl<"ll $3\fb?19>Y5Ux:a**@%)\9PI *W͕J!*ܢ^FAsMESV+o8Sok &Jߑs5eksTG_cyuLJT)oF8 KA.JN|3Ptv뷟hSs߲C`Xz)Uz57SYwe_LeZmG7#Aϩ20x&6)"C96aM]q}tz.b^hgz8X,nL{ʘf$$ UF}G\6{ ,f3eBԯHXBH>ȎhgEK3*0`ɤ Of{Gr*|ohC|:G8j/a֡AYͦp'uVmVQiU$DD6''eMtYܣ)APRmYH]#ښҚ- w!)ZpߌsHy>nr"۝:˦=Մ٪/_Η&ZÀs.t)5TJG?K_E MbƄF#L8(w\ƈ/Ex50v(_?Ш=$kl=g$?Hpz6H?"3T=x2B&9~Qbar2gGI(hPO<+k~]8@k)7[{%]UNcɺ ~=&p+B\ ?fC- )Qtgfp*nxX*'}~ ^rG{ԙjzZ]1=Y:{wm ^! )b`;9 {mA9n (cu~#Wn؁ҭq}_lϲqbYl9# )}.3g6 =`eOօsQkGo?汇G-yw_Rz)(ܾ}_%&hŕ y̴/ S T1qTrٸG(Nԃ^8P` e ?-;}Nfj-ȝedUM-ݙ?0AEbH5YYm!%b#k}b_nd5R `Β1WNT#\&m"zMr<,ڛ&H0DhT[4f(<4V@L 'vz$7)@ǿ`yC<.fA?JҘhHg^\c= ܔCREp'dá䨳95M>3~fwS'ݽs^~f]&@FfᬔOfh_{ܝBUORly]w6"|n եN]nMeiK\ /M; EsXV51^~l9dS"r8G?JƁV^oɤ:ptڕm;bxw$,Ha@Cbxq~'A5<P5&IxqRa噆D󒫴6W;&gboNdiFN~/yLzǥ6':`-+͚]2m_~#Ӆ{~݁8 (9x7a n+q'*QƸyL:yv+~%޳O|gmUpӼ@3b%h4x$DZ .j$mMkOjyz~C_u 04orv _E(K_oovʎJ³(*5-.: j>$QQ''%+ )>"IEzUC%ʭ~7!%-ń]qSU* q;$ B@b+5ܟCRcӕ񞖟qr _Q@ )8! 5~yӇ6ދ}sմ)_G!MWit!|3~@8mh͒-{[tfFc~& 8'zMS{-Ԧ!.J Ӊ!mfl_}sY,º#q<.!EE9jQrv7N `3&_V֫ŗ ,<zK►kkg\vmG@#ek-W-HH]tlvdA wW2Y1߶Zͽ3 YۃuToَ1@!2L= ^ _)]{u XbV5M>+Ժ&QTDe?8mꮾ\€\mر-w=m)KhCbLcrkEJ1Om*zXir*3䅪֣3@PЅڡn7q#VG5TA{6m]u"+YT?-ǝ ᆤ*ڸ ۞s%Y Ox4mrX ["rQ{Ј)=}a( WOx5cXQQk@\[Sۗd_P.5" s$z[iRUJn_؀֎|8O KCv~^dnVTGrpC*w81؞1)ydFqg94"&Ձ_(RhC3eXw`:IUoZa!rN.@ţj%5YG*/H(mGN>g׀Z_Љ״8^&q"'Jg9Ҍ*v$5-T$p׈aK )K7Nd/|n°e y X4.4iml)(Gnh_2@TCϐ>Cҵj(XKaFd5UiFûM\E$ #e(-,Y;$ƚ k(]Q3xsI_^OayaA{Q .dr+Le@ߴx Fi˳̤~< 8ztOǰ9oT"_s/IW΄;/EAi7]zq)aruKz)cQP|ɄOR `9Cȭ@4S՝Ź;Sra%O5? 0 {݌ռȕ*2K9X f,MB&(RN.{|(9 4coeATxׯ)ξݹﱬ22 8}'4y$krdDߣߚTūQޫ/j/ 1wwMe 8a 4e~ v[oUQRʕ5NR> Ux7{.TMZzYc@ ˼'^ lF)#0N@ +mgSb Fc3>O2f $x vH sR!`m-RtHmH[>>W< #9lEV7T2M-MTlK&0$Mt6b&ad2K Wa7< c@5XH))vf[ &={?^S21H<@@>JpthOZP?5 Uh>bmM mwjYwrR׃֣MAUa#nI6Ar8tRʳA>? Sh~}:h- 6O6~+넂bྫk-A"MiR9V*?[dhhcӠT* 8WCگ`5|V<{{1(W"Kju'=It7OIJB27}$02R|>%Pi!GBGyILTw(!jahrtkฌᯢI6r<9d;RVBi'Wnz'Q%FNL̫Tmo$k%:;Nh~ꐙ&"a ̃v4T-w@]o(tߜH/q땎 GHYN><󩽫YD17,V`+kd .ܱjd,z׾=tʕyE:/bd{7l$S: wד:;ϒ*Yͭ3뷠>#'5{iϨ zմSJNe  2$&*/WzNLq~ m%sFݚ}ӼEG)+!$"|jS]/ ngZClMp8_X1iÎL P@IQo|/ T?cB$+'q՜ ,O Q?o7%(i']KSBI pJt wf]KC0ZP=-t9٪N=*uB..C;~\iA~?EQ:JҠJCr|9>`Rn)y:Q@1QG$hN0-Ҝo$FJ͚S|؟Fj,ddTEo(OعlWaV֤H{VRUCj0rYIg>g|=V 3k0|)=:6Fy-Zub,#3Q+,/'pʏ㗬jOU@ƣ`ʒj+M6\GFq#ZKN ЂfKX_U oURCt݀xt <-%[[}}?I6EQKa#3bx2v)Δ}r wS|h6/;Y"ȦVZr)sXۛbZ}%ב\hڒ2FkM\u5S|Z,D5 zgq(a5 Τ,-ŪӔƫAk['YP ou +)i(>q8#qsYRu:#"nI/=#;AtJy[ ܨ)̉]-g:b6ĚK`2uX`m>4S_*S>/nrl-i ~]ILYO!oDkG!Jz"ڳPmY%pu` /y!im ,GJd9A|-߰ UB ϩ{Ε7=7;EJynKG?i/4U\dgx7y_}*Ul`ۏ<`+9w_c[CHFP}+Ry!+qCyPDL\};r/K_( +ꓘ`:jpX zҞ=8D>;IO' :ݞ?|f_stjm^[cٳ{ 6@Zމ}{cg۩hC'jo\SĶlfbˏY0U`NTJZp;5(B*M^O 3d:E}Jߤ=+"h7>7o{ },6nVUR{db7΍:>pÛ,kd>1xfGA"nAu`){D$Չg@PZ!Sr%9G[-gdLJz܂}UwyqF i,X>ԬDLRF[;%,ŋ-nH't]Q RW-\_@PHۈg08o=-&:&k3? SjN4Ob Q,=Vid.W}Lw?M8b~q]UPa%#apdhQ Gq0T5JƄ $5Ow M;];M%ݵz*DFlU$ezF\MODyYgF~ɿ؏J-1&/!"3.zz%òFc^u Ȱcۢgv9b"9\yFٕ]4]ie9R{H=?׼av܁DBw+qxXApzd5G-^tttTH#A.7%,CPϚ\DszUJE: S7}!7wz1LBF,é* ,λ(irB5Z[lFԙ1M,PÕE|d!sv 5_qሼ!F~P` 4 @z?2:@4fި*U4Tj.-ݴ?do A<ީ]_Ke:neEVr5.|:6u_gMԫ0hݞnFoZwՂLwH\={t@Wr;E9(% 8GS ]rHD7DYgԼ/|Wu7 hįrPy؄Ĝ*T{<$]I= \x{f 2xbה"Ø\*b䝏"x"5EzUQp!'LF|n} rh=(sAP֐}"H'C^Nl\zH^ x ,R^]d">hi *Ɗ`ĺUW(<5e)>H&O$Wbvɿe+- P2De(\pH˺=5ɶZbSפ (B(4LzWM爝[5x͝ΊS<#*-T*n ?1xǬ/թ>:aqBpAf.YFW[itXwؽg$Xq.2¿G@ >2ϒ&C $ =Pʳg5z#N bQӊG_\M¤Pr# q@o*-&s&6?* 6:n;!);U,LocV4EN N];\oϸ'TPš5Kx5v垍&&E&*vBK/^km\Ar>k_Y#(NRo 4E2;q~\3qO`e}N9U)d0[Sgy>6 vB!5"+yi5Hi@~"[G~?4cLe30d!q ^IAuZc٘[,(I.$'w}"a ʂ/~W'Gw)Hآ#ؽ|n¯ T|Um(q zY1wg7𝋱)L-|m`u~IIGӖ^o}؄4vQu_vj}CI AmRr`'<*8(0t\5qhKq P2/׮SC_^RP@0-CeopĿ;ݬ չR '50l^+0c&'_6'T!2ՄBˣQ0˔/?{HeecWۋ2zGg/r)oU=OZ\]*pL[Fzvljc15AQ:)`iD:=6m庚0# :|ᡲYgIД(e!Ĩef m(Du[(yV ( .jO^ʪ|><2<6m:gFx~h g5=3gю + 3v G>{(X:@KxT^@kNpL؟ȁxP 26]bzNVHs$]ff_p쪖/TW{Ɣū0Ei=3#4~P=6BB:2)=B<q";-%䱑%, DWD'" Ƭn/WC͜7L RN&n\Aюa]D=P*ZB\,k~E5l! i Ĕ_URsaj*w&D%E$Eل~t ;E}rHvV' Kp6a5lL/=|#2R9!6ZԽa:nؖZGqg |}%Z^USz1m3Ȓz{잳!+Ị^\*f+n"yJA]%#u]OP̋82Z-if{h!vsh*UN1@\-}jye4;}ؿD(sops] :B H*Iܧ>Ih yyJB-mJ%Q(O?#w]%)nrظz$ c5 ûykf5*8f f2e6S*kݓruMrhI81#KY&_e'gqs`b~xf6RLî]LRd,yqQҢQfj%y) ՚lY<FLQr kR!o W/b!F[Bzg4GU7'SrQfG`\T|C^r{:ؗJMݳTkh\ycQpʄM NX譨X@1K{< ot{>:bYk

h>nG=gu8'#zL]c=3fA)⑾񠭄 ɩHW΃mU̴vB\1 X6 _9 G؝ Ab2^ֺ_T9(*q3ro`Pt{XQ@_p~ 47wMnp H[t8UƤVcI $á'A\1i(Ҫ p?Jئs>J[[[VJĸh;qhF8"erO00 !޲sSZ {/6 脁nk[piJy[:Ĩ'ARaU>>L]BI1P[c]?iX-] ˃vl 8Nc{[̩\ވJQ4geJ y(X`q~ 5e4IDB<R ;l!^gC-]]s Rz@{*|{jPtkd1!wbv *Uꩡ޽g6(pC{'SdwZcGhO. Y7Jcz lUS,GUD9!__=FԝJpG0Y_ n bdi>aVd}oZP?@/NE ڃ `\ \H?BςY_w?R%q}m8-3I,Z:64AeyoC6Y!WDR 뗉5>BfOY|ϋi6,~/ku%sj!ZK5փ< NS\ 6F9Y]J|Rs}&iF˛XZJok PgNJ)LKŔQ a4Wޅ."m-;)|1'T e*BO>:hEQVG*{+fC]s9KS@&Y2ahͧaEL#Lߙ;~kӐ)7lJJא2#3Bm3C9ԿAl1Ii'j Ef2@M"ᄠʦXxYŃ1z(>!ApanCkWa([ y0ŭ[H/)gҀ}*"Z 5HuF;j$'e֒hұGTewTOD#X)ftyRms_ {{ÏSN8W_Q`τ12?czGtK?S; {fNF M" إB݂$~.mOgղD'8?h#Ko:orDe9bi.k2nD@'噉,´/zt4C5 lh7áƳM"\˜?jύ˃\3a^{{ã)2%qҶ.hu#ЯZu٦ze6^}y^R_jȢ 1mQLfĉy֙*Eu)X"KI 2 2.kSo mtjGoțtըn!vYf9*ʹY3~- )mbTȔZZ4UOZV^֤{, wMh$d3RaJ f`')}IR<̵F3m ܰkϷLt?~&f\'rS5'aSRc߸d?vy.Bz6T[UX\*DpBN "}!6xmQFxvYiŶM~=N"8 3CBo֥4Pl6dJXج\Q)<f)e^/ d$' YoHo!`="鬠%+h&#Z>VJ,XY_Qq*pB!6\pvBrw*\4;i٘@-=w (oR% fwz. qK#IÝZ1Imِ#䐗P=*STU;j ȱ{s` BFxT/XCUyQuNbC g#ʲ tƒ~!sfU $wa9Pv7QńFlģ̫&UǾ ׿+_ngvB(-ӫ@%7 7-h$r9yQWSOS]CkY,w)QvOZ_ P5S]ߩ})! bxZ *#[#n05{ܸ;Ž򟹗غ6@׃a@d<)P@hNړ䪮Mk mߒVϘ%^nPq._A Gor2[ ¾jc`Ye|2c:S{H*Ϻrix;y]F=*T}Ս{Fx `t*)cZ+GϤbQ%MD$=6ʰppUsjE{ԯ%=ַ,#ӜyfMm~j=?yhkeF2Xx \AFSsp-5t]7e㚗EEIÿc%=X >v):KVOu4MJQqPJna&vTh&-:#F橇Ao`e̎bD?9[ @ 7%<ì"KMZ>\3\`ok51I^7[݊41#e# ؗ23ە zџ]4AaLm8 SB1U| :σD ~4'3ࣈO.^[a>i:ĤPAZ$ۊ1`%Vר?&ޞX0x)c)NL^W#@dW B T_#A-zմ50syfx:QG){viW" SD~a7!~q[iw /v'wQ8{ǘM@cUb.Lm3GWX.6"F$N$ ?iHe19]2Ѓuf[J̵WCUY?-2Ht c!n(֎EZODK{Nc ƤHpIG+U4 &PnUMQێBœ@uu~>BB=Yng[[:7l̑xִ'4ӁVo'Z<$hw&{FA90@2@e>ʁE?o4e<.y}` xW&|z7U=}2_ĒAbI>s^pK5hoͶW=|O7@PYXme:4E?KN}S ^"wMmfų$L uKSչo1FK Y5Sq<_VAImd҃a+0cՔ)I߷Po#&y? Mt`hP'KXis~-}ާ}Py1SV9XQF<o AY9<4*e | y mW={yg8)'>Hagoij)6w`u+3T HE2ISe\rtu P~p$U0ȡ-}|KZwSz Sn|RK VɞJyaspb%KŤ@}Lw @|3kh|btc3$HfGT]^(MF)1y%-}F/X<1E9anqt6J\%/ AVQpIJF5 Tqk`S yAÎ4Cc@ R35A!~XP/-4h㺬5.4a^*}\p}yMKW`ytweeI7`IF1fR}\[sO# @'O1G{U!uCo ^?'M!l{`!'ٳY6L9hڕQP Su*`Bzu(mtL3(PYu<)y":񆐜# ) [<8V!fdbW9uy2[E+{Y 97-M61i>וZǻc7^R^s˥f$݋piet ThvCEQ b3wQTf|ˏ40yLfY$'rlj+,p*,3 pnrTPaN[ao{rߜQspT]d4~7p/XdL-o%Ív2 2} VɢY#W rY CqAvh8@В*?TYF>ۓ[bA CCDMآ5? !P-v%o?g,S }XV!;([ F`j6$@jFI0癸4_zs }9Jd땳O3x? ʾԥ3DKT0ڴвV+IƵFucK_5i+$2A߀A]?;` W^}4)Sc4%31&;|EK٠ $B{Y2f巀L(Ə.Eoſ5]UcKpPo٩G vxu<ԁo6K&ȞM Ib<y'*` .a62ѻ3ܭ+0jKE$+J[yՑ\ϽXHaP&E$3jwp}W>{Nڰz2l@1}e(nY-Zex=:1f/Sԗש4b~,md-1-uwQy@]+Mo};R:=b :<)DHOёO |$SN(H[o eJo ?B$9e(LYwDie؜-l+|WơHxF$dyp:p!f[cP5zv##siéM?:,wCgfuX_CGޱ}Q|A`o4ߡ7lη}2ӪD]&7-T+uFHh>&ئtx$EP6 th$VTݻ{J2muHPFOzGu.?-^h^ytJޓy)\ѷ..T*+)Kiý]e a;YFRt=#gNqRf5T'?wab=0ga=|hD > Ö1Wl+#ˆn"քGKk$6= \pQaP׻VམD vۖNQPJ)-6td ߼gmⷰ%9 '瘄חBIᨧ_M]t~@rEPr08Diy M|Hf`hJHL9Z ]G:)nv\ N]8_af\x9.Y +GάI SL(>xX^Ԝ;Z䬲*+eɛs2"{]S65:jc>N9ia3|q ۓakc<;drlÕMd֬0RS]J@J0DLeOطqAȏ6czOˋooϰTů \JncT? =:u\$Gд=o%g-H>;3_ɘ6-!ui2b&ŲC޻;,McVg%|(<HK<F2; V|}Q? I[ݶ{'һ'.ő^Qjn Cu6MKo-2DuI]@5Y*Km>]OQ(n'II9ʦwY3Ύ5ͭ dz7vu+BsN$+r> eRSzY 93Y8dK^=ԕ;L?x瀻mFN%/R' DʽE.h؄%͟vlL1VtFW"NjA{夲uh|O)I8t ޥ2ݟ =[<@@47ÛLm>脅@DǗ,>4ذEQ4 @[.FQs{mI'݄LEW%9 _2_ C䯍t(E?1C^<ɚ/|Md{:q~ 2/#)!+v:׃s`G Wq5dk/IOHɂٯ3k,zgYPDo):Ǵ_y/oyscӚS0MI_bUf*8Cy 33|hC_)˺ܣu#ϭ/P2&_,|p|G tT("z.b_k%5rrJdeڤ^C#Q͔WKVr ~ZGoA|RCb Ô6(J5 һY|Vv;c\z-[M+_uQ2DRXESr%+_ye6hvhQ5F])S͡+zl_>΢n#:@; jRD)p _qGMmo >|h݇{g +' wpojKe U&r8M۝y`"ؚٝ+V)7"RΝ4eQVӧW*H䜊x{H$).=)qXʅaIJmb#B` 8VlR_eϚ4HLe5hFm6P֨l6na;CUZPJ%@Ac^vNw$x>alZ.TjAIdʁFj#mx6΄)tJǻ,L.~X2̳neѬY~m(~UkTqAǰp|c[$_{B|:/3t~E,൑(kϔ$ƻ>5_&#~d3:Fp*wM}F-PuVmR)&ú?ВrJ\Tk?sz3kYVjeKvS,?b Stlsw!Sqa/a 8O(<<k+vF nVryqx(Ĭ BOW_y-ܗҡYw$hPN^ " :Tuz4c.8l9IeOd:f6X5rޅi=c+֕1^B(c^2<tɁ9Χˆ$ZE6 wj Hf1kQdyow1Gg{h'u_q>QS]Jk`ŋd66gB+ DL=Tg;c5čb3-ۆ+ej5t;Ft@H.kbsQn Em!ҺxK@/=[F ހ3c ZrjUZʀb茱\Kw!=a"i_2^zQbO3jl{8pߣy)o^8]!1k` maxTKGa2 o{p1~g5d]^3K]l;"[@a GZRHv <ݻKv~ڴ%7O๨Tfu&BX]ί(.COd$PQRh !93Zm?DB 56e+fv:qDL& $Z3?F^XuA7Rwrbϲ04J4O<+V{@. ɥ(8y#X -t!nGRA\`^辣9 &[Bem?VWW/mK_"o[E_tzoRW߸qiɍN]cSVύgfMD. mˉHcÏ)MN8945@ՐОu:;2NV˨ʄ"hZ>~E/R*0" Pt3a6fq ?}5%zgs#|J߫!h$ӝfP$"K''ۥZ;H?>R/\ufґ)1mXy}E@KaV^H]k؟)3Ͳ₁uB|k( 2":5I3J|'FGm?.֨?Uyjmb&G^дZG P9`1mN_YN.8tUkM֡̕0jHZ=`7"1(AyK/oR[ԯs|6MJD(:J D''T]l:Fd?5 D&&*uwrˢb![)"wQ-t[gSV(nײ,XV;n=")N%rigePA\ -I uO_W4&G{8 liM#$ >?!9[p:4"<7C H&pSZt1=@pG,~FUT`᪥%^1>e&F3˻t & gf/зa \b=it'XКSM2 0C,c5U~+JH-qyA0Er"6=WֵJ-Iܥ"};6we؈M8my#dU2%5;˻]9w(H|h u2غJOF+A3^c]Bgu,z>]wU- I Lҕr츶ڔl /6 A~X _HOuHvk(e9nah;QGB=8$Ȏz*BFi1Hzdd(Y`龁O#߉ɢ,Omu WιW dx\Xy {)ĝ)LdAly'4; xY:撊ݠ934%ywdY0[tc G/kdERkRzTmK-8=t *p왁Ž0:`^\NTߗId;%!wQ>B]vNy%Ex .I2o,B'wP> /fLRe/D l(Ƒ0lg{,I:qʘFqNvRc~tV[#ur!2{vt>fhv| 7~P=XZ4;( `Z'  _+"Y "(2pϐ!=v E7wfG12E#Q/"T?V!YLѓB[*a1#Pi{)nSg PtΆ^?wqJ&NbBm/:S n(pJ䄭'0٤?ȊM8?sY-X+> MjgWx1 &rl).dۺl9w(2e#+ȷ)`>Ūg'zh]É]㦠5}$7 R Z৸ u7KarYxBm?i[ 1cY!Bdֶ5~o zd9= , P4,UawK|w^{=XۏjG#i?7EDŽF7/ msDq liW7'!AV,K`$OWuOv6WqKKJX~EK[ f?Ʊ9X |GSA&˦=ta :,ʼ:.o*Ѐ#Z )'va#|͡=Xm*ux̣#fXE7ⴎ<ģi6%Qk{0I#ZpX:EW"08A. x[q6RH`\/m&M hT5'0%uqeܣA~w@.kOHٞ`c @_R>PU a~ SL˧|l%+>lQ'Z^uߜs+,}ߢFd];&zt(Sx;%:dkr4ûo)]qu)~r j5>fJ^ hH۰`PO䙑,c=@0NQ)B0|g[fBE $${!QN.fƵ\B<侑x`̪4'ofVnd z=͒۱$W' s_-ChYKpYwa7!5W0WSVx)uM˷>6\oc~ FPSWO.OJU @RRמ¥e䝊qmNn1"p!K3'ʭ943OxuvY.\Rrz(_i"=dt;)9}oha<kV0~)SQ58p2UG`٦?jB_I =oO1!A3V'_bw_W5dx/:<½EX{7F p!?h75p(IXr8ֆ[sdWɇY ͐CH*8SVi=\ zz;=K0xh?%MǺhiY[G^}ǧ5i pSi"m`rtK].W~BP=pR50{;W?5b=]oqwT bлohop?!" ȑZt&f!.E(\yeL8!'3TNQX d"֣p+C -<7/=vs*F$U·TqvP]hT6d| XwppB+$ĜLMv!h-_{o|y;xFT~tZOs~@qf"\īqֈ,E j`.]C6rdltLO.IapC`_V4ffC iUT[] a &`v=3BpK3'8<ſ%uЬ`niS?M&v(vkȳDb 2dhQBpu8-hil:$0 lkXR^~0W2I$(^i Uk.!T_`d3o13m% 7]M'/4ۂı`s#cqOWɜ*XEwW_*sj:Xk`+ hL{}4q( {˹`3o-1EWً= _\#~X 0Ȭ N&T{硂x͌A:@ _]m[V[9dkbrHolϧs]x"'m`}; aÿ;AAjMxQkl|1_S ly6'.2F4 ?N$.[>~KR%=4;GixƖ7xI'(#wq'HTd 9Vmھuh>PxOP{IM?nq4L`VAlO/$PR^dHnT^⟯rA+E=C*q2Kc>وfEF9\ vRVKzQ#=VΌ_š, 6r!otP6fBbe+jN}ψH"t}O$ߓJ^4|ѐkirk,Dׯ߷YEU:mܔ;4X'y>W+_-~y4Gr>VF3W^P?EPbB_Aȇeu)Ir- O>Qۃ>\j޻͝2}(]Gy;3"¢G|'Zys& r.ӧa9 `RMw4y GP|ymybSr q0ae=l7#;Fbn[>g^]kpsT򋷞;m_M`6'%"l3]m>5\X;J3A4$O:4ZȥLOsn|cǨfuI QW]f΁KdPJD4:fx\]vjNrǚH #},вhA?gTP[-TNar[1h1HcBc!v&C:ArNMRWS324GO[*_rKQ9 Pl1f[]3XRgl?_'O˰-8/5~]=ޣ;SIr 0?lLZjC2W`7$AS` طbĩMd%֧KjVҕefT:7ܹjT$ir@׍BX^_Pl!K-jgt~KU*5zym=GmfHsX#}戒PmJwZ]V'R3P*;, A- _]a5}؎ YP7;iE׿Ix7-*a) ts,0݁GEZ/+oS(@v%szں.} f?kF ^~Ս" ?LfIZN/<1URKsBM[s@([f4W A _ZbKX2N7"|gk;S1t62'ēhK1$PL뢁8*5% $n-PJ/o>J\n=->^EOx{yeD$1ح`]LH٘1[~UCRYGb$ݗ1jV($V7{N(*iB ]stu͞>glȀSNf7:;vpW٫: We[۪oاh>Y؂VzsrSBv)0\i9E83c͡ Dip[n EX8Im(`>o=c-d-m2n5.5&eǺ ^Asy|Ë45o 4ނ)Yͽ@n"u]H)% BыT{^ۑ|1,trZVKM, EeBPx5tVvxJ3Ԧ5`N5S h\  B"qeMH.]9S(d%Vnʇ} :m-Đ|,nD}]L需K#q>~[ݢcpFm:!B0\p4@D rtlpv;Ӏ`YRRUIkzfɻ8{b :Bb{hp,V{Y?7' _s.\ҁT`?ޮ 9NbKh1,F7NR_99>( XvhӉ)x:&Z6'KEF4s u5zǫWɦޕ`M'| QP<[Ba4㭖P g[R}(t,g1vJ4 "/$[}ʱrKY{%Hh/r6}d]A`]|^Y̙ ^Y2r!r1%Ao: E kXuRNS;]zd[~k*Ũ=+ɲx; ccoSRlqx Qlf)upAQkuS݉wn2kdeE%KsN}~՗nWЇzW~wN# A'jnT7' =fJ$-gGPQ|bzK; CEN(.w.OKi-!̇}& ( 0`d{q==jw)܇TR.2!a̤+Gٯ/@ʵшp2V= L.mNDz8-xN"">9 J,/JD5,=w6Jl~5RyO6WJp"wYQΫ8j]<ʧwg wˈ F_VgG4 bߒp~z]"P*/>Ҋ@z.G6\#@];aSh >v'-﫯l'>VN݁Ҍ',fÉ`T)wz.Ts lsm0(:8HumYwaʛУSl i3tfXY/CJ؟!t謊Q0vrze=?.Mۋ :xSX-_Su\zLzHMRC/v @w?C@ʓo]ӽ) ^DE2_r(ɹƒ,;sK=@}O/ѵ$甛Ŀ7½Rck=@ci lUdiaE l_:_*?. `KzA' `3M Qz }dtLH|U=CEE;C(Q}c:io?lc=;7TZ=9ebz{l". BzylV%k?_+ ,Q[MycQEzH)vyh 8HH%`en6[@_P=~Y0~ 85gX/wV`PcP6RNIw$(wŘqP<ޠ\Ο#v]*8mDAq@ 鲛&Hn >_"e!xwIJnϧ+8M萰ڄت:0tw{) I}]N@TsP?k>ﴱNMqh$Wi0LzsnWOOYRX Ceѯ 6 VbD!s6QG .'EHTK;J[zp^͗`\޽N-*/M\bN׶Ta7-P=Pu.miM'8`V&%܃tvOT~P]S_Q8FI^axYFk>AgR<9g'!H5E|L5-1.I@8F]L,?KY-E歑jݤOL[f B MbgR^ j&|Fb֝}AKvk`f4Oq% h ~8۞/|g~gbqh^հ,ؐ)?u_ƈ4DoGk#X@T)%ܙG~/p/ǚZ|_jc;W5?Y\# y߉1F=nhY+S^([뙰H[SHc` _ivBPpؘa>Hˆ\ranp{~AooϖOHcYY9o}wJ3Ou& 0GU<T_Brf&~3 {MT-XX>j {ֱIo^];A\/`l(_V: O$(ݎxasGezc+nG{5/l-lU K̓.3%Dkhoh# Hѥ5x& V) _ž k뺭I8EzRp T\Jֽٛ]7yf($Z7t~kJtɁDBAīZPf3@g$bUFoJ_24LԱATǙЌ!͉jᕡTHCzC; J'~fPDyYLẙSOӐw/K`?qe^ƺ[}y?gOń4'w 8X5ywFXZV2h{C׵C^JCZ =Kw;?xu`W?$g[[Y N/TE@uH"h&gpup&W~=] taL\ÌU)g©[AZ1Mef+R$s_t֝ U0*OnZv@[?g@B_uqy?ٕ=#$npw2)lFCfG V5aY]4$ 6%LҏA0J_Kf<.t L e @)V&WB șX5^cvQQf)$IAF^DIPBki_I\o(No4/8 .fCZ[ȴl ve 1[2{i*tjIPҶ9`v2tpIxحK/O$D4WpƴԗWE-&19*-Cܓ+a?fǒ}L(|`|4h6B x,M+Koew}>-/Q_M&H5]vF<jY8v9Nm\Qi=UhٻwP­I[v=KL_=RK>šFN3pzr8v)`DhQSx;\(hlEkI5oy#={w8sw"-2{rdzDb,=^ޟ\l(fWc׫vϏ :ywKTP%kpXgy4h\ȶ nUT+ruIgRSg3ګ!֋>{i95 ӺpvEo2) OW;0P2죈b*/9>DŽˈߩkW&ܬ^ j)#ve@oTBw FmƬ1"(^0U 3^mR8a*4/ϩLQ"x"`1x<0K60RP-sXy҃r眡@ЈSM6ImFM57 7iEi2j 7^@᠛a Q=<񫫵w5kПu:PHw=2JSxz1+waX6&p "|uF oa/nVb G?!TU@XLp.,~wf7}fEL+q`W!6*y&Յ֛"w"F wZN6Sݘ_J*݋ @hzg@1`c Ⱥo.~8ƀc:)ox nݰ:r=lM-#kv8 ؑkiL%;ɳolz20|OZ7f+J|Ӑ܀Z{S76lpim8,g HvELg{>heBzIؼ XUzح8]7(W fg}nffr7Z3ut ~U4;  $uÑ9嚍,aJ;=դ?FA(^tv+l7 |tC7Щk:Z6fFotKr.pOC5G~<-b(dgݗlu:40yz!qvMm_R@8~!Ľ(WPt V@v5tbseXVI ԕ ')~]AWFs#VС;0amB V˸3 өGݦ\5`g2<ۆP*-s([huY#ٯԙL{DXޥ8.DͷEC;x޾p7ZJ$0ڒ7.^ &k*n)<[Ȩ筛 4r:m=f!Ƶ&ι23yhR-yܸyҜ"4L3M"ų,"ơV}>-|`桎#a;h· WY2ła#j2etce$hfYI-Ç|]vqWi>v% <ڠHD=YYw捇`q 5L)_LAW=1XZ++.mǷ4.!ŷ?0D:PQ>vVQ'i@)5{$<zrCD8uQLchN([n4 },sbȕLtVPOf%|(D:TOg<4b)<"/6_XeQ **Va|vo~ӗ ,wQ!ZhrmsQ4]-'HJ̎ }$r.mydA)#I$ؽ b&]@He]k,0DdE:"w^;+R` j)׃n&qer^kM>DMS.,!}^/BL*ndDTt4hn:AGu}q[%gM7Z~5ws*FtƙYķ&4{A>,g-!\y~\!ur k4xa,YvM恪¹vsR.!H=hl=Npq }γԻ!uE1e$e#xplKC+ONrZ_A_b;6U?1zbu{# J"x`{rtЬwj,XYm? Jzw׺iI L2yN`6inA9')$bĸB3ש<Ø,/FWg(>s>QIzߧC-57M\T5Σ7ētW<_$__~?!Dਸ਼\s读: yE.5)P!Q~7@vqmo rA]y` rIcB?h/w hEmk`3h8菥>vl6*U'>FD7ϥ>Uk @.i $;<=ԮCd4/-.C@̕F;Uk=Bgm[Ȏ(ćl/ҵx]G QkSZ0SӒbMkr,6׆3%S|$ l 8(ɲQk M015 >yP=7 ÿ`<'ISF20 " XJ X5hf%¢ˡXg+ *pHл``wv6Zk٭^{j5j뷳#ΐ߼m y[&"9|qnA ՘ּ -9}W7l2,NIlⱊ`RB3ÆE`uP)d/&U)yuiHN:ͦr2DtmIv7&R-&¡Ka"*TLY}'MYG}&t75j|R]ְFq9iυ|KN j "(3*ݖ q7+n)]Wþ|Ȳŷ?7PFن4<BJlS0M>ȗ2E'#環k;~?;HLR1_^5\ߦ%ڷ*7v+ C-\iFTu|$U1L}\v}~GfMGLjDZ] b b׌M<'_'WV`ayy.yM*09^3sn]i<52 ttM1ՊC [^ł>b2t`x "HU,5q@Ʊ_hfwX-T9xƣlΣ(Z`(Z&Jk}3XjmeaFӜ}2Dg%R%fJ|~xA9Pczt$t aY`\2h*D4~׳7J?1]k^ aSv]\A~g [PLyHr$A &`&\@Fd6}6<<4rͬ.;4C$v(__a%z.B^qaJ*, 5%=FKQDis ߰0/[8H{5H쥌XWzϧ}N֭t_G}ƥ>";;؈eBn%w[ek4h; =¡so~wܶ˨M6|9Z}|R֝gdKvʪ0m;4[%a&4MW2Vm, d1NtSp+!1TD"~Z4oU ޺WTe]99|,p2Ce|aSS=u^8x_cSuv<ۮya2ui%Ņjp~.@DQ.ŧvM" %D88¼-;j :TL}Qz@' 7A"xx/VU$K2tDqʯI 9-ڦ?HlK^SIL)Y_D=tPM8kwy tܚ0Z:J ؍7>?$z6Ǔ y GU :z̕w^Smc 4vJ Q+Hc҅q&{^7QXzp9cbq[ <iD/)JH)ܼL i|@TƼ R w2w=,!KOmbʭD zgpv{\9~U8pZxJ2_ {MlIal/(T g(, KcY ]=8;F] -?qB.1j2p4xѝ/-/!| F};;37lݱN#+釺ԝg؁Jc&DfP}W7HtA2f /͂/g`p`S/&EPMcG@=:Yt3v6%IJ![QRϏah C'cXvnR.uG"=%$PW6gg By*  {1LxaUP!6)indAC E?AJv?v`n15u*=nx}/Όi9X)~_>j5tNM>?_ U2p8mJ(cG`IGG.Pm !^zb{A\ʹB@>d-c2dt+ )cGn]")0 1Ý4sJݝ.AB1@a9Ssn|zsr$ L\CD,۸YBzv2qV[Q_[y×ٚȉU҃@ .~%z_Wg:rBW։j:ta wNsww M88Ќ@yR1Yw &01{Ui >?^Ԙ-zM<p T 9>~+-NM?1PoDŽ  4hKemDqq.ɣKjw#D̄#+iCrN;KLn;o%|;|( =S62Ui|0-bj@׏v>VXB70v!k|~T ـ+aښă+jS ]INf"Mv ?Fkok8yqPK -OeOS g0=q3P@gqz&" eu h~bǚ> (0QxQlaQ X 5p[GJ!1_Dl'U 5`Bq+;_ QBʁ &tpBߩ!KfنXm$ imQMf\r\h7{|h^KDIƻ.^wm_Qm#Yfpq5|>cozh_ /ԩ_[7;> ޤf'pϰɚ? |Y`JYgh"/= Xt@,cs\c'}}Ji 1sS^hא}1IGJrs'Àl]e0cn/CAŻ=VS2ڌ$//sLjHaY\fτ}iU xb\*IB޾su@Հ&R/?>Y]Ebcׂ]_VBi}3 G4vTXaE1]}7!fU7a[fAx_u+2F^63pЌ+ /]y:bmg9%,GHWRV*-O5ï]C6YH,ho(r!tyIRY  (,~Lb3QtVOP2#,^Jyu!.=|Xm8m`jew \x=Z[lDRzLlhX vU#* R(WKz я =l?tf<2f|cE-m./Ceyݲa+>dU&9e qr}j'=aD4Vk.QKm7Sׄ8<ހ-AzF}?G6t \T|\ϣo%]&Nn>Z: '8x[πwrG'!䣎pX%đceJ#pXZu  +-o/nƄBoVƦ?.0uyL9$r+MD&(̕ MQJFBEyI)/ngӯgA'J(_x2<$JWBKg5Dp(!N̾t<Хė(yfj@Up 'X t%ðiazXmz\]L iS2@ DESدЩX!l?oRNMЯ-sYS=7OP KZx⢏U-qX,,4;0^aqK]rd673J"17)cP.XXF{9)vYh]n^XPXK=sPoh{_/NZf0,r:UQHO_,8V҅e_&E Ͷ],G/?}퉰[zҵbwQY T4er+BP&G5[HCSt5HyEY tjy^1G-u~f]N-rkIPg5!6.FOFU XD20m6//+@jd; 8KV~ 6hKɸ'nqAC^]A4Bk{p Ot x[r6ݫJ#ޯwùlvGCB,Tv*f#+-=3Gh = z v8ЈT2,B>fU#%XwN ?ej<3m!=3EނmL9syl#J gjbFx愳h)F\49Z!ϯ]ڲ*‰/ޤj] NkXE܎ʏ9> tuMt`+Gn~De22 \9υYX[,0 pAC_qKa+B{%@i4s*nUtJ\%X4h&1sb fle=?Gr2kawΦAܿ*yc~ϡ0yd~~#eMﴯxnE(S 3*hDL Za߫\!y!]S#/Fny 8:O8D R>XWO>a (b#>.4!imlCaUy:.&2"#roK H􌗁1o/7z>{+ey+t  +=A+z%9S"b[yf[Y`Njf\nG۲3lϽv4Q5YJZVi(mʾ/!nEUBŸObuGck&i1*&AN o We4IX`O9N>>`gpV▪`lGĆT,='y'tg͆huj#OY~ڞ)Qye ^9qی4 55<;w4 7*5pG %{f5nUxLkYt, ¾.][Ѭcetڈ4?7|6Yugbd)MVQg)gh11kT}{DY#  qY@;M;o1i~K]Պdߗ1Y@c?3Qz'fyx,Ŏ:uz/Q1'8@KfkEd}cw]؛9#Վt=P ~Gf0Ωq5R|,c,X[KuDQQDxg@㻭S q ٗC )@ pANL+]ňd,{6>ե;E`T,dSjMT׻ƹL$%zy>7[S5e9u&..[c 3[NM/fI;Jh2("f$x˪Q;6]6au)\l@z_zt:F+<[7n\drV)2s vQqp,u<5ȋ͂Gt:@|)*称2mBٷ/!9Ҽr}1(;gʸK(E藥uq#\q*2/ NZnv8?5nC)\V⸞ tH4 uIO); ۯqk:5R%L9r"e: {x`+XqQތ>]/ooaL'^PX{(Lߗ/7E(dx|ӟ= p~sI%{3X9&X fr9 BOcTpyYP˛ܶ4`:ד r>(`e-a͐.[",${YnӜí>J*/u?rQ}y,5H2|ᶞ*Psqi j-8><?]d[yBaS Y>) e!~/ef(W/tYEvgbq!sWF 7NMV*װ٩+FAYd隊tÁ%c5t\05ocQ6?77B$~I滦|M#M4}wDke 5ٝ! &ͤFs[!Ѽn[+`p/ySՂupEoڎF9us0o (w5D*8&d[ʐ:r$6qLIzi@рM31^+'4H޽F؟-U`գesTfs@v=#v/Kv;$`I#Id.E#X 0ުTLt`8D8Z05_BMuQ#敇mݽXf;$G-/ȩTkky=&.;,Z6ХzPӚޑ*SMCUԏ8 [I 0tEPK!-F7k b]Ь3$j1}'AIS>!jEZxV ̔o{š p~)͞qDKmKdӜ1Xs;~rK06G(0M/XkeEeZ?>2rA?3&sfH=]rE.VO }3w5B:9nlU xdL7_Y|r0"vRaN-?sgшO[%ybvK톹Yrt洃s-C< sKqg."s8g QR#&z% xsRa.;=Ȕ^̯ɔެ&ANϑ2Jq\~QwjntÝTUuVL##i<eԔa/Kz[GQ9ʆ~;)H4 jjwh-0>IFSYͦ{hKIa3b9uw5E%e:$v摀nT\&'alkYŚAf@"_ YKPcٗP *$ @D\߁ rP;m&ٔ(^)Q21WIw`Qj16X=d&v"v~=܂SDbߒʔR@)\> E^ 7Գ1:^sn`ge$W$SwIbh)mאn7 $C89kQVAY {H9K$ഺ,_U!sa^^oy٧(GKeE %&9h] n.h+'yp 1 [(-D, D?u0 )vimޞuoG[VE:]4]k_WBXÅIm2+1&Fxxر;XX.mRڄ&p̼L~p[ 9ev˨;?b<87z~wd@"煖tOE7"a-F8IL[HxWCA20YZWv3u|10{X3EMY@SVKVϐ4\*zݼ %wq*C,K3Xb)ˀ}6ʷmhT.?AP 7o*Y_;KW`GrS&͂_H!%߬ˢ\.޺2g"ߌYrf|$3@ϕs0(<]Y'(54Ph p qT^Pfuwt2EM쥑iRV%N/ qװVS͵ħiEu/!8a̢Ų^R[2Ϊ58w_ܯYRGnJ d4c[@Xr d(u!_赌zWÉ32!kZ=AA^`',9&jHR+d.CF{Ч}!S9Pu^QA&iCiJMwyX)~`΅LE([^ uv`fHjHIL4s0rnc.e(lf|d?/˩s] Uc HKӚoAr1>/WQbvDrq!iV=#dLV/Yѝq{Flڈ=~ Zђ*ed<4o u2 |uc;;6_ uR8('zvyqCoXA"YIQl);OHvh+LD:hbܺJT\"$5?!"c|?f_Σ,$raڸXӋ;F+QG9#\00֢3d.=)K^ˬY>t7s#4WmAi62D9&s:q?! T/S}@"EAqIQ`աz-J>y p?{GLʟ ؕԕ1Zd D^ft)cjSjbA7ǣLJ4"ƕjǒkmzʶl*m #L&4I1Џx_QMkvhHk%M%ўGHCE^%AYnw-P,h w? I|İQ0ma_]aES6OJ t{ r6Hcfwl[RoqM:uNxH z(@?-e[gvNlM{H"YM,> ":qY(rEOe?Ӑx!02qlJe…hLJWnTI#WhS2GrBP"`G' &/p[]`6zu$ˤ?y/RTO:RgL#FNGXܾ`%uqOA>'kd0$ f( ].0ɼ/c{Uw&"%'d{~%9]u3Citc/{Jh`bmWnްj:;K1m:ԶlTuyr7K/m6X5 ΘhzQWZR8$Qp8L $eݠ9S׶[ɼfeRl:,uH 16J{ SnUc!CqmΒ!90ZiZ#bEȁ4y FB@˞98QV7dl~(ݑ$\%`U*}\UQm: W같7[+Omo W%XSQS7Y2m\Lt& Lgt tcyca<=l~Q+YavPXhg^g O `5TC0/rN7'dw 0VZ2{(W&_c1S߲<:QT ,̪ 3VmfDI靌m􀽍g/eϼhMn2^#_ k Dh;˿y=]_- Kz,ZI zTSm|6&[_>7<2oR츨1mj<&%|#0/W|N/L+4 `QN P~ݡQ<Ѹj_:4 ?d&ccٚ>昡?lUn0HP@F7M ow+)nWOj;_\ IZ#KjAhQ C PjtW sNyQr.#O [ +!TbB8"# h?]?5[0891t0N&TaR)\ACOZq+Cb9q}krT%zDݝjuuA湋`on$.dv-Qv /33Ij0g+ 7aKK$k홵TpOrUlDS3Z'O0jPDs=O);ŹQ(UrcjoצF r@む4teU@zƹ&NkK(C ^\\A ;ѝ"7xOxWS*jy"x G&⮒E3E46XVedbP~byINQAyUt/tk⹉mA nHYq&p;rՖZ&<@< p&A3^:^$av~~04"Z(Xr-tj vm 9w"/^˿M2/?-K q6{;M>u8w5H$bnCKw,-d_Q ImkitʏSS" D~a!dX"7N{I+"{Lk 'Ԗx騷~4!ssxGZu78g&Э%A3)vmKJ(Av[rn´- chgşW|!xY[6c}or,l=ReƠqE1pEU(j(hno:(M:2-<]afzo, 84A/CxP¾gS&% SC 9 :# WCS'Exu@=OO %\ ѭ[TwF5޻OAZ1g?, /"x`86oZ46ݩ q c}ʝ~pb"<&<׵KOсsG6hJNrnh')z`w*hfFvxȍbP$E5 <B$" ɂ2{{rb.v$ptX|;Jă,f̈۸U3 %0w(KVbቍ5i3-+BdvBM<8[ н)z X -ca cnٵ =(}VTDf+Ry7Ni6,c5Џ7D Gx;vXࣕpsp8_eG'>l,4I,`=u65Qh?µ`(]\I'=,ť'#hQ:<>{S; e(=E |W84hҋS;LON ˜BBAx d5%ӳ͛j) b.PLum}azmc|t @!耆'*&X:͑Ҧ=lVRD aDsvYdC٥PWxLϛ A86VX:#:2N<)`xGHU> \(I˰337jW<~}'& ul)S&ĎYzY!018e.['(u۬ya%j1;^t|)]W?U:=҇pa'oBK@/L2񀨟gm4 맖 elSaa J=qk%i_ۀ9DCj]>.9]\Tc+:1vnw{iK%J0ԎZ6y}q [kZ3oKD AkIϟ%jp =,$j1\;D>f^Ao9Ƴ\;e+6 F2 4059:+ˬ̔>N "8/ r8' ǵ_j9"~ܭCާ)g &nFu-'6R8*F\,m̮ۂ!R 9U]L-QC& 26/+Yao%>}TW|\ceḬWH FiX*xHs }|@]Λ# ܯSeE EjHʇ:P0;(;@3J#f8w?qͯ ɚfBro .=ӯXp8i$ߛ mv '"QNЧ'ݗi!s|CdiB/~u_h(w İm=\S=cSzG r.~ xON Hdk EJȡѪ@g:_-Ks8LQ. 7:Cκ{(#szAyYJ=yz, /^)9[7oe%0']^UPĒ]ie8 3b%ը"v6zKUEgORP78l%u]DK .p e'?n.'MPkuFn;;=i!t[OXeЀXT?ct\KI&PeOuA/u lѣ]x6 DEvL.! 7#?قvVUW vQXul6bM Y]@IzGqsz)޺e[҅#kX񠫋,ձ^n-t>S:I!lf,C&LA`084Y= Sq#Zչ93#R9>Sx3{7;7 *GK^~?;g}1-ٖSxG{h^B4!57<\]NPuyy>EH.խ"8]ZzgwxBrOb.=Nn ='.#e}!.=*13O&˓fDN9];vGt O:hsXAA8M`Y'ᴶӝr;oRg UPw6.uL1_Ix4w%FeIC_"=,=cbۢ9-uA{e3NC?~,fTji 1>Z2 3)0lOcigya f hz+%JV7>|RzV;AGոoNa)b6D+'%0!6yQ!&LG.Es؃e ?R٭5%5 حlH䢠2ڣXvB'cb$s/,zsKwzRR`wYMÈL*X8Hu˃k!$. rDqؘW H 2k'U.SjYa?$.2Ost&[⿷&1!k@m ,vdB)B4|z^ۋ+f?B~p&d6S'ܱfw wc@XPFoG_$={M;+RdvY3檪E"?֏O9PjdhXbua/oN>-l,Pwk},Ɵ=[XG~BAxahx9kzFX@WՒ?C?\]5.7¤4-D*;#^/^TOF640q*3eY_Fuzj&/ʺlB牰ǒuӓe>G)̗7 >|l<8 23,ՙZ(woZ&o~Z@C%\Ddb$G"u3!6c h HuSk7yì*.k= ^VojƭZd:Ȧ|4k/;}3Β[1VHsIq?~owØB6tp6W:H@cnYfU4;* -+'ZO Eo% )7݉XтgY\(Y$5ҿ[4N" 4Pe˲8K%r k.Gf񛑔8?Ѝ 3jGuyF0A@uLOx:2o3(5]zbQ uӂ%,qc2q'ULIqA w5eLcMHhSSdo vK]%xrR1@Ԧ7gzx "Ir xdw|YZDYKNh6;huOXӷ K~kwv~F9dLh_ܔnt+aV܊R'wmP+C8(/}YEp/)MJqh{T^N״䳍S 9ݐ㻙1T߾!<(0R;{NeT⳷i0#0[*{5UW#OMxIgIT56\IŀF8=[3do5񡏃 E- Y~g>a*^yijwiHE ( s**/J:݄aoږY8jF+åq|"LẐ*XkEnVZվTS]b1ތL(s웦G. w@Ux_O$VD+@>Û AJ1e#@#BSXƚ1]^R[],Sf_~%vWx׹5)/ݍwӠC%r$_9Iм(l+bH( /KvE]4WxBMdhm;^dU_z,Ox eEX>&h짭j:`,*8:zK[U9e?c A$-2/Z67y[AzaqPQ #Z6ಗhNCܚgAx//EбgHZ%TSL 6͒B,tū$?SUB쥐2oH`:rot‘-+i@%a猿a<X.>y #E˴irZ"/Y;wTB ֯[ՑuRI DriG,dIIa$:618xȬP}kxyÂF! ]s eKJ8>q^_ H!#9mzވeɈQ A8 C0WBK-#rb@5 -y ^]<+S(6X ȼ[?3#3CnM~aF GS4> J'Ufz *apq2C˜WN~=tmryG@bd5OYCZ VK>HC2+ãԭ \ / @{C> +FˇL.dz9D$8.Ns/U^P! k&#Q:#N:N&+B7:ٽfpvjX([fKZS3Xv4l#|JI Km&٠]UJQoOV{f)IA߄XC ¸"Qj\zS|m!-gMx}$$V]ā; 8]IHߞ"nҪ|W^ Jaqe`ᢊLL/L%8wU)+#o@_aK$R |*"^5)Y/ ~ɓ}zQ< > 7kLh գzpE,ML[x9"vEz^Rׁ Z7 M r,'WAG:)Tw a թ,yupC,nkzs#wqhCKX=d;2_#H­U)U[5Ywa8F6Չ6~8SrKy+$t[U5Fsut2t+O!,Ėc\<;yxO y`rү`n!^cGmЏnqqɫۡ<D [\D~%} z/Ʃ×NNdpXR]dFTm@OH]:qSZp+JZbxS;_g dxQx{d`GG%>awfcz6P%YJBV IjHH 0 <=?j,?Qxhf=_p`r:u_=S LvUCH2 '@e_ 9uGTa\ If=[4wt2BZPǝg  *EA s<0+#:[HRR$;kŃ<wfXǀkC5!#~fp87^l P%$%S Wq=UfBzª$d5WӚLkܡAh5 3%g4%L*~*p~C)fy NWtuGܾ#tF0HZǑ$f c&;I[@0GPAݫ.),(^HޓW{J70 u"yq՘fi |)IWָ!&PimwHZk?.Z hͻ0 SćH!#0x @cbBUd uB'MJNCJV)Sιv4fWlfi'# 8 |5] n{sd`Gu'bYͻG{`ve& 悛2uxQ:QLw<\UߐԐ6_O!fw:]a#L2Tdq\W_0bnFaZ]*c:܏)Gi27:~|zWver~\ҵnӸh]=<'"Ҧw-(t] = iSQ%&LX cdwm,vYxtY>n5FפWW_@j`EhJFuL`aO=Ȑ8 L!aR yp[ 1Bo*|.3ٍ7'ڼL( I-V6m\xӻ:$p U{pO M;OМن"wƒXFnݲ\V,_?Ň96 B B&(] (Qr܇ή #Yݻsk\sG\:^uCc%)>ox[=ܠگևVp9oi3n/n&km8 {xMs/SV_BsAzv uJVވDSv. BR*]kU'9?#.HD)m0K@ T*tm})lU_k|XIJٻ٢y\r F[DQ | ;W`ﷳH!h辜iyPg ?0Jt7p/b"Mt2[a3{zM8ZS Q{U%Pi*[mT, DM<_ܕ9˟*ޒp6n0oKq\BwKٔD =Ek3!ɘ툠 L??.[+DmtDy߶&6$ob<=UG2\jԛ%ky0|F˴EIXߗC߽' 뗧U:Te} ʏL ֧5e/mmg?Xk<Γ"tp t??y{)O=?ל١d4AeEƌwHZd0W%1`@? U7 ¶k J!j"$lȣ'*klm oSCuD ^fbͮ(kp`;r7pjG m/3,8 \tb'Umݑ-]p\0[#ui/Aǯpt˧(Bz bl4bFa8;f3s+q *`ׅ\aA;Nt6]=Fgk68z:s?S,z!K9е*_/i"3-|7[qD/wz?\_yeZcF6ZƗ}) ZvؗYiϙsqLF^ 9@~V2XW-ǵhAO^dA6`砃/D뺩M쪚d˔kI*nj,u&ّbJѐa9?'mxL=|:0F6o ȏp¥#5+ÍJjStqϽ9Ӭm/D VǸQ >i>3psAg6%dnj{i:lو1mh%pn(GKaLj}U FEP$ `e4ІD!r> Q/wc{r42Q,{W6 0aͺH89T1k \O|Q1G98MbGJIO^!Vq 鋚pܚF;!v=<ߥ1 H\ au7tng_GG&oF C)_2U:vyn=[v8SZYq G(>/-y< L2ׅuuWDlR+kG^$//%ȿ?ȏBwiTm2V74.~'Լ~fgdqq is, ěE[]TOFc kCwio[2td 1jF[!*"S#+pâҰ'%]➀x<*L0uLNc 3bP/ÎG7deQg"FZ[4-[5*WN?wYZ%@tEG{J b?JdU)՚2ɲJǼN7ܣmvs F]@B0r;F۶z<nbRŌd-1?-ãVґHAJ r֐xi+ PgBǽ%{c֘A"f҉ `=K7?A`!Pz$ےأ>r%/m!6d$XW(2dg,C{*]TW~^872KE<6!p<:{v'FnHUHZPM=e)g'xM% _^|:S=uȓ՘|`X,9v`E3p)ɏM1DEFHD4vN0bsW,TmѬM,ڽjqһ%Q-c-Klk`lRWG^kP]5=,,PK_ 27F`f=Uc \& ം`m됓nRUm^ú/| yt5)[zoQ["w Q)H)6TSouZNlWԴ7bG%6;,XT,[ɁFj̫L;2\5 O 566ٿܬ$ z? 0 #Dʅ46mr`,uIs@vЙ$':݈J<WqSv wdN酪Ԗ =24o^&$Vn٭iG |Yi6g]p(~d*2]Ñ7|n1 AnnΘp oDL刮$ p%`a-IwQ_^L?9s&97g(>^Q(8V! 6AXdoznFJK})6|/HâRҷD_vFLwhr`RsDVnuDK,kRO8/emrfYI$P;1GF {k^(ũ)lrW2OD4Eͯ}4!}a41bozQ@K,U_>A] kJg պGr}͙R`1vQ7l{#)۸Cl;%Q$ahefF]3;`.iqY%SKuxYCT]]PUc1 FλQ@QjTnPBmBAi'%.֜3ohFj Qע Q\P{H,V8 1"l61+ߔ5!t>?;:f+Y#g5(K3;M-u7f"18ݎ,'t3* {t[jnF`/b>CZ]T˶=Zsd=˫ڼ^ 8JS˝x6:N_'`??X/k,4MTgc_RrklRdyY UvWVR ﴢv}˴ǫNƅk%x3v<WMz:g3zbUp`qa5"JJQw#jP=q`C(T5)g1NHw%dIzywʑTfWI%11۹ gIxYUx>\Ć<ʗ=w4 qN:՝۲)FF xٵ;=?(ZK/303TV) 9\mk{߉o\u"C+P MznLn2׋f#(ۮ~|(c 떦|)$[<8G>B}NF`/dihqF|l6]s۪`[r.#sCF#:z2. _ڊ9HjrG2iu/@Qy;KPfTyhAoW CQ/v8z@[ 9z<7$,;Z[H[4N{.f-ڲWmBowdBonLZK/>E{b(%ֹ,8*F]rO]a$4.GCV00zF$KI ٕ1u͕ w{ 툯*@&sxw ՝ ߙ_i1msguWԒthM9ZI.y c@ Y '=˔jd#Eꒋ c~Ԣ&G¬e IplaOO,G!9L屫'OUE(P#_}3:ڮ,=Ncιn~ ќE:xf w;-ڔRScWVhKg뺤hvhBYyd55Q &wB~ qo:^\FDœWzBҝ=zɯi>ܤ S*EЀ)v^RPuKW+ 2<}38f~,;~FN̽~mmYk|<֑+@Gqo~:K6Fih֓XchCʞ1eI?뭦dA{X\M>TIP @$}X2;fzqm\. JIjЙ}~*6TVq\.HW.*z<(2rʮO_/:poYVFǾA=?ُ'4S[Op;0mtd4ޤѓ zpA_)fipA#ò磴 a8 =_ 8)쭑^U#/=}ȍK]릔۷1PwN;dZdbПLm݅X2%S();z #m!bqnD1bp;2:Q|p[Ljyk{ 4 mٝSK ,[8 ɟyj} ZA6l?4Y +yV/I~+J}2qB3y=cbKxt{ %&~Ql7b$oi-=&]Dd’kc<"urD%u*æ0%` g1jmMP2@@|P'DpWlsܘϜ. 2z0L OX8 Bô{(qF_^"T+v߽@zbT-JznD lށi.ڠ˓Vg\'o@4^SUI};k;d\>M թpem43Ɇ׭SPblأw|~ʟT~ h-`WFHEѽ%V%o+&6)%'{;l* ~1y8-M,nkc> RWxk&r޺H=xC5 zUKO=*8e; x$Kw] 8 Vh UR|sUgD7gWzuF[(@a15C nsk{R_z"Z;Q7~dNl\`fhoߗmn `H 5;s?(k;(8eΨT\qO]p|iZgg C`Agѵ #m9% L6nȱr"T.|L;IpU8 h$;&G=z8lآr܍\1Vu3 D&,jq(/9Gk$x/*X-DQ.\Ğ}w2 3{BeH8߷:KOYVѻeC4elT8roIg7 k/C7aK] \s/KweD<_h-8.(BU:k%1'I~&VtlTY&dzA4.@p:rC_H~xXXQ:6)vY҃;Nj"8> jȇkBl03}$ 3&dA\{s%˩R+ rM$kP[GvILbj^ᣄI lktZՑ9k|~Me y*/8!#x%mHIKIkd4%ez=[mkx!i ^#MNUD*gu$AK Xy ( 76*i=8h+B ^iL݋N;&WRB=>nOųso?SKn1㖰BXRB/DG "To\ߊLxl/v H 5(EAvo!>rW1Ήrhup9޹.&> 2{^_VE^ܘÛVf\(&% |zW.1`ә#:d)t5UG*۵,UPnk0; bt>%Pc;+ר2 Er_PNo ~e / ۔aFx}MgO;cEkv%*5? _x25?zmo`\ vw(>hSCj^̤cd f](>gP 9;-]~Vy?^[q~S; E.n&ɖ` <\awNLfo dUikŨ4[Z ,E^XbxR8%{Rؑ!SDͩ}\gVUF784 OxkMs -ԓ*牓_MZGuf [.Qɪ_/KS}l̾vłEx\,x/=?̩{0}46e XV v͸a ƚj'4]WAV?ݛ:3.5{DԐ㏈W0}H]| :X{<)" Y/?F H2^b|fbo]qӵ>Ah۬8Fnb_.n@* 뷃p]Hh lwwɈAŦ϶f#7Bk*!ф pY\- B[=#i9߭Ka;JA^ߔ'N9+D0O/WG4ɇ.U"e zBHT3>`ç7BED'E^5eEJijV_(+ ΧBLiV{}&uLrpplr;i@uO]NŨpmC+f ̚EpzhH t.VT5Uǝx#+ϒǼ  HK8$2N)i R.q;T W/r@fTfF!wsp%/!È) :O,߼U6r1+LWWbȉIsJ~EEQOUDAV^q iCսZ֯yڱc,~}I]єJƮZ;C 3P\.{/N1 !;BT蕄,HrN3TDA'(4q8,?04YQp2ʗF[2! $`>݊ua9l~zqZb?yu-T B7.dj"}e` 6r25fN8rAs |pÙl1MSVX0'B`ޣ.W}ųHwiVf %=iWM 8Vsu7.2 7qB\ ~$ 薾YWJjw^蟅[ZGzjDJ$4E:ڍ+C`F9[oΘo[yBSYٛY͘ɵ 3ZbiGvLi9ށ8+xpM34^< [4SWz+P–e6_'I1,H"a|ǓwB.]1ϙ4Ah0v ч=E!Mz6$74&ma|G@z,bia ܞ$R,=.c_rTAM?EQp6#,XzɥXwW5 x^XFhgQSk(SXu"DKEkzPjp'g#&AAIB?ҽ?L2dKE v Wδ{rnAEB:{->;z^+@{:I^B}TAowͫX;ܿ{7NRλ1ě6hWwC%uP{v7Ń J ^`їуu=1U"Asqa 5fK_w &CI!I-!o'*^<=YN(Km[0R:z= Qa1/m`B2xrfy,!a:dT`4'LWQd[˙?[!&͖gk:jO0~{삾zZFiEU% ޶/"szl]vMs) v8B#/zWGۚc7zcZ9Տ\w7B}/BBWnK0sMY䕢'蝦{N҄ [P;u\fY*JP27-^a@U>GX,SNQ ut'^y|Ma%ANha7DKq ~IIEdڅ wN&\c."&nlP1F}Ui.PDž8,<\2Fqb#Xԣ g}a(J-ڑkw `fa@t  ъ~Ι݁ޱ/Pj~[C[.k%{e4z:Xw- xϫA=9,$_PvqnAR@R+J4{0厃t]oC2v2c@YHk]S O.ʕHŊ7V{dBaZf`70;@俼:O砢ht`{&>)p@ݽӾ\Tͳ9h4)Ti/3UAoh:6kZ+Vt<65.`s :MۃټB*CDڏLJ*Vr ۴VXB<\A"N7.^Pj4za}r;nml(Tg`XkvJukw3 PlFKJOk5!Q,U9t.ݜa7m7Ώ?3HG@d#PچFS0aPг)}ɴB 2yb6L 6q(ljdQiLϱN,"ktnN|9bEk: ŁTfC4()_րp;͍{ub?~k!Xr͞뤛\`'H-˹8f8WDT#1Lm^C"DʘS.cߪݵ2 uxh"g-c>uY%}Dž!6֜-֮:S u< 1DaV㔷l =Sಕ.+x?"ŴLwm>'{Y$G!>=]LAf` `CЇs3>ՆH,21 "/Y)zp iA:})$}Hmr7Qbnl ƷEd}7> v5_5Rg̨d,) ; \zA^pUpҦk -wC" < 16VRJD*I@$|-Zi};(ZF9?;ᏤgmFz6vY;.YSeahG-?M;yS<-Τ%[ʄ18yda,N5Xx D@EθꙦim3pyp6z %NV|;POgQE.t$AT{hڗMf˭룑Űy#V:yyjN9Y'ޖv+hx!8X>[l0,Ԑ4ѝisF{ 7Tav%e]H6E"'q+9DNB9Zh\E72n@lr6 جb'J}`kО8&@uɨ<=%йXK wJjSȪ8cc;1?V^BS׿{gyiL(^nh>5;KeEp0z-qA|^muiEQ,;tN@cs&9K\ˬ8F߶fӞ|s6]"K--QB6^8`)> 'T))j#w|O=#]}@oIqWuHS #ˆY"[+r\.qEs@n}zo!>^g"&tqJ)rj)/=ޗҕyTh14ηJa/$#I]:_D\Y89IlU\V6Nv'SEC=@>heOšDm)*JXTT5@ٙc6ؐ#eZ\$VXjBoQLY4 '#NԘ'ud&Rl Ν [4=afsއB½{[?\.L nA^%Xnb }gKe[ua+o >Y3=?>1bjBHN,26jS%&X٩ 0:DžbΚ'^#^=KM\yΘw BÈl7E ɳ^p>@En;2zG*EE罬~ư{?PKC/& if2%(sKUXg],73{^N{pZ PTꆚ.4ƞ}'Ρ]$3WߴRdrFd?x2S D`yY\]Of0gл|kl=Sz);&s|aXVq"W|7¡ Q%sIm[7?uh"I-'  rLtÝ9L'$93>4B()v住If] bt#OlJ73ᄴm K^NPw~ѫM(6I.^ 5_t2ÆUpʕsqY 0UN!]t?M_6ܕ 4:2%!JjNk}KϵLV6%(`{y)$wɺT%W9ˮ;9p)~Va"D;_ Q܇X EvKS]Zu l V `7 FG:էg`Av Y SR3߱*XWZ>:P} C_﮼nK=.;4" |"4e*/7M8h0SE_* 7P{ Mc#r+im)ߔ{Ksٜ`qS/ (' wfžt圈d2j]iP2+0|cb?ft9-!HD]5pK)#o+J,c0De/r.Q`{w-׋ Fkh[ Iq$`Y$O PG=~S wC,u-bwXG?Y5qw=E^C%P:{ \?-UjD[H ~@y=Rd&rЗ cWV4>7W)F]A<Ǐ"pXY 81j9$߉aa.ARk;5cv屲̯21B+ Ts"ug=1B._oV`CInŊJ l׆>̀q3%18ŻF2-_e^|:*IE?`p kz+rk>bo~3WnS V`l_]$+$qo+u:cԜR+@if=/PȐ 5On|3d/& ׸ 8?YeM9j j4(j= 'rPZp _`D(!d]45'odjt1 # -\RJ$j^P~ ^rc-KN|&jI,)?t7M !Ck'O@}[|N3g7 'ᄯcS 4~kl@S2T#;g˹!,% 1~s ͙WdcPHa)>V+)9BK%`9I*ܫpDnxˣg Y-ﮋ]gv̌C:!_:8һ/_vhO51Dw»/\pVS@/v#fAAAi`_a n [Y#;~zbԎ?[;\:N̸xq9J}<*q.~x!3yuG.YP^.O"Me#in`J2ϊ r#$iwZP]ETa+z=[AOvu!v5͌t8Eࠠ=#L( (߉72䑄 #GfLJޛYVr:A_v1q#帳`yFh){$ph(5>S_}I h"fԍ<ӿc3s monW ɊXoUu3lreC!4K5!uZJ($c>ĕ {=Pt +oh#Fviӽws; ^srW uP{X(ڙnf&g<ϕz\Mw\qw%3x8(S(ϊ:)| 8:ݥb fl+ ıleK*'H_:۔aůei=,ˇoq-];O*yksp& oM>F*k8ō=+RۆEQQ$wBEkǜWrS%DX7T)"(qJ纷ǾIw[:bXzlE 6=-V9" hjӺ[٬6ZWf|)b;W?JL-ho3h|NOW< P)] h " Of 7U'v~* R[rut*y+؀#ڠ)apDqjQ|IojyK|Ј>gIU?bmraw_!7"& EEx2\w4):f"u-wLl.Iy(>>DQ,v )621z\GnE;I|vu&' J`Gii|F#ܕXE<0ґ@X`{{8-Z8ZBǽRg]`hϑiJ*&"XMC΃!Z2.VeD~h]PHMoRWhu*iRœM>ɛ^nu9ׯZ_Ya*9Iwܪ&q`r|Z?~u1œ$3kC; Dg1y+38y82f25((i>dzc^\I'jVg1!uгxN87wT+%7K*[h3: p8 b$I81u;r 9l)Kć̾Y\ȿRKX-dmvǥ@Q7-UI6c2Ө^uNun>ȃiKxvw[Y2bw2rs}%{Q6ޟj=|,i3SYmT'@LGEM7`7v.Ohj}c3?кE ƹ -eNddprAe0Uչ5YCfC"]ƾIe2Y ; _i_5@F 1CE?;%LX*)'?,i㍝x4܊67U-嬱F'yǻU .īo9S6xJs?*Acn\#AdCFJJK?\l3׋@s q@JGL}=z D_\mޮ rV`X20n4f nTjPlEF wojIfyFWCeIIoˌeSu /KCl}~h/F0f ?_a 4q j S-XC4f8;>|􍲘W2T.5?HmkJkP6ywܛH;Y@)z($+s3U=.>Iؓ$kc8VQetTʑv9㩥)sW$P<πL~cKM2&,sOR7t &K"F>>e(}5"#j{*Uص*PIUd4]' Qs?|$ Mo1ko_=E®jZDAZGi'EIƂ#3g?#V"PʅFdP>csC4A&Y!;.8 ȥIOM]ň=kנ3:?xNYh3]0Vmj'V㱙IB{٫$+L?5gKH]PO*F,KѣR|nDsVλ><wVrB03Ut$S6l)SzMeq1h%/|Qr7Fd(荣[L!&V|3Igx=/V`:b./ M7uh;"c8^OBLl(P+F>qtsjOȇ~?}+1Z/rhӁ|v%FEe1C lێM_șݟHc[gӮhWF*:.onZGCDB2 Bu .!=^%FbKsZLI2GIl$}8 ?e)R 7Lp˪T-4Z l7\R;CAY.M`aK0 壭_.V;y"|FZiU N˵]]?-c tv>S |&CYPˋacGcLYz+' 3Vuv_i#m1\wH$9fO6@/Y-| P8N(Mhv %+ /nqLo* `29&`)'{e܈v~ثw,qJ~aY'z<ܱM[[WK6` V&1y`vay @pLˊ#VYaЦV8tGj]Y~'"y+f;_qvz9Şۓ.yv| O+wj]*d?N/Sxf[qoD<;(R{t>:$lҲ)wABǪ徦7=N)R稑\A־se¥G[7A!5Z@P\j%9(-tүXDXZȲH*qxwqhk%E)vzޮ51t ǹ`/tN$ec/M;z:k3W9'NUe1aIuBF}yM%{:tmýt ֣SbRtX@č! GO!u~R_&8K @tI+^QPhR >(Eӳ&JhzFL%r\< (یo8 -^?Gr5+npc˃> ?׼dcGPdyu<А:CjI(!ըiWZKfoY7}~Nf#+ſ0Y$MMI-U24y6*R<%hFsX$J%';vPnW[ YzI/h}%."LAq>xdw\ =:6xS[/L6|HXo{S } H}7>$533x{E|#G5ʏ-8Φ$jh=$P+#BJpRS*+gGuk.q@dF@\HlMX\22zcv +&;C =cqOn^ۆ5b"t؁7!{݀ 70 WF]$Zq^qegckǚrfcR8K*3%|G{̚Wǝ+>>BǦ5)D8 >./IBL!|5" W5YK;}#TM!=12VaVWysr*gLmdzs~ uQnqW.>!(g4E[kbbJsNti.fcݜ:NXvmiuWBa\rE "!lҌ*'?NK@1&V}͈X򻇳f8KcG_[.\<ȝRY 'J Q!{n7,j U=p 5 ]P냊3H_"xJP=lw/L.}_1WBxrO61 0 Wޤ^ G:BjJbu!gؠ^YD`Q8Y‚u#l@ ExjMNN1,?U$Z85^Qk5i<@5|.?"WZZ<1T03LY!"* BE,NmNV(')%Oyg|3F-K@&C/Aqur@P?e /u^tuN[B ګgVՏzܲ$}v?ؤiqsBE\[XG(f^_b;I\,hhqyRA+:7o@_E**eBl(s iꟍTC>Е5W Fܥ̼@ qҍH`QlB`80C]k$I#yeWc/fAwDwT*y^f"BaE>Q<|38C S Z=O~ 2O&0(`|?dIƳ}T.FmC@s:KmnQZ_K+0>0|`r廆~6 i nՃ(` +FzPy1B3NP~I<ԦK3B"յd[>d@H;Q<u+\all [r>TM ϩl(ܖʺr7nhf{j:?:rZ(.>۴= 9Xٜu]z e:,`T-Evgaqi8 ")T@H2B\`Bj/h^c逻\ML~cKEU$V'e-v}Y^O >)^,B&8sFOL>Yc qMgDWsg3cpmL:\cf.asԆ1e0k> %뜒QnUKhvIyF>y;͐ >Ɋ)A^E~=&R;Ei B gM^T3K)WW:8᳢"+7F}UV k"k  D[k,YSrW7-D͝ 5yK(t[2ˆɗ֟ԟ~3(OfX6s2IvF,+(zc7V{)h`Ghׁ{rG}(=yp{>c' qeSd^uK'u{U͆6>=G(BX}Dgs>bcg^e"0*TJXqɷ]`8'zQ,J`MZCz!*yEGB5eO>:]wd]贚Kn\X?C9W,T_$ݍBQ>+5)nqݓ\RdV88\ݽkL'hNFT\S:J␱il΋DPl〙qPp+pm!+]3J0۵iesIyoyW$Ʋ}x9TEӺB?QBN%qm㢎n(OOחw)ld@'>@KceDgkH K.F^m 3f3R~c+v_E&dȲNM 9ĿfFN0ͱ:,\TI g`]t<%x;z)Lx75\&SaYiy.pr|kx6cҟ6w0Nكщ(iE5/b*"Kp;> /24ϛ #Jyz}kvpb &ͨ\T  *j.phy; ,&gŪaiuѕ/!pۘ@y{~S -y>CЂ6eBL~ /[I>Ŗ7SJo.39¬S̹b'ӫ> lҕG5+HtVr;Wr%^W×X1E3S2J ߵ~/E#EҶ+.[2vXIރ\mE"`0/۝jk9P ċ̷E&Cؘ54 l]uNm,qsd3D97uWZLiN3RAAоlt;ڿVS%oZE||gКк4CY2+&MO$4:;ܺQwD(@|:ptRXl/D8[|mʉnR!IíW'&;C^tٙOa#d U \l  fs#\M)d3$&oG#뙈5Wr|h?3L<]p<-F_o5B5 g˾QAHJ8#'kA0uu2̔a__+,K :eCX3V>& f'CmlOb=XWy>|},ư؝vx0#Veb+Q!dɝy5 *+w]qd2~C'bbyPmԧ1$;"8 {F/ .+x y~ CxRnL tGY&W(˼c84y!"aTf@:_@>8򛕳|(Z{$d&)YX#]] $D㉁0'yۯ-=4h^Dq޳/zvTCV* Ⱥw TJv޿:Z.Wcc>U; (fe~w4RmN}mziiABG϶YRAAv;*RǑ |k?ƬTw?1瘖0zk|Ucd@>VSHNn`1r\HAtUi2MQa1a[O!5<8&'ɽXnX0ZebJB45zQþ<}?{uɲѴ! 8*aNKWɺx>d=(<{%mXNS7qj{t )N1 CnKWw<:|1YqO X!/XGf\Y{x1n^EƉ[q#MYk5 Ճ?}?iu(3jnOf-b}tDESx8D|xok$?nn͎!3oƛ@l!n]vc58opsݩHW($0}vuve\ǬX=CiQ0ݚPE0۬*EffW gI–D?A|OYD43ԍ{.%QT#]BX=$ [oP}scKX}rj'Eak#v;u2-ty*nf#kNq7z3D9"aG-wٟ 41R6~aX|`?=2Y#57 3͗Z>F,>(<|GM)m*D+X[jo*d62/>=-vD E+6cK)Ŗ\)yhUi M.iW3egj+,>Q!x:|?kF\ʠ&~n Έ6A=Ap3C : (ǃ*Mq*@* m7YMa(I&Ւ洸l$dgB0Ӗ/Eԗ1aF o AH( Eil;P 7DC P$Hn 霘 ?RtpZQIo$%x[JCǢ3tGyƖ}p5jOIe/6'6pzM4ҏuR)3B0/<@ c\dn7jNmrKpr |\:\-`iEz[D3 V }ɲBHY _=ÜJ5F_d<uBd515 ?QKczn$"v-@%2|%m;a:Nȭ2X`9.F{00.o/rVOx; lw^.U/Jk6B:X|~yp s%@jG6a8 [ED14Ǹғw*ngF7E& n fLz=y8sg*!I5f#fg(9U~u"O_zoS HreYϚȅXpK gxSB _"s=ԧ׊q*k7IMՎ'儘dt>=As;EH=% Enwm 5 h\O.t #|JItgꍍ##m9WO٥- !#]+X~?@\|g qtS2f,M[6W Ldyj樂MnO4 yVWD@27Z J+Sm†!e7Qq^!&pWGkۃtN'=/θsmT&vɯ7/\S"nNuV^yնyV!rNC{ۨ tdAjJ>֟[6$_/ROvSg͍uȑOڽ$;rwoEVࡀPyX2i <4<|plb>Hz0W9R& :e(&CLi4uK]A%l+ ʼkIA'PS'zN]?/1%b]%G2NN% Cg7#"&jT$hJ &n"(V5ssfA| M`o1 U+_x՟ A.i :e u }YCxveLP.רZ CmԲL旧{7ʹd둁=E8>؊xO_ -K jxayΡE"S},KH>]xMYt쀁%jϗyruk=0uAxqK^teWGsi|Xdo :=HxQGl,v7fm#7y-CWRw8-{$JUz'~0֖5 D0qcŌaEŤ4x~_]b(axf<1(/ 4~J2\9'1=\նsIL >P!uȦdF44@pxQ+si_.uULpDn 2Gxo kD @r@/4i]7f7vnATZ_h\uqZ͑wsl \\ id*]}f>76# H 7R|^\"%ILDLw d]bӈVw8_w/u `Րb/Ek٭fqkZ^q얻4g8_K=ƍ wfC1{ ̙VxW$4v͸ 9@cn)+%)7؀yyQ>9[ dﺐ>O\0ڛG5bĶM. Go q#v3f*5Oс/aƊdG52&B O|A/wAY +&~9dQ F3< 9abNɕ)zЍBJ9"Gn580a֓&x~_tѪ0SVx֣&f:7 _D[)* GwRTمԙ/3NJD;fGu=PC0[Y[ fIl'*!]ۼu]|1՗%:SctsHPȁ6n쀺y2i]^sB)6@VJZiY-E6䨷JQ6z.Vթ抳3SaԜz󨰧?T=vR134BӉPnxJQi]'B.{ڼP>h [krŮ{+7X w,U> íz;ƒL С|ϰrtۗu %0|Vpb$f˔ >Y.m+syzqiA݊rs ǠbIxd9 ȇ(N#FH> Zw6/M +v 5eyB?3MrUՊc3l(Xf;Lc$Iп0+B%Bmeܔ1#N#R#ݺKI{,)WU;*9_1J}{y#kiT oLp8H jшtZW H 10y۔mfeH'29l##3Rj:_}'Tpdqe7@Ep{~ƆR/IV\j;||k̴Ui!Bm+bVÛ /mI<5XŐ, Cw|r 9LcDXƠJ#rOF^ ł),Jq?ʛ(Ea?K5ouqmVTpដ/_#|m׏XNFfn"ԾUk#qhɰL5k. 2i%)W<2h߰6v غk{bҀNؓ&)ЭRO'$)X}q_d~Rh-oh;3zw/'1btt8b-է&u(f+ݫ&^w׮m;YGM(^go;Jh4l|r>5wehc'Hl lE1!Z`̱ꓓԘ)Q$ u@ܥ<0qRp*mu_QAg88DvV!(u;yz%?g:|E( eH+ d}|Սp|qPB2[~}ջHhkj1W{I~#(ye(҆hlAU'A(qSaY iļ콂H`l/k1ap+$OӰ뚊W0v7 ^M$ Bvk- Ke_B}h2ASp8^dD :}S58I;89k8.0sղ+~Pq4i8J%[=WeESuSU<юa-isAEyhCcȒ;mtT.F2/a>%9ͻ%uvjcJnQ$3Nu.) .x o#TJu d U'`*W4ō?>"iT=^{yĂ?4V*~yP2`=Ŝ~b=Ѹb6g[jYxf6Bz7#,ZiEʢ;F$*[W|ߧDHF6= a;]=#cKN*IgFмl=PnD܊HRx? lϔ:!ԍ:H@uJy|H> 6tq~A&Y*IR5mX}椙M3;) cvX,e:CEaS9G80SƎ"'necf_~ obEw8~NWȣjol) tk3s.yTXR<F%n +V(6zjն)QLShrrdž-g1kȝtcR!Br~9x2xC =19"2~,VZ*oTuWܵhP}@NӨ1c4ixX׸CPڱavQd=Z6FX,ͳ׼qGEڳZYN%=LL$}FPa;e l2][ %kяkrq{?(NJ3nLo.k8]huA8og*涥p҈-0y0k > >CL&%8ƻ3l( 9?xo/ >hf󧡉h#p bZȦ=wTe>hO~\خ̏e/[-k\h*GȜb$S)B@^or'J]G3ӨH'sIڎ_y_^INʸ][ȕfy[W LZǧ?N*G@'t5݂^@Y6Y IY(o9Hzc9_Wsգ:.P $*ӧ8;|2T Ki7iIsJ>϶ ZESy4L[nH*)  yJϲd9PtےIukW (w+ 獻SqƔJm tt[et2sO6O;P !bTr9ks9MB+DYidx{y _ښNm"cE-(n}ݠ1)J [-n/#.S){ȩQv#i_jT4r4p/}c*0 fiX۩?;iQP6Y7c\xl'T/:H &@O{%81>aod4Zl?L6dVoմĔz%?o4۷MiJY-ȧ`4k҈I+ @l2Arxyx辴||MY(  $ ٓ,6P/8oը`iv ˬ# zV&/-JIqpؔ TQ- fwQiںahߎ=Emvnh jz,صQq&.Ǣw6> [Iy%eTn:1ݚ/yQ0zwX:S&tRvA\ȿ3e|ukPGi$N#,!D1+<M*W:R$}|])OIq BwM|4xI} z,3{ 䉩-JmIBb-M]ǞjF9sK Ǭ-<ę"]`Dd =J2eJVcMǖo X$cwzd2PYxp  E*YC?8x*5L( JUq+{Ad8xIX6!Zux4]c"Uh<5zP v rZ*p09 Ds{$ .|oǙyD9>>Q}bWVq/*:͊a 8 }x 7kwXXǰڬ;=s^BI04}Q®H^u c5Z^Ҡ3(6\$\:K-cuFܳ3=(X~vMT)u\n%^J: a+M0>*ORoN0]NoJb-uW:@4|'ֿ@}1𱎍45/GVE$Sye"OC ۋ SHc]ؽl!a LCmR@_ncAQItbY3$Qb=H5SE wqӃE\v5P/ǖW#~?-[,|.;jlI<ĭHw2^t"K/14(H nw.Ҟ LxIK3`*] `j_EWToK}R ěw^HI93:8,[0 zoC짻M bzQ# >JV'+x2rqa1%@[Hn}O(Ӝ㹉S 4Cv ey㞙k l)qW1hx+0 j@\?]|A&zţ!N=ye.=nY-D6,>3~1i_Ob*_Ѓkq$!֑?%3LE /Y< @[tA1n73IAeYg Nkjfa~6 5f/BmF2MsqHfB{Ã}%#ZkmNjfqB6wGС'\Кl.%|# #ͩ#+dq5^`?ՀdB-%![d jWs8y5չmΆ>~L Q5FH9kuv]K%:gurͮCHJ((d^o *OBqA V>N&DRsbbm± 2ud_P+7w-Ob%\ϑ\Z4AmۨNIe^W%5,NT2x@ăC d*vT1iW9 ʴ5iqQK1jƿ&-2kx OpS~7Z1؄|Fø #Y.Y8FģBBXvya"j:uྵƚ"ztJ&٫g](ǻNI,R@V7V.҉A^/ g ]S͔ї#0迃zt%|FWNyT1;wWp GV3_']|dc;6C2+&?vh.XPƲ?Mܦm.Gl)9[Ra2MLu7_R ,=C&X~97?c_\'{@fi[3HG|Dk 3#vDohZH yqcv7uE5}Ƴ^X'V%c_%\7WANEFå\dGnn _Fi}yH#m"IDs)eKiVGnH1.N@iGhͶbդ@MuGGIb2p<s vuή~E,#Þ8K~{˵ bQ\W,C<!7՚d{`' >>S OAE_;7u|Pm&R/ z)RyC@"gWK nRp- "!z&LtLTFI2*mak$?õh<: `="hJ$]M6[IWJC K`ZD9w惾HHJXT'~4And fg7<9MT+]_mUpGUiݪ=@' SV-֖7 z܍x$ ,Í]ۢgP˽inWKhh1T_A{ 9l@F1 noHv3X7]$ds B\:yh] 嫄> P ݱ|M|*?޿r1RӀpsB;B9X33diM u_<XQ`"|y]RnM\{}Hi34<"z_6=r6ӾM K4k~yqh]8,s}"qi!@1 &aepZѳJES9q͜MaM҅̈́lD*^1kܬiqN)pj[T+w>:$#ZZb)AwJtq${3A'"nUx+.NkU층MM$XX."\4Ϳ6*|YqNQke6f/!S|aa2&v8 j,D!xMpHlI81w>=ﲨȒ wLl~ jtlgDKd2PqHܔ)8b|xثf'+n)(֝hs;95SכnԻY6}'tt=/`WqQ74#ZOfK+< l4P]a`w۠.Ԏwxn؁#|"hg77wUc)-<oS]% &)x(D,%9z4~ZJOM R?1WUF5e^iq-+K )38-LN /{N!l] O!=sx@ˡ߇=to(T0G:jEet3C"G͍s*, y+Kس,db oAvؕΉF~+ݹXu-UNy`Xbc|Y)Jlw-FLMB2YMLZ7kjéά IEeJsN,$v\ibvق]΢'sZ'.U)`I3leM|__XthQ4'W\Zi)HroU 0!9GECkRdIPf!h~5wOӪKK)j+#Gƻ3 8atBumv|-! p bF &خw62p\栊1!b?LJ^]HS-MjY-:S䅺׆{o|MG9z@3BzGt^9T.Z8x(s.QITZOZoX-߿)SXP`f{\ݸձ!q6#œJQAw\mŁ:=C~]jh^bɶ gAҸl+Q'N/krJ~N`@TzQ騂\xL}FhOfo:oGO!ECRU#<>.8TАI+5B2'x %n͊TAot^@e\2%S̄J 䛉zdQߤYʅ'd>5'`4I}#ZBbݢL+L?=`%7ecK!ʼ'VÒzNtK__RY@gq?Q{'4ldc{ZPW-#mjr>E2k}܏w[a{guF7a&UQ7'K/ 7ԜY7_oɌڧ횬-K[uvk]\/"&mJ&H[1 ok߰sz &: fW@CVZg*?mVGCos m tj Q1#^TLZk(ccX=OS]{;!z#4i,Tiko}n. GW3 iNGa,}]-S!Hį;WBَpj= ͚Eŷyy|tO;uSn搃gszDgPx oXԗ9$Q!T֓;+[qx,,Jϱ,ht 237?YRFA*QKtMssW؏ncxv'^CX͜{) X= hByzVHPM手BZx!]&I7hG|lekme: MqD{BqCۿ2iul9|fu3RA~"lT|7l>dӂ[\HLRi~Y(tH^%7w1Z Ahqw#TB P\&R!墚N*NFr?.**/W.78=+oW8*bTңz{vh`v.~"}ۍQ28%P](Aф.9ڄT]L1hvl.Ps<ߡqd؞[M泌}bb UiB:id͌JK+uT&r'@ uSQ 7n!JggC)w8!9 ǹ (]iݬ^t='qPk :4Z eR}j/+.7 (D,oaWzXd,B{C;)3-560#;~p7z8@,AT2OӕVj)6 mGy=S,yMG03i!+ u ݚg^ aocDWgHh΃^0쯥GlK?Ҍ!Lm~x#H""gqpL( _Rm7Ojl>OIX, # S>(+|$j%lڲ԰xlI䎹*dl48 } -zΘtpa߰ڢFq1 hpar#g4 9+ӌ]OEmNF 4kr"0qjm\xATb*``dzEn.dsp EM 8 '5Ƈ%| JEOk ^aݎ}a.LAbX܈) $׈jرsmÿ6vlK Յt`rd+GY~^M{s{O{Ji+>-n# {HuȡH?Nno d+  ƀKrM> =kat+]}s_k&2?82^W)H)\PP@!N'R^"A6J7loؗ|%yigFJd5JKrr8)$lB^Xk5V(_iG^&Sڲ S:oHH$e!HtRfW1T[՟+˺O,Aخ忋g~l:A`#@j2`R<~:Hk«Nx!&>/$B)Kd ETYLTfN UyhwOS'2Ƃ73#q^E^= @Y/1OA6#j*3N$hiׄ8-1ҩ a"%SЩaCҹt5g׍/n 99N~0q&#ijRVlm^A<._JlTYvR\%nW=%<[0կ1] Wv$35^Ϭ7ҧ=[7QP - CR+@ `*)Z/yLQīr2PclJNE{],pxFQ6unVbV7ImEQTUEEofy`+%~\6jIf8"&^T):0SV,z L  zՆʬjbj.NѼeI 1N)5MH>: BꁲNo]ZA\3 JH8/b*U!VTو*e4Oe<9Ɏ~H.[ qHASC/-Nڃo`s;H8vѽ YZ(EK,Z g!\l׫4 Z*//[S9yqE2 8s-^6`le\U=s)];99 B$u'nLxrpEH+2o~=?@)f]VXt2d)7 ]ъqdPL#A_ߋhHfB]:V,z;9Y,L+VQTz[MFCt} hBu-foB2ȔR"JHW 1& ~[:6W@?$_s+[/p`I н@jsU>j%QEn)<7F@[ʁTܘZ c_{sdV^tx9H3@ BG3Q޴^Wr,қ3H_[sH>|A6_%:-d>؜8n,/"ݓT\b=09F5 V׳];[+W޽dS %$4O5?.n݇Ij>)ηbQ3vOjEyGKAA źX$baU*t F +RY!ZGKuAGnj44tނ^~-GrXtAN¢x7"YS*[4GɥМ}X6 Ϡ1 Dv=(؉MhB%چ>_|To-i̬Jl^bjqSʕOlU ܦn{+/*u)sdVWmAkD Ѱގ.I?PuAcq62"=My2oN-h[{FYSJZ(45>͡e2_iYNAވ̽6n$.,E׹Ԧ>m?kXzM3c&ÞBF 6fuצ ?.]3^V w\pؽNosE8xaS›wYߙb[V|NsL,ᆜ(Vy= ڍ!46&L+ՠ<' mi:Mz^Avz-xkc6l[=2]j {Jm rPI bUGŘC瓈UOð޵h !BԀ ǟeNaF~vj:j=Пl ^9z[ut -MD&>Ge0Ӥئ6cDOD\aa6$b\x}LNAYK^QIλ[z ͉a>u򋺫~X{\h#RA;npQ,ՄT ǥ\W`2l$qgg;Qs ɋ`*fDc뒍9;<k,_vbɲ㣿YĂZN!9ǪߣC+r5" `ƒ]f"i2`>dJZ%HO/(>te"ȫpG,? A]Q$aXV.<,ķP`iơTftf+v(?StQg>0]άɱ Ҝ t3ݕGIvh:Q'VNoE)N2zknȞY%J#- R~@XĤX'u}jc ZՏk?bcNj>ۉKC&Coql@%7Vk f:Dj*7,S.ʃpԤupWe7 E3w橙ҮQ`kBE^R=_? ;뼱{͐ {I5QP hyM~cv)WϪSq<*qVlw)_qP'xVb!gaZ,lvۖ\z%u*|ϴD]$ql@7m] *K$Tޚu|Ԑό֪ /3PӯVa> S3:LJHK4`{ȟLX=GxɒkRO*-E#:`FO8` $òv8_Ө5hQ!xfrm 8,!~iS(tC T fF$0}kK/KW~Su^*FHɊ@g\iִEǰ@2Q؇I$5rmNS2o}6䂗L2f2)MpX߰Ѡ:U \ hܝ5:*Jgɽճf 5\P,$j\Qz3Ufq:ݏ3gNG*@%17zE~L/KR+bNP܈vT\XQ|Ld#Z_Yx Y_^|^=+Hh\@zϺC  cO:1+e %dveѸ:?k a;^ <3+~pɑ90A P.K#Qq45 ;Ҽ+n8ݲnZ7Y~&6υޜb˟ Cjf|?i.0\+1] ,n\4ʅlZCvp7YTM hvql%aIK+qU.dnr~B 4.qDZ&j{%$$[濦^U7z^U?TOA=dO).Gہ$|.?L@u M`lբ tL*_4Zot{i_}` ͣFl%5HW9s="-I 7d3ϵIĨ *'ʝUsGcva<:;X )睘/;,8z}{3l݉CdTㆫ9s,l gjL.]3-P4ӜXx jb+L(OTn0hQa'Uh:c3rÓ>vRflW j`;dX6_$`dR01'']lW]tz'[^ MS5߃l`Wr2(o%eax^0[KV۷c2'Be(yT pUkPjTOI|JTp9wpd߶9PkFܪvseϲ"YcQ ?Z_@ o|v3H95 4)P@*M*@S}>|>F IߣNԚk|ѵ_9t'%SD!q={V_rШLw& A$Pq.WP 覕ddX t<)t=~Vn) 5)lArB\ü!2Hn_Y`xNýK,0$P;]FilpzAXK,.ʺv/PqwJ .W 0alĸiU0XQU9~*=kdյm f:2 |jwf_ƌ& j՞ehMվ&*|ñE{b2̉|z[h+\Z?; aN~QN wpFt;A>*} ֯zuIc3c`"+^td(e O:hQP$# O%Cl@nlb7kYRWOvgGSjWdcz[FzQ!65bgƚɉQw~ǹ&|'֊ez41|wj'zት)|c锃)a%ruÂ䛗#a5Ap4B+1$鏻'G%Nx CsJʤ[#r00~l8 4s9<las)$! QeNp6No4I^H݇"w4 pݠW3E_~68'֓PS7`@NVei2;Ț++RsXf_zO+i&T7ݡ›WG-ÄGI喇W%Ic(AԙCuib_5D4u*K&k1JVAQeK)$KgQlZCB]ˡg7pG { {dLK]Ȅ##Nsm r,LOr8hb#njG ZF R?|Sh@{gMZZv‹<5-QL<;0f,ot cE^aUN(rF4}>|gNb3ҧz)Wc:&. f0#N$" Q\zu,R~#S;t]lLp*v(ImXN-@, >5f1`C۝:wdV`'vfNZwApx Byj{>պ,7'Ly C&MS){ _5$]9שH'Lv:A8d<*²e&@ۆh춭 P&ø, IYoeTR64u\MD* `!)aMȈ)d6hez2d;B$0u<~dG!waGۚ1ޚghեABotu'M󁷥NJ7uALKS6"4^.{ 2%Vnp guSH~"G([(JڏElRδĪΟLFZB`.< <BF[/gȔT-9&\Y^Ij W75}]dwΤ&e&i&#Ǡt*S rಹW\  [WubbIU |b(:<Ј9x][B=s{ JyΤoFBE9>O_ x' x-G\Y[8&TJlm0#U9E\JpHӒbYTT`z@x80B.9Wǘ֤|-urh{wׄ~ 6{>+ӡ8PA?q邏x|@؜]ë:>P$wn _+#q \, "R47{qH2z`>+7mÞ۶!ضk Ārd^eY<"oFJv 9pc􌖾q`PӉfdT칡x+[P<=l8!̹ި&hF-edw!o:@b`mf@~6r0d}/ B'V˺H#ZuX-K RDu^-^)+F"A#:IWNr+a҅=6d$i}Rc}𕻍dtoiҝo>䇇>H$]cr}N4]CMxVFd,1@[ ~2(׳vΗĚVmi?x;r]vDTXņh&ȏxxݩ9R σ ENC/x2W4`'$:JP;3Ba.&U3Q =FlSY3$AnzD$We@p1m{'d5rreGəS %n=)h DEZE~ )tuf=V̊LA{cAn5E 4?P5ַr`qDiw8(u%&q Ɗ?mY]ͪr?6[LB,3&rxVc͋# 90}(+Ɋ邤mX+\bŽxTُoPY䧊Y|N&⟻$=XᅊN&Zd1c= O3R~U+MJ2Y͌=H(. LWJh{{?AEr!}nr}[v\ M>73Z/s|M5Y~$8A hٚJq)?62NOY5߼ aNHjHĥ`2йC^=(W$NH}?M;'z- ֢tYΖR]Rk /QaU~<ӞB10.u`Vxv3c.%-xOۖi;{Q۫i pA=N쉡ۜ+U ᡤ;66fNSܴ=&  UZv 9odju Yb# U+ܼگ"Hpp%1J'Iyv^KG+` JQ_ n MˣUͻKٝvB֛F#~=;$mDgB\W'/ɛR4gMIbHE -xyyTƺ~ cGxJ@<]xA2q/$E\W-2"r?3G5,3 Yc>ScB"z_:(s$Sb, rP .LJAOn aeEh1 ײzf?7V#_ړ~iӘ_G31F-~1;2) [ٹȓ&u qJ,jZDb{^iޓu Y'@zf.]CW˾ ^.:~,q=6HD^tɒ?SґJ/zD  *>qO 1ݺ؟(yZ>Z4w j+t{mߩa씍>1S ni/dB! ,)ֆB!SYtK}m.6` 3 ִ-TjƢw5=>7F: n?Dv$3}D b~ -C`}ݨdEs'BVuYs=f,,2kOGkluiX/Q>{|@jetf1y5XlJ- o‰FWD1n8Iֱ$N7mJ<(x1 k@b3f{[Ef\"ߘ t{f@?3Ŕs2@.X|(Pg_F Nid#-'He9WlbChqZĜ~tu^ ny9q /f k.*M)d*9_c4y!~UDj4Ns@ҚPG.L[7,b=5vH1%Sʗ*x֙_{gd46oO:*X=)w$g؊r%8LU6o%-L31 }-"$iQ]lA:;$$a}O0 N#O9ug;ȩπ퀿zs:V`<MMdtլUvSTCVc6aHH: f.J@k x NV6$Oad4(M3"ɋb8_ W[2Hdo!f6l`lXTb'̠a tQL"0`ou<)_(gOcO-cx:ؒ %m"; )|9.n-Pw+a1Nb''ң4I 'ppAJc޾ɸ쎠'} q!b֢`WEYHMfQy!hn~O)fsߤ\&eZ ɪVټ(,no5Rj@LX7m&th`5xc.~'uXE0";7I:#N6c!Q<6/?<:Mpb ~IcS9bD򂴼Gbl!PLg}IyXaɏhK/8ݽB x-\PC0Yu\wPɓq;Rɼ4< !G37b̂vphHW?R7A ƽ| /3]Q'!65d8"M^?lu,&(h`cߪI^6zP$Ԅ>}%8$}HwV#󤺎^<&$ ,(DQ$qDŽGr_U1X$Q6E<[0cWhj)i*T.=LJ{E_ 1.C_gwXi膭Y#q_ iU٦n'0b&{zw_3'M7I,bE#dsV< PVbp\zAf ںmGMޔ'.P` <6dN24)F {H;%cD OiPb}c*AW4}gi &ݝ !_+ֵ)1"@s}}V׷-:n[9{lQb-AY 6s' 9A ^Z:wͧ&Ѻ42UڏO_ɄX"F-_@"L뼮.dJSyvx/{o"Ų-mH0/褒{@:ͽs{8HY-E}4(X cSR] XF;l>ҭd:9U}Ej+`sTᣚBӵ? d!dR<?xeBTպ1dt ]F+(ImC;ҩfQ]r@0uDE ddMmg)5e|>[jZh\RSi)UwR|Q "8)3\6zDuKKС{}%&+F?~MenKBh >-FetGQCN.Of"#czm1 &\L7l?"04\#/hnj0U>þDL6Ln,cAvSDnwLA,,},/KlM$92+g3ӵUvV3ny0;/{Ph魤$=+Oj"v"L&F`D Ԭ1[(Vζ7pH 1'u5}*P8T(D\b?UhmΠy k`4O˄D A?+zt?<f#ILpH\%>{XRpِS[>N?j<@oCVܽPt7/~l%+yE+EKiϟZ3vpTtXb/xaX ,|g l"X+2!uVTy1n‘׷(Ҹ{L^C΂-ͨ?ΟWOdԗ /kj‡\qgod~p2_}h3%X7 w-8>Sd X-1ct *?`k Z5dוahRˀBq Ʊ90Y6數T'G;H UO"TַzEj'+_0nV|JK?`7퓃Hh{NdS{5nez[h4EbR*\ywuid ꀖ^<7Yjutw%-' -bFVa,s)?z|:V㬓 Vhl'؏ZBƻ4(\D`< +oob ;_d˚3CYG7 IPhtل_|9a~Xybd|Gҝ.I#eԺq{"11ɪn,pzJwj_"A`[{dpk#HsDS\j?D %Q!;FXZqSGpו K YWI쎩&4繡zKe{Jϐw˱Ǧht*Gu/A<`^U1f;E= .{7,?.9-?":: "w<u$U{s`b f)ƙ1#R*^qKnFpGnA"㪺wB,OkLW&j*ScC󗬰mG9Ȅ-<;=WrdL (ɫ\t}o9eP˝;Amd>a RBr>vKZ\&pztл.ZzI.sO38DT {K1[w aDw;8H`BieTņ, b]RB.1wnB ^ThVl "UsC++#hƬUr,yݹd.ߨpy>k0ص:䍵2T u8àĐ״wo I)A0OK!Got(CpC sD]yɨ2jwK td #5)VjHS6?E|*Xl6(wr1D9^!iHː]\ vv+-ȗL[jF^% Eeb`΂-ƣ51xO-ƅ̕ar(.4B ;{WC` p7Xg214^M˙I<+_KxO(_Jo1t ~cE-#D&Q Pƥ|˜^ Aq(j#V Vfd!&P[k p1 z$x%\/ڊD>r_TeO|Êc'Mga_$#r:i/bqLzVjlBvYan:!0I! u\ZAۏ;d($j^ T*ض"NK= qh|pJ"׸S-7X56RD"$^JR5EZv)>DȣYMZ&M[i]@[,݈`o2ђ^lV ьSnbՖ{y~GQ,_͍Z1L<{wJ2'z5SN>%?q3Yok1(B51qT%A{\4N=CL:FWtrA/q (CfO۪m[&ׂGg''_D8LʩwIHޟ̖}4G{XcF59%?~j\꧟m. {ayb 'ZF!9[}JØ8=CGĝ4d =\2.Q#QX?I6fsuJdd!\V%}F+:ߝc+HVۼU:$#]P1?V8k1V$RҚ ĄL6ֳ[mѾɚjK5mT ZWqJH x{hva˂2S|8+4%-^BgqDʏ.cܽFzaPhVF02)ِZ^D_HlJ~툟h1[ ؖޟ@Cf~uH,f>K+l'Tqwk¤)[d9ctUo@($ "gy u15E ~Y^Z3vhtTdցڨ%~)idƆTF$ AΈȈ̗6h 9 | HE}jY.K1ҽ+Sp6Gj41.nEw(eFk:57˞ K_TP6M!GT- 4"TW[hD&!}W<%"7fYSR (.d'*ڷ tkFqh.+UJWr;eNX%yP/8 չ& ;{K=$9dyS9"e=kmr25qvOK5hhYF}t&cO'A'ZE Kk;]wa:﯁0Qt"RLNw}?YE2JN#,.ۏ }PD(;\0Y y *j~VNGԨX@n>(0ף٣#kT9{$l^"%Kh,|5RY`(6U|-6S*-j%1s~=oJ^_ ߷CLceõǶ ~]=1ͯ1HS+a _nA0N8ŝhDZSò\DI[sPIR72u)9XֱE`xݕ@y\LҤ{ ˒\J9b";8#%} KV`+`_o{zn_gaQЛynUm%Mw#PT壕IE^a<Ko?:?6wΟ/sn;[0(pc!-2^`@ۂEXwɣK2$wwV:é geei٭V(IΑ_0Ǻ>z"bbkh<j^cc%vd /$ /{XKHSyh{̘_Ri[a7UML|T:2ZkLqK 5t%:VI.͓&?{l+1XcQFLӭiKnf]e D;DXu"廴7;"iN! mYҨ<`%ߪ B}rOXZ~15e_GSjcER XӽzЧ[q!ζd5q3+q9 _5">À]2["rWe;w׎H`" y8͑"U $Yz-g vzN(/>uE?ktS?f%-(cڅ.@ <ǝ@#3z@/ OuN3w*FәzM}oJ`C0SY9OW sٲF ӲD_^T,J-_(kÑz^G9ڐp%-,αB1Bu`< .1u.ܶIfM1Bђi WC][F[j?u뇐Vqg-T+UTEd2KMʒ6B ˴ f_<x$K(ьPU}bC6SW:Lc"Uʄ:N&+'9jŌ۬gOj{rwԣa 7Wߜ/ aTqQSNEM)@}y#=*a\Q1?L)Y{9ptWfY)m7Gi伆'8wZk%uU +y;X+_Lp!V|9tn8׈K#/uyp۸;uA6z r ,)'?Štc8rux'D  ?6?"1nTk$]goL9/.rY#=Ӧ iVnj? LbT5ϗG#x-2br3 h[J `(y0|XYPᲊ SSiRurG=-3w# qĒEI Fi{|oYM?Q#7×i^ AW4 /g2T6_𛒜\]Xַ0&[IC^xH!M{?'Mrv:)>׺}S p[ L';oJ|/-7BnX Ʌ?B TBDC%](E)PLJ'm 礥R|ZܩmmГo]ڀr1]:y7ҰH\F|44}ļ_ULz`QhCL_c4%ӮU,`#pw͈RYBtJZȍ+-#y*lt |3|֧2> s>#$x:$&~5hEsx{_&~k6g&c!:`^EKX@Jνe/C.P +Kr#kOICߘEVFBA-m9 khF(3,/.xn|Q]gڤlW!.'QnVj $;Űij:ǚيD~<9A nܰ4c_Z!v#څ$豯H [iXr4Ie<9(IFuM膛B Ε G)ίhi +uW~5HÆJ |LUPhwvdP$$F?/y|@=upZn0H%g'aVM'q\ᚱbֵ2 7O"s{%eh{O3p8,‘RCtG$ fXvg`70^7-U1^5dP;QPgA9TRp@PX=^7|%i=QYS1t$oLoO V\۽ʏe.{3@3@sXZm@O5n2,)5dƘUv0_VC9ৣ .؁zگN],9)wk~ŲnUQr[À왬vlEre(f!I VuA&clȴ8jwV$%k|n@ԂncϭsKTdnY'84{+nag|0-]Hl#`} SH̹{X7S$ypx5OmXp,F 3GxYsq`ĥU&KYE-Ds{_A*8^{&*tvU&4Mɝ7psE$ș!/kToIp  :!"7vwV-1׿}`@T๟V{o/T1r+zv9%f$VAuZZ[ !Oc^Iq~/[} TѾH*-ԥE|Vi<P 2x^03]'mj7iJs߹oEH@@!D!4z>Y, 30k͡kP*v q:w6YE62&ېDB3U~@\m7T e9)bbޯ;%H?|wZ/gBUqf'1'yk} Bﭴ67ߤ.0N yw2=Y[9dh8YV{~\k4I8?{놠GLj}o5GC.kB=6~-e=m >&\̟[#XĐP"PRZNlxҺSj_3vU?+ Q_qWS1 mЈfAW Sq0>J)(YLGN25Ѯߌ'2Њ_kP,Ua} >PG&2&HYbXM @5lȎl ϔ! ce Q#X@0]<-8d"4pw #;iB _bk | lR /6[V)݆nop{x@):"|*2ю:R?J &<ϋobVM" RxEPlʴwo >J71X]F͸jiwH>r)puH(IL00&$O=O_ Cqia.-A5WEhl3JFЬTkA(φ\vUhRnK4tG&NtQO<U072b7nBF'[S,Ԟ s8#`[rJXN!ƒ|6D$N@a*+oF>^Gf4S =ɐ]ydn(QKs^3sM-?#qa i\+/5[p! Nֺ5;g7M}+,@[hHCY))\] ~to-ÚI+FwH>tMo!L"Tp[\ZQ-RΞTl;hi+UD.ekDh#TB >wl Z #;Mfν}9ƷIjY8PYCìgjʫ$6:V*@vI}7mx3]?u#G4#K #Kaymނ6 $w !ni>1 \lXLm;:ϼD9x[\]sw?:@rshGl?NhrZOɺMҶ)%T{Auθ37sHA_ן< МHomSYF¨q6 x]͜5Flpm#={vYl_Bh6piwAnApφ=a3Nv[TOw%PKC0BX'4AV-|LF`d[O$Lx1Sə*Saiuc!uhi`"NLX: Dw!ЂA>/*^ p ߌpg Xw͋`$j،qkPBHoG#c֓3enslVSjv[o2[`t+A? 8VO%̇4ROkLjrj+0qVܭܛG>݀nGM<\h#S.FCQc!GyGLja0T}~N?FD! =aS~F8!牲EQe FOFIXaG `o\?{$Ega4KY+盜NDw:چThZrooC7*RΏVA^Ls;`KoJZs tn[b/Pm+f=ԉNeC> 84ncJ#@Z=#ѯMKoTs/Q"WVrn[N ]=IEGˍ~^o&J&~|vYcI{uL2kN!Me v=f ʌyEI±ּ30LRqq7^F:>Yy~N>H_DU&ss &m[SpzO !ͨDaF[CyJAMxi=yJ̽2I:^ (:>}cq(QoS˃<(,uѹa{ #-'*w6ʺ sDW28ra:>hjŦJMb>GC33R&k0'b>qCn}əm)s?r yT? Pː i.~60>fR6pXyv1P^¿{4GfԪ@Un/`Eǟ {䝿ef.^13G_aHYÚAn0(Xgw彅{1(m6 aXs!_iGE9q\=G\\ lآy^ThRBK36"\oMt0&A/hi,LX↟Y.z&ٞx[Dq/ae'i`@[-N&=[<5:54%H{>DDu@wžFcSE+ eצK(4 >b/ݦ14FdgqŸ.kdEKCPNKn0~i^ߜգDTpM:}u@bGOi+6G[ѳ d'Y*ˉ`@URAG zD:vMpHA-}Ctk6?vwe5h.2iZFLv(nb vXBI|ǒa`Y0/PM?*_\%"+#"G}p3|3hm|`U릭jQ↉ܩIJ1qV! NA(*-'>ɞ)KBfstoHNif >`ӪƩX}a^\BpwnLA/y(H$c8E4 $VF-O_ \>`VK: BoSeپq>Ow_Oj; >CSԈ.TbJrS#󌠎R:+ X0Y?d|]j:Nd[+!~U)E[f SNƈ!ewKStD{ 4mTn .q`Qpnt.-t.'丝E^$+;Wа_q0%諾R ~Zd4:@6YA5:*^^:M(HA>Jֲ%B܈,?ָ>yVG7)c^ς=7 #J9R !oQ$!uqC-JFNf;BF-0)hQ$y_$ FY8) m/u$)yaۢK-n [ ]ruv H% ۵x;D"lԉϞ1{1ߙ{2p?,VRdhh KWcu1zA[U;D07O}>`7?e@_Nu#]bU_i+qK LYp*'P#J+ 4wt/L ]&(/ ŗF80Gsw|>S1YŔb N5k{ИLkGZn@Y]QAOcu>[^ma"H >ݬCXS 2#;{D^:%W 8Js l[G[-j:t 4OoUs %~NT6fԾVX . owm>mnq!sݴ-3]_C^>^'gyk%oyC_^R\&{yt%RTsəh+⯷ *^k`l7kB|Uq1.?Mu5GU'Y!:6 7OU4ۤwۿ#Ea69 dyJ>{v~;:&POҙ0\aǠރBO]e$q &ihOjp(i!wC>b9j8+67 ]8߆;nQj~_XaG~Ѡxu`i;hH0%q[YR Z]AI5Cٱ"Vg;L*ACf!޸cEGWd-lI:5.!)zUͩ՗} ?Z@'6gfa Tu?PoOM\Vؙ `4*4$h}2^F9>DD@QaT=ε:J `(t-a4^p`00,(E"F6-PO\.J]mwio/CwUOE"` ^hBYPHGiWmq6-."; \M/IbޗÀ#w:Of7Gh) 2m$jZ`9UY3CπZ!Jz[C[aR۷9m (OǸԮE/H;-Dg0W[aO٧>5-4>ifT/J?TfrMvAu 8'L`[!%ngW8tcԄ /:vYm06mBXRz!L_Ådn+mvFV2SGkUZPsϜM|>Y.jQ?W§J?#f;?5DJz95Y,=+qS6't/P_iUJ^d;gc/-?a,˭uBpH>%C= 2X߀44vp.ލ=:oԺ l7u1!u`2Oƹ4`:j=b4:=LH֯٭H'vNnu QA'?w[;frz|-pL`T$4@Jyda"@<661;(@ Pu4P~ԓ93INZpXVRxwd08(e t2v[`R}i SMF,Ki T9N^:8ZF$7OB8J'%G-hz'5=^(Yprr:A₊lHB] W ͞{dIЍacu~!\w">@d`^_e]?l|Ɣ;}jxE'n +zgnL! Bs=ifG(c+66FQHx} ْ<7̢;#TTE4uTf6SEc;K:pi^쉌L9[luJ `h]φw-eE*)Ҿ}Izq:1g5[(IR;PiVzgB]tWq}v'DOHo~]F؂{ʄ q2Pt)Z@O>%a䡾c "ݱa<"iD4֋Gl{c8 ( _%=' OM%W'$k{xΙcl ڧpJyEAQ㌲ܰO9AH!ְ0f[DaWUqoO4}Cj{?G`Md(F?A#ݲ1$_T;i1Ӡ@n-7tHͬ(_̿ F+^C R\*ƫ"A{ۃπ+\$ZAL,S*;U^PJҜo>f4ڞŒ0eX"Wa.K:Z[}7%O5!LհfCh|SDP=F@ n[l+QʞvȡطfIQeH$\kF'o4-6-Di˳#7>`yAd$>"LMm&H}#oz7;^67!hj"%yٮ*c LBҭ$YVA>hIsV&lϺ{PM~X-"J\6bDcs!!%>/ju1 8ٜ-iɞ4yў !"ILY<1ُuԴ(]+!@k:-cB+չ]w./H|HE%?hDowɆG1V׷r6v*~<}ḛ`8ݗCl2q;J#2`-E3';Pƭ3ۼ -6Yig&="VxrL 5jh.ɫ:K%P_abh27s҄t7>(a[7SzGhiaP1{*3>8U&eF~}L >H%@E cd=D \OߺnՔUw*hA[0=!d eϚ L(SDp C*ϦLh"bJQf ~(i"+a~3$X'x!) wmm #UnE8k7yvm5AO?wLka1]k7grڿqەQ#/VZfaF*PYU.$3ƻ+YQ凳gF  bFf(;"'(PKfCkIۦq2DX;5SwXa4d\~l2˼p[B/*9 cC{HF;쌌,{X)xK@uSQ{iw%5U]n~j͸4/uݏ=erڇTΖ.Esk,B܁Ά$PN_:/H#ewe;wFڵΧ/mL*$@U"FH{ܹBDUvjd^_/Ar-y^H?gS'\ ^ؠ; VS? >]܎v%n2,qK1ԍ 8(heDi95 i||H y|7M֋ 9ʺq2qAщh3{5$C=-`aOQ/ +gQ& 3^ߎ1 8Oik$o#y " !3fYZ.8Qm ,U^V n-碌hIxz=G:\w5) u"pJӵ U=͡zM",JQC(TO$;}+N\i SHH.`X (b@4ՁEf\V 3sFi HP"x3?dy9пso@9L784$p8a`|=4L"v^͋560v afldKʥnG ܎l$Ezc9y$9zg4Y&8GR \*v?#8D)A?b `\r_hJŽw^||. @7>s4]1>zR( i /L{F*P 7Ќ?+tFx$lU pe6쾔g>r'(8,e{ |p3ޝ3†-D#EKSNS?s;`A--mO&0Ƈp79w4g(Viyh$ߨ:tdQpUZ2`aKK-};hHSu&%T[n>|`UTZ LP6 =5tԊa0WD`pP:Tc0xs~׳r:_˂vb_ m,k޳ne퀮OK & D^q)<&s"2} ꦇ#sϒ铞E o꿿1#M2E^CR~It3B[\RQ6ҺNs<-p?Quj,~ { rwN&҄alR1i@2*2!|u}fxQvT)I#|U^$KDsU M45Eσ+`;$ f̃,ϰ dVoPFk <.ͪ!Ov׌\AB 4\ꈟ=! rI TQÏh5 &rEgFqV=nŸԆ!,ase$vCGꋩ' BaAioۿuDA&umUoś//oZCh. I9^ }BMJBK9 (Pa`kBM[j8F ]]t ؞݄{MBU)(*gkaˢy,%J%':z\ fvo*s^' 8:EdH#Z˫Hf! dtoMJKwyXP-xqVuB)%`c\-{Fig|xe ΐ% tKq2EHrGCz4o>3zsAv' Tm(^PgUEFNCMH/1_N뱅ܗYNZyXrTVu)X%;#EXE C[+.<^ꄄ;7 wLͣ<?FGi֐Al 9X"#B8/xȕ $cBnBN[UH38RD'i QHzǥɉ6W\& cuɄIktɯ̓Fl/N{)-fK44b#׽l;~鑜p^%CT;+GINj.6T#]UA}YcYx q1;܏qD2`GuPD g'(wss#U&\?з៏B'[T(*};f,VƐSNpuxA} "m<k@~Ato ԀC,o^zɫgP3BA OhU(SRFЈ37s1l:!_rSIp^x*c bKŸH5g(LrQXLR&!s`#jOLt ΂nPkkkͶyONc4&;އ}Kfg)+#2'=]xl&"8( DرI.|vscOmBpEճϼ}L@}p`ŒT \L3qwsݤo_%eNJԉyͺ$IA">ƓV=9DSXY")U) X"\a"/vc3 P~134`i}lWY2 a2i6$(7q.WՁKM+YKEJlSܚW; C<( f~ GSYA؝iïMDpz&y>؎a9{. 4\VxRUwoH`Aᓯ*_Zb3QiFNjkCg1M7ԼHm?$xOX@I6rPנ"P1B4.XW}Gs7~,g&Np ?mHum<fs`kS. $# ze;¿H,iBݶ N38n1.1/AnےͻH9O?j|`J@ԑEvb7/4g0'qꃮ0VL LJ(?9M0E98Zc*ke]m J_nIs $OIWv~TGW_J =-+ WUj"cλcp,%$abٓ|U銚 _m6h?Bf#ڴq`ϝH2}O!ugxKs: S/`xAhNj$t-SW?n k6 ꯨΛ{eHL7u.-K`P p.p"_H;ajm]ŁM*(ma@.[^~+t5d '[A#)V;i35LZO|,8JLID!Q !|Uٔ\8DF]p寏Oyz[HݽY5?]~ ]aN9.{+%J%bfH˙i&j5q~6(Z2OƆsy 9 `(Zt)9&EY^C>UH衑ںwhN+6[ WX\$X -5XSP˴fkQ",DI< "Ȇ,]=YuRGb/ftIBi:xWބJađԝBSԱN"y^1&x)0t)^,d+8k399Ro[`^fV zbVsl>u31a^"#.Rq B,2H kiao,unA-, i/mMp r 1fP6AZ[4ZHVy܅""P,g<,#r@K;^PbҊH3G֣9*FV_'OoT2ӏfىVKh'r.8 Yve!MB_GbWX%ot^%  / n|V_ѶلK-RxGhv2~n=dq/L :Q`=Zw^p]PN {4é:HU?eeK'͘+[t^W'v&]+¥2P*%LpG 9oֹG0 4<>'#*jb q"MA[1&R;5BVopb&춼w6l yxm8lĬiOh^r]ONTfVƵ#=!v)HSUpǥFwUC]:YzED%˖o7Q0MuLlNivhcqSU;k?`Ui򔩻+ʪ-i^-  H Fi :!ZׇP-LB ZACmʩUb߾PbXcy@P#90nk!Q'/oyIQ#߶-`+cZB*'1]Id_:F`\5w.& Z-X$NcКS?y)OM+5h  8`䭎v"9@;~&NflT7a\@\=͝7[ڵx5ϗ{Vh) +nx##1a6~aqF"7MK\8Q::9FD%qBKŒDkÉ~nᥰKmKS֒{g6skU{a.U(Nuf nB1h<> 1C?'ѵk2_\+,|;x-A[ k? "--M+X 5ab6: fd?gT7Fq/T:p`cBWϞuhR!AQVpkحUE AjOm1z=Jm:KUPCsgy#9(}蝸xD[IUp }WTN&^##W'nwD"HO+ȬqED0T}L-&oxE^P̌7uH?=?cۚLpzEZI;g5#vHu-;袺>'Ɯ|Dd:&]ҏ͢7 -PGw5mF+ulVѳ% p15,kEMe㛇=|>Q/oi2#J^wJPu3>4 ~ [' W \7+ew٧C8̤͢α!ExDcl>( bT _{ϯ 032ճs:ARj9yC u$;͟$3:|H2j/Q]cV ]dL❇{ N'ؾapg@Be v]96 OQEy91:|bQ"T5-z"nm6՝5D4+D^xV`_~x`aa#ց Ob?{rߠH_iCiE9FCvAX|@!h^U lz8 kEKH,l@]k%κS] _ *w׾k%F1'8){n8 \ f2yoT52Z~E\GUz>qbB: zdZ~X>>Ad"Xm:Q05TFl@ԃBP)I:4gsb]#MS[ޜ8+HzO#Dn4i`Ѵfl?bQeIQO4e~gݎ2),C8ŀլD ;G0F߶BM.ƻHL W^Be~\M3p̙8(!RsB_ި/X~A/^ZN֝& z)_Nϝ_:/矢Ƈ? 8i\8# -C~y.M~ 22rS;iI&/բUsrm˻<;(`:U̒pqiaͷs8j #RVNL%]O^?щzF$^2-( X }I4{X,`_twW-A8hPelTP'+u enV)i|.?zB7-K-h]h$>k[4@v(FGj6$N4EhXʱ< jt<>PgL= ?_]# =]< [|ixLAa,/4Y"2̟ɔ"H}T I& ?Ґk! Zܳ?b"_ d[(zP2 {:WT[{_A֯ Fr+{LR-CJ{e50]4Ka6(Y;|jl06$Ł]Wy hߊXYPg̤RX%;.s&R 69*AB}՟{5D)UAYԲgwӳa'G)7on/R(im/ gǿ>6æl|BV;p#ՈА2ҍXa]Uhii)|1M r]׊T!\%Ia?!ݺ+mgJI8ճD0_F}E^6H2SJYpsV_ 9n0VH#nxk-/FwJxwq@$볷Da=IkE<=TT&?KgYNJ1gQ3?\M1?n2)iQ`mQ01O(!Ȉ_K;Y55X<a}vX]4'lV'g6Ƞ/.~Չ5tj+2՝fNU\ZL^|SON4p4ռQ\I-۞8ĺ3*DfZ0㑫T8`GyQV9Qָ$A$L,y4#% OЅj Gt&Fҹ]$Hj~]!EM/9f2m`Q*b_#x 6Y<Gq_%)%7 b_ #m6rk"rݹIxtup+ߎ;vald!ewRW|X%:FvB^y5ɌĆnegUFL7LNӫŃ H-QAwiYc V~qϰG_ltzJ"=AvYy7e k+R*dlqQmߗCoLq"\U;׏GM66qE\7B`:~H<4 f{!dxKK8FC׀q錂zYqwx5lpN`;JW "}I@lmU6p|O1DNAH* NC( e%QO3:` n}fX^mUJ^+IEd*q `9> Aa/7!aCOΘ[+Mͭ=}PN1 $I. ;l9{?lOS+R7H;BH'Q}OL'2\V'ݡ6_BKp8hb&k|_2 8u$m6lғE1y#ɚxdL/dr$^m >?teQVLHlEN3שeo.ܼ Hѽ&\J9 1`^6'x_au=̞Zk:oX2gI9PqpIi:PE/WfqaR)Ɇ\wF87g|`r)GTN1a(%^ N ,ePğ} Q,:lbBA{Ր%Dvϕ3dшFpkIkB?9hi=º׹,>>grSa E;0uS)Cׄpr?Y~rT9ڈ- yPW's:=q4fuVa˯I_=JU~@͛Ýq͌"] E: ?Js 9ڳTiA`CGrwSk"x*P3ja4똈A}qO2ӕPo @8!x+? ?cp^c64i62Arw=]1ݝǔ{x `<"!wf-#dc l%haC=9H~л;z-)Ӳ_[L)cӻ?ntGb+EM)q_t<=I@!>ׁ'pЅ[!(oh "sC&-&rܤaNI:J1ts3l.eb?rJp#\%Ɠ%گo$"U:JLc}G\%B%ЈhT;/StE#}f?\st_J3!Hv0#znj"ǡ r*3<̽S{^T_aW/ k05jJDX%4A>P.Z4q֑1n>PYT9Bw g"t%j2~? ZCp櫋 Dh\HC݄=)Jm%&Mƣz JI57[sl_C 5QHԌiRyk%tؐ AF"gyeIi*K7ͤ >}t:b3 +hnX8?bk0ھ[Z {Z E5pvSl45DB:Q;9 VZn)#Rb8SHjvb۞~BYlBW~ Q]n/Ʋ~LZ;452fUѷV>Yh3M?_{'6Ŝ%X9DxjYtҤZiG}]j"/GA; =`orukG\j G Pǚ +>pIѽ=R{A\ X'X'Y]:in {`#/00d#ȱKюVV]C\t8Q8|b`랁гl{--`qFahOW`G.QL91b-O41";1*i{X2~Σ% ?u]q`9m! @OJґ:GTܙD!Y$Μ@\<2,Ģ27]FM*INRL[ + gpGp;]t߀wu6&Yi٣NǬcwjGHyN-"Z7 ,K͐ƺ,!3@rOVT]3f;HU2%d* ȫVf' cE盤yN)׌n2Fo6U% mT9 q-O}4~`dוu'z۟yOk͇vzlgQZ⫬rkK8i` :}䶵=vۨ<:g['cIҡs RR4axY 23uX6^v<d^ B*xl&i o>wvmmNRX(k b4**f""lZ'$yb3t\[ Ȁ׌YNm , Ό+]&?7fPOq]EԲ'RyYR}j\ʳ"\=[?ZqO"PάHZcBt, t~ìӎ[(D+t.{I-x Μ!IO#%Z|+wGNGɈv_M!G6#dݼLO }e߇vY'6 (%:`jHZϣќ=$uU+sBd^+{J$8O B%"#)(<4>5ob#/Dh]%NXl\6NwY$땋!.a؅Z%ze^kDΎ(?|وID e)P;yޜќWzz{3կBU飸PqF )PKxvp66klA :>epSo'^O~ L8fn]-Yx-Ѐ &\=6_ObxeZe7Wr%5fnNWJ)Bs`_-VO<  e3滓_.;>OʞSRM|a,p 8&ϩI-CW)96Wc4q/* K VE/H5:g@l \EyȡX#]V}3D$pvd z;(h}m:"Ubl#HjR}' |OR^=j!(Qd_cf[uͳ[*E 81ڔ$R|.NIu!S)tKXGfUY$ mAt^wKta`<& g1jVq:E.bab-wRo;[$l2Ã̱ a2ɺuߴt}iq5d`dc礮 Y 7#Rlogj{=@瓈SSm>"N:}b& agZ^V x@= '_g1(܁1Ӻ.!7i˃]n!_5Z MNvܥ;q#)!K.ݝ)1b =O*AH*I&v<:V.:(/K3OAE.Jx6_X`x\*3^4jQ4d,3\w^?<>ƾ0sdF]Үj'. :xZm aPU9Exh/+{:i.{XNc?eڙ8('YI7N^l:A>'>; `d+@jX(Aw,$\TS6OZSkyI'rG;hL|:Aݠ[M_ROfԷAMܽpl q\RxyV _!Ӛ"džŗuVNq7و q5Ǹ蝳]Fdǂl"C:7ba6ŶzI8ɩ ALM, Q05^69,pF}Ԃɩo ^J̴ꢟQ,=YSh'crpK AY%^0&3:ڥyz<.8nݚ7_x7 1V3̨XLSG|5hv'ijbO-ϹOnt2PLLߧEXT2hY] .y5Coon0bO ì@d,kiex: MJ o8},|L-&ڣ̾mNA;Sۼ.@&☸ѓ>c=E 1G e)jSlt":ed8cO(ӊqi5SWjfTڄMuEjh0 8S:^`+Nzc0t%›O~')<7Ew^ J:XZ'h瑄5+epH>d֎YzPįer|WUFKeZ rMwL$3¹M mJdAG;+1efub(;,l<; G9\g- _*ṽwe8S{S}/=2=d$q 1@"%55xy tAj@Lk0pQE`< ԏx>E᪇KatюQ(mDv"sɾDw]Tq/$-k%|i|m(2fLOUƋ5k3Ggôx$[NE# ;"a2y5ghI[䍇O%NF7BD~0.u4rP2J0~SJ*sno&"; M f N,ZMU3^ҷvQ؅pk"e5ZlϬ*Qts5<ɆE$A+'pϷĮ۩<3g-] AA3S;!yU Bf066 (B(`&?3,)9۰ 8~7 /mcu!uLjGքM+6^[FW^BLIC/yo᷵F*qdf,17&@5VH "DD1@I[dQ!;Y\Mv>;dϙoPEյV!@3l!g@9ęQ QҼ"U rWgk0a ] -6hQVYfҶazӛOڵ֧/! 'ӛK0(a2PrSMX'V᷉%>' wT&(sAZt*Nj&QP~"nSQtIAwU=b Cu<5@f^!XZ#bJ@ pZA+S`p2VMj0n9$T'MRҖڎMB=΢8sgnHq YA)x5z4v ²0/9B#_W&xKUw'f@n۟Oj63 P9R܋&{ LS,GW}p8 멡 SJaK=UYn G$jO LY,7*mv(!KV\zǼkA<?)Pn'WL{>XլGRn"yR=|#fwe2>&Ku(0 4Zq\D2E[SV#+/83GyT;-vv侸C`Ok2kU ІMN *x:*MKVQ[s~@ ^9,skl$@fcY; -(*IrV[6ڣx!iqS0F-{!ԾOK@ZeA/s LY#..IAErс҃FO TQt<íTNNU-i#<nʸs:X\1㯒vż -)(٤nc[:êc ˝y2ֹ ؊:<aFn!0n#ʉ z) -ƪ d^|dP.n?S)NBD-Hi{AÖPҨijҔ)H12q.sbV^+\|cig ]Lࠔ;qwOװY#1s#쎃2c2!r*2D!Y V#s-ROd1Tҡf@\$ -w0xi-%3 8^v=%QO ; tW4&䠿aX޲Tj@] f@ V% tC I( Y=Ws6äj-ê>Pm=Gll\rB+M8I.ٱ2X#ۉ@*hbL 7iF giݾEy=ﶵTPa^ L1ЛXF+_a=CHߖlrf3^9LC &}kNK124 t lj)`\ %`a3b85O[vq@^C&aȺ5աi& }Ish-u^bw@H'ٯbݧk̬'ʥ dPah2P!LJ/ڹm 1I :"ӟL4OԹ7ka%xBe7g,Lw,zM9+wazwNӅ~qMmP5U.lwPa|@$L;%Too%J+ۦђ}s+m: O.ERLA+X``ONv>sd\ @ EQۡK2C40#:tyG/IU~H؆1kYTmHȜj $DV 4rejd" ٬ 'M:Xdѝ?@$ڽ%=)hØg?O>@[-m~T~fPv]!MC6bpOIpR"Mi̶Ei󇟚RR~f3GNJP{f0OA픷 qz"O=J?ux08Q0kcyXA7ZlmLKHUT,g3/OaM CIuY_3QZ[IL$YY'O7ʂ@ja&@I|7>} j{* & O 0 ŹA!3?n;/)VO}@mlB&Ac%e}SSbD8O7;&s΄]pymjL2a9O*ݿh_xQp/c*>AfaS >ҥ83':6RNkƸB4@vp7j ߃8oQe#/H=VC;֋ G-:eOֵ[,d?WĽPWQ6c#Ekq<w?E,/}{1oGVj5%E_;U/f3གྷ RJ TcMY30I%<1+l&|a6J;P$|CRI~?m QQF:Z1tBC]a`8ﻱ1# 8ׅbiJЪsȲ?29ы;GF׼bG>-g ,36-P!FӟYn/][/X\x,J\ArYX2 j~pvKvO7bKPG4YπUqPaB9imjwsqɅωsdAI" (:osHǸq A)ޭ^_6U e ?)xrYR !?&_w,ESa![?b^(2fIbP-=Id*O[/|1}i 0U3;QaYgQ_Gq\x99LJkc0&1MVc,QbdO Aif#$7ZC_Vd{nFFZp\At)~\4Ƃ NŬlM]]rJweù{zYaayy^ENOF K;OQB Ve0^RG }Hw2C=3(GS}uEy(P‘V{;$@M@hٔ`R0 ,Kq.IQyũckw7v?iϦ-4Zn1Mb0nttn#u՞ְ-TgJ];MYPi+C61gN??y}蟝i[n%Tt{9{7!3OE4Xsz$ SEvU^ip˟>BGE%P Cu|{O[@QRjSĴ!0V׈bzr=9D$wB @0Tfw #Kk_B@.}dlPp%n>"%@d 1]Cdǽ8w*p6zukBLngVL,#;77j!YK3 LS*#qV!t'qى]ٴYu% n5"B.HȘ9vBKp=; o71GKJ) Od%,=`oCZ'#Aff\JkfuKw߶\Zݒex3ZGߟť-n(q߻(Y,uǯ;|-tݑX$sV]> 57a;A]DYgV"TJ>Xa{[T9~(7кl;~iϧgZSɖZua.Iv,qJH6Ŕ35&1^DlXi_L4~@3ً*=E|Iyhm΋:}(2$3|\2?+ "Nh1<_4FzcB讋hJ vf0HB)%gfjm ipd-95Pcci*%lr㉱@Dr2r烩;wz`ܸ;/<& d4_bIݒq!%1wc0 }u-VvzUGGycPrD`~bTJy^YD檟yaʹVN8"zT>(la&} oÐLl۷IEvJNԠ/c2͈$WweޗhI$1"}\C~2tF rw2m_K7z@fx䪖. V4?1~S= 6~Ms 6brI or{Wֳddt5r#ߦb1A1N,.zy"/)6$Mȇ~寒~DaoVW/F&/nl~}Ʃն*%F6G/rZMS3>RĀb*60gopQJ5+",@U-h, EY!@:zg߂iB6Sdyp3v)0㯋:pGNG,CE֡otم(i)}8VOki"2>N4Y5;&v$p7~h2ep8*j%thWm[J˫9o{ ӟ ZiS:W]-S|誩ԾI .+/h2 rj2C"8RNT@X1Q) 3R0d i(hm\ΈnQM+%)w'ULM"k';jN*we *?8^J;]Wg?ي)7M>ڇ*k\مIOZZH}e À@ ή34UXw̍,eMs Kp¢';q6ކ \MD8ͣ Hzl±RqACwQ. ϻv3Ԗ*Z@I~ ?1^vT68>u<>H Q7x<莂l78)ZL4~Fώ?\s2K \~;P\mIm \}c(ڔMeQzNH5;ܐc~uR"n[*:[bvmcŷ?H)p^ٷqcfɿ!ts.o(`XÅo⊜V@ /Z?FTIubF_^GR„k{^+݀hNVh`H[Xzz ǵQg5[>oMD)6**L+b'"o<@-ް6kE|sk3Lo&]M~/jSp34ttЧ0؄t0GRcXLxxdt2+2.v퐐|gX20kmE#n{ف>RXNj:R5 NP gP)G Q?~n]*KAln",ZSɄ,8c+kW&mL  ϯp:,<Ǟ'CSģl c94WHKͯQc:#$u^5$Z^zPd#o}j#!*ůCڮVxB*~ZkZuaL529#O2gᘍ~\#Q:ž}$#ew*Q=bF]:G?Pb tU~kB- kSPV"7BP6龎">.u^k!Uo{H?NHoms?*jaBRˠm$D'r)vg5_U>u4_{FxЊr(uӿ}ؑ370hYuu ('ŠP2K*eau#X1U5~.3>F\y?.U~Yh@?OoxB^.c_LRo`U̓ܿ~i0=ȒnX6׫C!vݲ#{k^vKɮbJ7'χ? /ә<`iT1+:Hn$濉ݣQG8W9A $xJսjR:<̘n Hu/BM(ʄASNAs6WU&:|"'0}uިPL?s|8M9*zI߫'Ҩ{׶+_*hUV7w칧M@c|&;W[QV8fl((Ȍ/ʊ1ʉ@>ae yx%)!L!Q`4R?]w3w~"ȉfq[l6MϵyO [vzO,1?]r>DyhC>BLW }x!,j]ۑa9J3 3 [ v-5(,joxrjau0CB,BP<62x[LQ $:jF앖n }]8if6x_Ut29L`]ͷ@'Cojp"˧Bxs?ca$YW0, P$ZBSa mU%֒rK!@IMQQ\AKs!SB'H1p8RҸa69p]"7>Q unwkGB{9êtBܛ/ؘ\pfrLҸhc5zV\# J_r`T&D.I?i($F%(`vŹ_6#79m !d>P}St]H4+\pIFoog#yRr* %w口ϽW*,i8 j+ܧ]z.mlD^o}r=h p@,9 @!҂w*0&3RB% v `_-OIoZKt!ЌipQ为kSJ.j:h!͟:;%xPB?{{Xa>1 > 0KJ`Pi"*z tƥT斛N=Z6BFأߓA`ȏҊl~-.* j>_(j(d ͙:6%t,9TY}G[T 80nZ}k|h_ZNYg&d@xש;s#3?O@i-Pml[ѩVdJ*SD+zay%lt_(옷ܘ_bX- 5@h \K)&FK+C0߂l(Ur>S)̐=k HL 8?ګ5/+u:7 E_Ly,(j_KoyCkrD{2Y 瑜Οg{jt 1[;svUKw!&0܅ﵺ8e Y?ÈW7j8JBj?Co邬]nPZ857E ~f(Z.[y84HYgb0klQqoاxhhJ=m9hzG,Fg0aaz2\w iT"J{܋t0 tj:tʙhoW==bEnxk!r\={DTƨc7b Oozۻ]ҕ(PsǕ]Gv^ʟkE# 7SpoAKzPaP t;mKb#hw؜HOMQKX~ؙ\힎̒2,[ jQnY>,&A 1ϨC3@Y[QJ:NYۙ<ҧH]Ov ^v7Bg&~8!MGSLCX z$α&L+UpraZ6]0G'oSC%Q/ӎ r+7HǰHk=o2^MoUszV`\؂A*ONg!&5ۼ2۴s{_޴VA@bIF,`8Cx:q%5ui0E6uyPIps\hq4#3S3q]Iæ.;Er3s?T ggltcs6 / ِts ;p@/lқ22P_uI *X:gU}/;%?23Q;zM^IBxo_g:sDuc+!DSo2[f}BlW=1ĸVgE#(ySx^DO:81V$sjt7 @;33G!H<W /ӣ.S!)d@N"w=te,{)n%׷J^T MMFB32<68Q fдW{O (Pm$uVlu$/ᦔ2#3RO+gM{zt`!w:N<ː}=Lہ34y_4{> ,9pb]lMbQuJ0<:^/n')Azt [%d\xC#q4y H/;si0oKO/rs@=C?K`/9 &G!.j#A0Y@R@t _QP~xs_{_$;@feSY}{BLarP#lcs~CԔM*z2%&OO :8Ռn+WA#wkݠ1[Yd0vH?@K0ZaFSu :sp,-M`w.,QA!]tƙ w*Y.=qn\-IDםP;}SU-* ڏ%%t i4_z$Q!b]M}GA)Ú6dM%.CfsyܰOz?_rݥo;Yў\(9uCB,Tn]yԶ6fAk2E?N$Ս g ~ C Bm X!;! x(flO|/7L+49JSl -4D!sqVi!v22 4y4P<\a=#<bIXC}㽙G\68VbNk ǁZ>B̬9qqӿN @Ik P-qKV(}Xël"`gZ93 !Be k{ łnɿ%.b B! gCcRyIv,8 GXŀlsCZmaH4\{kd%N^`:LPbmQO\nF$WgbH[~qSE%X E;蓡$v-!'QZP#Q %yv<#R`7*](3!Y TY}m7gUll#A9Խ&f~Q1y 3$4 Y˳ .]l""ӟC)k?A5#F ؕzӛ;NRlP 5wJmY]mRp%2{Jai)4Yxj9)s?c̙h0XtU4xaI4=w)Z}}©z'oz.s KD>?yMFBc 4KU_\o$UzelʕAPs^']`6Xyfd%gY+gl`;KMbA?MueyUX X6am&>a2A(ըy{̛TBSOfr)Pp?T ] ̤jR$g. smՓzlf%$ĐށdȓѴ~MbDXP6Y  &YAKdG͜s': 7`(M|kuVM,8B훭F2z?ԼD!E; E7u9ߌC&yTIcRY]`aoKS948<A"HY@>Ut$S,4 C6N[FP\J^|͍L+jJfuUNŭ}̩dHYh‹Z6t6JvlkȖMknJb,!@ IP"}ƽ% <uV#9e` }VD.%yn/hnJ`q1-*  ܟ !=~(" Ic,u.v8;5==V{2&$}$Yܢn?8l'aN[;)"m*/'k~`]bf;Uni(pQ-7o=`%4]o/顧( 3I?cϫ|R[z.`dzJoͱ=K XZ5B\V,,HۻBUaPH ao)atT/+z{ HbmTfvw d#n;p誵,feO ǧ@]MMMIBu\ kK.AQQTy;G)$'!ix&K^NL;i_w2|b/ƸV};!(x`eRj({y ,c,4&``_&E^?q-Y[fM=cÒ5IJs`aNϐ`w Xi`ZRaa_ўaO;8zt՗ʫ~$U O~%&Je,`N(*;vrMRat.M%2WGl^u6 t4E;/S55*WQb;1_qK(K[z_C+~I޻ ZcBORo y nC{vۍqg\<Ŷ϶=y{=Q/ƚ]籸F ѫl* ¬դZFXR10C}M^B2Ƶ?m ct7rl_U-&4%S!a>U32F~M_[c $͕?.SR>gS#gȖhN3: 'b /"ﯿ`tIUO,kO֡LEvӚPj|ѩWwMi@ՒǹU~:#v:u΍A&\Cryǣ|M;; NUM}3 ^)Q)^-FD'UTh(L 4>V٣vWŬ?T/yA9,;&az14_>2 2L4ҫtt%-D\{mD.1hG W]S0 m~nd0bShIɫ 3YvФ]yC|@<5j_ ~HWST .DN 9C{=8qWA\f,Tji€M/jB6i9ozt? .ԂKcYN\@Udg+>7!(`PſTD8(яW;>``cQ^ ( UF8A"35Ԅ} vm tϓ v3j`|u Pu`j0YB@}ȉ,JBXB e׫45Ko"P$fxA,SwX h{-δHk<~y WJ R٧,*_p HU,efYkHgs=K(bnQ 9Jb+_ΉRY&,6ox+' `Xnau.B$@lqkwR莜^ZP-YoP{߼68aiNsNrbxBO_qb%A|_,m) B:veOXMcEKCkysE fn6C0zf@dme_ˆu_99 /i\v|uo> "w9G ڼZz];]ۚ%Pk~(+1\/Xd*gDqotrzqz@6;w5Pw5^@F%PtWǍxUi 3/.MBtLfJ*=0F-G pl|JC,>*vEDCZE^2~w(%y5:{}oupnua%lĖe"Ƭc 춛^YF<têmqqj[F#"ao# _$тGlPH~p-kif>;vPքypsYAݰ{ 3i$H\qv[*PZKb˻|y8L1>)p䆖' _f+xXF`s=4F@PS qL_m7eX+&SE#!];TF0)%h$g61|IR.T\Ah+}bqxCܡMUad RV31KJMǷl ZZ삝5#k,)e9BsђT27K yk&h;k`G-`4(- d$)Cv^D6u?&ƏmguŲfx頖Uf{b,[,ueE' (.+Qޠ*\š7~l96`G#ewUVGVmՑXح($ [՜kg 6tάg >ár(xΣ@t8?$ڊ&)w|]J` 45Wo=z] ץE6ȶlǝ;4zr-\faZ[-w1:(_4p6r8$;6yJ3BAW)e5ϰ}THQHB>@' `k![;DVZC=_CpKa_<>_3h[7EXLG\ikMx(RtȗH,7 ORK&\FS3VGuqDcZ=z5n>3$,M+ M C؏p,'>cP%BR V.5x[-`|Qmt0Ф$3Xcn$Nd=uִ4YH(pƜ-DJZ dsLsWfRNÏ_XZJ7ƺ=}7f#lJ'lҷ7%~(3g4mAd OԸNH¼7+q37\mї/Fg<7&(${5 }/ 8WFصEdz& ]Fzې>0Z:V0r"u1iC/[ZI w: 5=~EŘӧM̎NŚt2ŏw/-p<8Ur;&j,Ǣ`+tSp[?Odi&Ƞ%;XmPŝոƨz*jm86V8ca܉PͮgV(gIln/sN%9+YvwC;e*@>*DX<^> !E..7xMS,JRjl+g3HwGg)qRd1IIPayV`%QFyx^)X_w$l|"߿Wreeg0jr[ KPC’7s{#'6Xc,<<Q)KonzE ],b\DltcjDnhNzX2K"v\;Ys2l[6u`vELIqJf~Pm[3\iV˒=w{r]_M' X\Հ7 ]_뮼1Cքz, -[of(o AZP-窶0u[i51.ļȁ1*\~ BlP$8!1֭cV%bn/0eSTN?҇A5|jٳNc8.xuaDJfL,Mezm}{?P3ә_:X.4/1[s\Vwܳ[,{MRWijQRbά دx FZдoDa dJ+^} /CLĭ3mLN/gΥ!N2hGG~ϣqhcک[h 8dqVX3QS*3=3  A9!JZ1I%n$q?{Mn-x9ut%I|a1`Tjhsb\Ӌ~kg҂b$ VoY&F s̈hLMGW("#U_&/4k7N^1){2 {ZQJ?d\%lP +skq{zD N&]gAhK -"5^GO{лYHeXTeC0T`X,uX()0/,5DߟAHL2M^+0GkVBy DT0+LH~?yKBuntET{X 3V*ju#m`թ8Y^-5!J Pm}'+8k'@{F#~0:ԛ=+#è |GÂ,}f )(Jw9nh*MooS [ fx5j|IlR/vR KM؞.?<e]j!{ R |9!\wDw|ռXJ?5\gotd||h}KK[%i5ˀ{/| s4Hi>+q?1Np@|XkKf4A?^}!Kosfp ǹ f~D2P &J5 $⡾Wv*n`FC aE˕,o 3-f՝= ?F-􂇡} 2Zi;jx9.UmP2p# m|C!g?߁(.+kz‘{⒚^s_#[{@Q'[ř),?IVr <#̀L_䅢ʼ.2SҲǰ3 Bʯ]=_[shL.DP؛2jǣL׼*(Jr5-G1 !.^h7;BmYאPNPȨ?ib 0v O0lİ `xfai񆹙فTAU)QYO!~W5tOa23!:H cv%Z9f&P֠Uqrydb͆h|I#Qu~vF#$5 JhRaJ9LolA@}VA3- \u0ŎF 2MvKrmvzr=) o9ܾe+P6.*x;Z>|5Wg{k3Q+@jR/pM@Qtc|'( I~ІX;6daq64e%x7ϰJOdߥD d6,1 I#--dlS}r ; C+6gl2AT7Z>?ϓ+^XBV H>!KBڗ:!r^Bz\wh;` ) !~G'cZdD FZoVKgO~e5CQ D"KR[hA6ֿ=lc9(bP( fA\[O{QƽF}*xJkVՙW6ѵFl%M.1G:Ӎx펻duO\kX-ΡzW/ٰ+ \&5" Ep3 ǴC$#=X=T =PѼU6mpw)XiJcb߸0Ə8pfRɢ^5x2( "u֠_?,?#^-JθFVҥ\7H0ݥ-֗5b#TJ؎`bAN#13x\G ȹ7`` ~xHlih]Kg,`5^7k1#̦@ I|[Hpf w뒰=Kd6"".o 'jtk~Ml՛O׀.]h}i7˞4sSv}ƽUN~E:>UFVΙ h鐑2ג,*T=9SѶUĝ$6B 1e4HS'KW-PTܧQ=U 9hM`Tz)3O F0̝<GCyCD7޻7  }K(|_P`z`g8,i?^+yG׹0'z@?5XHP% 5P/驧n`n]bA|:vm xPFEExf^f]T nZ*hfP/ tppp ccBR~f gY5:xrcfv UjkL>tK?T=\ɯPJjOIu9$;68W<&/Xٛu䳲OѸ쀊K'ĉLWM EjL1fH>IPjg3Y];j7^ʵsr{]y5Ն*ԩ^JT>55"\?,\]2fC#gFĥUJ\#*.u.`'~M4Zx9RA-@i>[˝q*A}q% hULMv_Ҩ2@f&}^kHȞH3r!;jPjy% M鹕Q.;pxvUV,o[g=z/ꄩ4v_~?Q|cZMukH,LSzWx0[vw[> q>>P<ʵ˙Uڌ/QŴL7٪r M~7?-P;S?)e{rWsO_CV >DquE1j~ >:K4Ytpk:`gA>\ŪNSV"w`bJ"ӣm8pZR̆ d"'͞_멥mkNdgb!1 z&UHa¬\e$KL#Yrޠ++>·:[ėiXTԭx IpK~bvҢ9ehK5cWD, iX`)T[H#\X՗:{a҆Nj[^,\C)} j1|X$FH4L-h[ #e>3=eM2pWI#*+8sB G:[u!S Fz⌌Ki5-1,Pu4:.AoIwy :[w| vQvi8<͖~v(Ld0%11b{T.Қ}Ÿ*tβp2m: US9%JBe `ó LWMy][58Ӏ-N7eu^jHS)O/>k\ LmuwT3I^jC~.KYLUH;_3+GaV\׫bSs*,H֍BsC[~Nl%aTlg}r;%Nr@:gsᮛnz8/GX^{2:d\-Տ(!ufsܕh6fR7Cw/Smκ8%YJ|p9g2ΗFqqf XD(ﺛkZ),-M{"Gx~si4$^x/Aaƣ:% &S u1;H^QXCh-Րys.<Ň6u(uZO9b xψRnf :!I1[F!@hwc,ckd|,}i0<Тb;Z1$P6* Òj`rA?։5OݦDTP7k+&5[vrp$@Zjb<|_\+yCV":Punm +z1Fyi~[tI;f͔G@MiYYUd+;Led$"2(S$.# {4|m-ZGDJ/ԾEm>SGv/MASC4q_}KL=Y%gDSjԨߓ1 o 3=b hxt]2}><6F -yڡ%9;ȅC3 \6J ŴTR[7۱QhD WܟxP|@U[Q: )I;CL&a-T@K^D@6h;)7 "r>byZ*S\Y!JqJO`6L^_u'9K-&8$e *4Zu$ى nyFɺq@W0CDhm}ะrq"Vx4.= F`酤!H0ϖ\Q\Zrz_yd7sOB&6i'toR*N/&vZ.Q<^BЙEIkF?hU_݃@Eؒ;p+KMN1P %6K=Vf 5} ]vd4s0pq`gkLDJ-Qdu7&4^`VW[<Ӭu3"qo>ɌZ!RԎKH:$ҫZ[02T;lGRAq*2 M,Z'0YT&M܅6-'-"NT8 ZKc識4*2&IL'#b҅S r7}>!q'tzp7r\OSW@ߞa&F;v4y7zxA|o~9;%U|2_x,'lwkIgLR-I0U?- j5eׅbh6~C,l%j$[UVU2*3#;a㲩\ BC3{L>9|)t w5[2-U\%J5`Οte[WefgB:=)yiy l[ϔf\'4r*GƅY1)6}jiɑ" !;nfgͰ='tLdA,[姁Iҽ]{q 8p9Hap.J{(^~=zI#zpt/<)k՛g)=l=l +X~SCGi$ /ND-{/%/3H$D؊[KN2ا}i4NnF}4S6qNWK=O{[]u}r z6ku;GR2ye^CȧK_T(J=I1TV6P!Cx3؃-Usp?q,\"g@pNF|o92c6qyg0Gǚ@z[/, TSz.alcZ"JjPː5BXb2w>+H,:>|̓xu=~/kpSO +U:(qլO0Y9{*@ڵ 7-y R='|@@Tb[.>2f*I80 &z}jpk.SQI,~@;ū}FqhWRaWY95L$js V=Y*:rE* ДF PU5xyC2)퐈j]M_|ABQQR"c HM<kPvoÛkEfT*pԽ81+C -2.KfDĉn]˸\>GOvW8ryT0γJnr뜿,1DzFcsjbG;8ϣWzN=.A}php7uq+q_*A`'l'IS@(2(J`*{os0(UX35Q\PЀUmOA20L]#un[2<f C5%`Suq@ n|xʆƉzHhŅ!,y;+_)_~`ls~*qu0z2t޺'v;0c[GBCgde%*sBь󥆜V4o]/trp?sra,3-bk a2RbG_2S jJ|+c+%E8:LM?r32rQУS"Zyҫ̎۵Ѵ c}-Vud c/v-\PYT,Zqs^R# :D8O䟛[PAdFM')tDG#IrHpA}{mB'{ǕR.-6JɁ1mWL#iG,0wI=`$u>w'9DZ)To~zgF~zotC7j<7o-MB )ϥ{Vzu2;5uwlc_WrN)8=d20kfC 3Fv: *ǗP2w9?H %Փb1@ѱA)潠Y.icx E,=y<6Q[*AiVyO-`zɘl/r,Rʇ$:Υ1Bt"YoD5Uy&wۻD .mHQ}GC4fC )S;=A&CK9U>GiFȑ}$դ}Lmdu3XP!LS:rxI6'-%#'K_{!61iH A'I퐜RR<"٠ݼ!bv[aҦgV?s\i "-le:aCrUӾ\0.?"OQggí soCQ:`:UjN?9X|η| "5۲ЖL5Zd̉&QIObIFsN y>{ǐ11,A/\QO' VLN+)twӭx޵֤EURPF>jUx`f{+jkkɻg"Z#f}&/!吭eM:V,12kI*`>Vַ? w\nx#lI?Y5c& vhͤz >X:%q"!(mطrji&S{PHD!X +$_1Y#ֲx5W`R\p(qO}dެ uIh=-Dp^he/,رw ׅMk g Poil;ߝTz%xԐt,8he$㪙?amx@Vz^i6\s~%Hc*i+!r|D}*|"Zf#buQw4܍["RhʺO4OL\4Y`46+E!Cm)ebZ܆)"o$/t6scGn]ׁf̪\H =ӟ䆁S5n88 l_3lSB2 i>[V1](rFxn_(9[ svT"β n> ɶزi&պ! P&%U#GAXۑ O-hw|J| ,P, FN7ȅ3voXH GyQq=Fj6ŧ9/>= zQuF%Jc^--6ƥ'>a|'u9^`}G>EVp=)nuyplyb b:51⌨PjB FU]s WT-칒|AFмG-֧ͭeh"h}CS,{#{zR%k^3Ktdgսy|ϣ[ISA&5U&h)UJ ]dD|6\4ÖСI ;21ˋj+fEnF&Y뢱K1xX43 1qF{$ nKe  gY 2I|Π:BxUR5otc D1Z9rK[+S)AxH7az?_G_yrGzo(K& o qnLG3C٘I/ auvVH&JmG2 ^EIÈskMr>a`Cls\qWs-&i |U}s #sl9?f>CݻxXEKJN7b}LpK">@ -ÃȖV޿͚|hieFJ Z$;~8RTRCm|&!?&pQM*0dN@¿sbQ{U7l ΙU1D^n9UgN*iuh]5>,/;"Y(fzvHu2&o4 "ȒOQt„ Ib,7ݗ7íd4.dш}.~_7bs}_BX_*@jFHrhxn"+c&#7ÃZHO43z/ hlfx?Ѥz=~'R=)`Ipzzs} d]Wy.pKПdhėkCadvhPD>u /.ygݕA:SymK+>^ L2 P C@aF#qGQp׈hRjhxeM6"`kZmY^dŬ>X_}ySA@pGjtFRbpӊKRaCPTk^F' kKzv6u(i?ړ3rk>?Q7|&r RT.M^f- )Q7;殺uẘ*F]E)601p9#sa))|bip#)4R'r} BWtZ_bnDŽ'`GSe,qJlCo0DPW* np_6/S,!x8KBk>Ps( jh͌"K60?j*V&YYGܯe{򼮄J\Eˡ Jhȅgx=olgiGZ`@@ xН5_] m'J(q1}<|G7ކr://hVdx5XTh݆wT5"$.p-:ohNOps%kffY o )gM} wt!ӗa?ӨuP|2)"ڀЍF7c$׊vin 1O( nAq"h=e}kE rm|A`O>!F\Cl (u࿡$XlõX)@QJ'UMaG ]Tdá(.sҮ334?ℾZ;0蝓Ȋe_)" ^ ,kP>ϕ.m^ ˧ۚX F("FT3d@~qTqrRAxɹt+}c $8FMAn经5|z^ _3ep1t`B,ׄP*@f#+}hr֬/KnuIW׮"rߖ3p"Zy>=f|$wﷄзUÅ>!nB,zPԧ`'ZtiSAnXjz1گ $Mrp2p7R-3g^=Eg)%kM͢%h!]Y r:W?ދ&^{ta-Sq 򚛸K\\;.4x{` bW%Q3|rff=ɊHʠb`TQ 7E"6ܧWn8&@/΀Fp[s\%w*Bsޑ;X_tp5*6.?wHoN`D$]SZ6E"O5 B9BX!ȶƉq9n "#֕ޗzvtf17S]D;Y&mrheDsAMpǙx*DyzG/`PS>B#l㐙r& fw 6f1Z9,. Y~jSZ>"!a p*3U!#U=SWMXSA} z\ +D"j`c&ꖪvG~᮶Oli{OAf6exf6>j zBSGQ@X`k!^.@Y@!4pػ47^b[x ~Wdx򬙈N~O aDkBCENJX2gf6wNJ`j?f|pPUFUVJH~H:=ڣ`LPhdaSDUXngP((qd@ߑTpƃ2 nOLrl仪>%*KgSz,2`Z,am.f+g+y)u[V8rA.N9Q7Ѣ91C<ݤ}Fg֗6j<8>2|@e[lMi6ډN˪gQ# Z 2hs.r{tM_qP!ڔF/P6/H5(_onɭ 6,<\)s)JB 8zSݥ2&Ҙ n1c>v\Qp Irҫ@B/okb} 0b{_ښά^^R͊ir[79!Em2_ri(Rlw@R^܊x|]Ht~V/Ti8_4a=3EH'D O}h j{bs s@鎳PX>7.es Զ HGX1Y+ƖJ. (ʶ2[{#]Ksd,_h3OA`&w|-/[I}ŲG=$}aj괇7ϥ;L~愎NE.E' w)`4E)Ta^e631cBZ3n?`L ےxE)pj7)Y  S)NwX:(HlM8WۣO7?b `CCKUfE^,AKrB+ڀUH:a!^ȱ)$}D_l%_x0Z.O)_&HQA˯vLLfle3";O OEt^͍[>4){"#~}GMLaX/ݸG^.̆zp9[695F=#zY^Wt§|xx~ fkgŢ"wsÌS$만a@Pa%Z*ms6t_Y֠KuAl`ģCGJ;iKT9Jտҭ|⑱#R죥'ƟR{J_1j*| X>jGOƜْ^rSq-q8].d;Hu8RL{n09,o1ٕL_IMt ,~0\ "VMviӋ*i&(Nӭ+#k}ݾ^eQZr>vt TaxO_c^Ps9L@'3o;3ݳ3vF$FxA6#}ޯuMlŽ?>PY 67YN|&O3ɤVh6^XwrU?EH*I)ԱI6.C^=nyŽ PAP7ĖB(%Ij9=`oS{VMKY}C=MW5 xӄt=Ӛ~MT^C//|Z[x4J q7ޣ7!&Rr]ȂJ(v/)^/fu\ TZ]ꊲ7ΎZljCƁ-MIfgIgcRfS:Vq> ߫se,i -ͮqt/oP3'AsM͔J!R|* g8[Nv"z1Cw8 G\xH􈕐#C`!D54Ķf"0Wjե'\U ]|<[H7U?5Sa )ćKUܔ7D \PY_U%>n#A݆Aլ{81? >khʟXv௳f%UX+Ȏɥa(l"v JnqWDxQ(cдM˔'V;gEUr<םGhE w?cֱdIYqdwF/[aO;l - rf_S.%ukbrKQD-껉VM|bXpG裾l"9)DT%֤ d`B9X u1) \unHl <[Oŏ?˗K:Qh<L23p< L+]P#V{_/Iڔ]bSoCIdM<=.˫ɣ3r ZWO32<4,Ҵ4lJ-Wvf@O*uBY'}:X"'uzmVC%cBiHty1R/Q7)QP 0).aUĴr`K'\Hu+>&Æ/1:1*rBJ_;fA\2 >J6i,iB~T[׾!n6*8[y?,1 \ vSDEқ*Wxnw7:-2mwg- <_A =)o4AoZ KB蛼ymªs\t_k h[*BϵsYE>zHzDaWhTj#/XAQ.E(1Cj$5 .Fg<_֗Z;ű!j{hɱVG6]pj,%Ё Td&% eZ[Dic3>7ck[9-޲}F>Tm_+ŷn28O+ !rhH,U>Iq@ɇ B6wXR^t3K L8JMQpϓiu@$̌AƢEש4;~ZiT{zS~+v|pu "alFW׍ @.I; LM 3AQ pm]bmAo!@YA8q*Ӻ12o9MKY CnlZÙ8cr:e12]7y%MuOK))[p~:g {ʢe]-\8 ћ6vQ}.sݹ࣭@ouw-ɲٿ6kd\Fbn:\Z}J3(=d&[lXmP>ƕwm)-gE ׉ƹ&d\<jŲM!Zj wwKja ֯ЊB6c2Iky Qp7vzG 3~* #w(FX},J Q} |'} ҎՌzs&{}X}j@`w|ZŘT.x_7D*]J)tOil+qO r7&inY ˯\jtyBAd+^Y4؂Y5HxOj' +J1f0mCcȘ20O尩+XD8B\;,L)́:\x[+Xt{@~N / 9'1i{a#,v`Tla1;ӳ-xOoXt Bt%4XΖ: O]!͞OnamEp ,,CQ+~G^C%$*lQGmLYn_|O;NpWēN󘶴1[[j^X Gu%(`D4è_3W\4{ƗEU$0(uX뫓E̩tbSvTW;!òlu_b.T`bsAL9?  G@C( e?U6j%?>'@O/ylVu9y xTϽyܶX :{`3mRYyayS9=e_:'O(jHk:Xya]_ ܬ&fԗהG s?; ytvjGDX0x(k\]MMwb_A{>iʫ שNԵSQ5:^e`1?3R<OtoËuŀRY~υh! 3Y-ێq]+†!p}OiG_#E HB}{ 4Yˀ^23[~R^W42Bq OXSWw_jgXJ U9~eoɱv`[ndW%ۭ?Lh.ڏ%ؑh(mחWxܲvS,*ux烋[cE_-gmLPaAʈ>K{"yO\Cu'׎/ӊF~+!iG/6ilIƟljH*tG0`u_s2rRA:0XJFG}{Ţ^ljZSK<ҜCt CX]qM7BJoOoўGXy!5:t\][҇qZ ?:ާY0kto;K?UHq'܎P&"a>(h-|~DhoEpތm5HǷT]R&5I4Z{VpT2M/`voVlZO) ֎ nw;f6y*oυם]"qs]=4ťi`'(7ʩ╲Nw"64Ɗ.v1|νuLS"[~6q&\]jȍz9 xsցӮd:PO3%%LQ =RZ(OEXd02:y:ӜD.̤j ^Bi܍ٞF|EI/RJMsI[vm~׭;#U,δ{78m)_%d_t\U. bp.YG:pjTc 5;S2 {]|b2s3yfXe1.yUCNZ~2Fi\K*˦ Pri9f&=;Gݼ_QvlPA/| 6-80h#`'\ * PIRCHmdwC`݇ir|440nwT7^},40*s jV Sԣ%?#T2 o]{물 cD'hN6!ƟҫףډqH$uk+큘݋B}7V?-&jSz2IB.5Gj}ڡ7P0I;L~#yȚWك~3QL-&tZ@aG?]]hu^'; ʻF;)ފɱ-cIj|{èV^"q5ŭhnjԧ7fRKO'#j}jq}x#Xj5uj.B Pðm'>%$HL0# ɋ?U~Ҵ;DNR !-)㥵Xf|P$Eprs)3Hp7.R^Cb2` jk/ 2/tV0 g!,;vqBVILf{=~ߴdnFܠ d&(_sHbb;Y2Kj.HԄ>V‡ ji+rFy]i4MfqYH,^5΅sߵ ~I%$LF5' Azڇp`!צ>uۆn30PUvuucBC'fA枒;hroLtx!Fgn$*%hD|AM/xbDvh\F{VMRۜ~5^Ty PE,:(؛@GN=uR{8s}xP_U9ݵqQ3V;jfe H*h5IwUIed]+ @JGG(^&|w?n4ے2=kjʌl!S*[qoW;BCqyƷXNThwVsA#C#Κ"͡$4 }Znx폧g5 ŅG!v\ ;KfvAk(~2O8zȿlЙnJV(ت(F#P"ᡇ M#EWKŜߜO1a{0GiV)e 7y-^$35n`_'DMlvG6'cRPsG6uDY%(.zXaw^C(?G{#̅@Y,K7Ѳ6GJa0x4C&t hpD$; _b9ꪈ>Y7drW-j`vɘƒS|v͉'pp+ >\v6ֹ Y.z|\ۍtσZ!ǴZWAbov5*'|+'C `JyWTwD dr* `Nزpi 8fup,^ m{ݏ|C΋xǚr=e+J>}-sڊ7oItt;J)BBdrK32W HD9>\L*8_,2Y*"zSиBw~uiliʼndY(wFD"y0e0ل~ڪ5I[6D"FVQ ݪn=~[cQ2WG嚿 (:OO*({kTl="o j0Ca瘡@p\1tV+k43؏߀\wZ,k4.xfҢdWh AAR"F;/?SLK}D>hjRk{^ *@W+}e}ǣXu_7i'/(9c4=jyKAw$L>Ѹ_`c$/=@oU4;*gwwMAHD 8%[Ub޶__64Psx- jN*}28{%ҦƸ+䋤c?u[M`5%ptAuQh^*1K#Frg0S6Zݩz) #C )_0`א%iAqڕ;D4;_Y-ԕ8{K,jSrnYiXM>y^>Zvf2"L%[G[8O%n *m{W|H<֌\a(cf|1t9֖+eYy,2$8Gױ! `qL˙eL+5iiJ՛0 ؘF|㷍/MHW׭-yqTqp\5;@/98p2N*;-5K9h%ʗ䴉3ˊfyU]#?eʪiTe>O ܺ`&lFedt9 Ws>^T dTO|m3Eۍ@yPGF$Qi*&x G5:(5A,1{۴2C),SdCXFċD)^FTm[:VLiF-`woSA)Xuy=]Hecj⫤MktIDW^== y Mcbg #%*~2]JhasD4ӊη0 <*Qopo 6%;iYG26#1_ T"ZfOe?,Yv+/ XoJwyq+?^XRIFWAc9,#qO'ΛNy ߧ |DN7݌KD'Q;crR9Y^Ӣ h f VUJK?4?% O^eTuMKofcTT1f,9^IAc-(4+7-e$[l+C]H^5`lnk ked> ?9B>.F,#{sra8nxtVI7%3ULZ{!e0  PegK LfHVpPZiʪݹu6F7U&(f2]W@.T.8R.ov)Vt'39M VRFQP* sӂ^T:iG@nZ͹1U2=R(6XwoŐ0pg %$. W)Jzuw6Ht~ az=2Owy5p&Ks~pU-e\3 p_}\Pud63Ϝ۞4^_^aiəZ GN o~R3Z1!°ep x4CMCq~8Ml\e.UB f不 0"sCAкFcߺE,$ė"¼^ SFXȅBNE7]J7i=Xkվ42C& } !A' B(Xe~5}qxG*R@[ L)Dl4S &^nj3o-3bҋ `w荩hI+٘sDi[Yg䩣BK7seڹތjd·sv@Fwʎa Ad&NL{`o"O"5 nU]1I1T=ߛ)c YIU-9f%/iA;/?'F )30~-&}L`Aq-vu84N:ش *g. v5:L}>cG<}]\pfmQq&A>~~8lzs?|Y9uDeKBN;֟M1da4B̲ G@2?jOim9ha-tji{+`q J5gl\ֶ0caJF1ʃ#fiHQkO_[(tRs@bp!S3neקp/ ^K/wo8V'80|v>k/⋋||5Yצ"rԦ{gK6z7oׅ`ڄSYv""b܅Ќ'/D{< /r`ݓmgNQ¨ N Ӝ,(F2ȁ\hڷ҅!GVby!ԟNDsVsC A? {.:^RcavmE 0AͳWqp1n!a?byogsb>g^i:ʏy$oȯgG)p'cX`yрI~dMif,>aXDzLƫb3O- iYMu{sьXoJ  Ƃw]F5z$C=]Љxz[?͇N;+< 'IۄoZ-hL?R0fJ~}qJHߑcJ$o7F#:u7i?_^mRd 5f~X}/@R8l4gZ _%ٲE6$#fJE̵{ OEW]/i6at?81,r l#PP@N+ h٨;ԋdUh`֌',nm&$xAk0D6WbYh8&m#(hѿ'\d~)I%aP[jS@8!`^&~81\wm|M!ӬK'A@[ _=UOS`'q綠1,= V {1jg yڟˠNy)ÖUubلʤlJCf7M]DE ;=Z5B>_ F+ ],O0y'R .\*O0u懂lS<Ƃ0 B<'M6N ᭚` }9|DE\jtM QIQ<755-<}<(ڹ]q4ol0s|MudYòg?Pdǃc \QjV(7A !5%:R HAXqQMx$8ƴ@% D:Ѹ/*g6 E[VyY(k4  (kl< .eύ@:mfc[A4$}szuj$IbȭطLE2 91yz|IUKt¶:1R.Oy \ӳH~LuL [WY(y@au2P`_Z*xi`?]e; OE5B2pBGJA\!w{"9+aC jq?b_d,3{}Q~(Angn?]?|PD2(oa5% s1 (LìXB҇5˧B^P8@$Kvbψ4u"m9S/^bZ5]i@"YvX]w|c-pZq|,FPy^ov*=7)Y I.IKA46{35ݎ!bХi> a>kp1D߸x~w(.TW}ˮ-O5om-|q@:m=G?zJ:9R M‹U;ɭZ B"+{q]<8VҫloY o (O&:=8 KHh2@Cѯ|f |g5,ꨍk{g+d7 Hټ%xLq<78"aih 4JN+EW| ڜBazn![1%ጇ*ό֫Ρ&~258α\XttkaOc ^%Ժr zHwoJ2}dI-A5x+ ֽ]>Ub2瞂*R#L̃fd#2S_Y/ gHUC t愭'Ȁmj bɞC9e`BkOYfnp #xAKGS4wJr;`qEq;u> 濪xo7)IQ6LgySy8J5E7ĔCRT XG KNt>*h|g0_a>;ݷJ/zAt9C^pAWY+$-D~+Ðr 3n>ϧ :R!@5[3H91?nEZ1}P%i\ pzj"d ȲSذ$kmܤׇm\ڀ͖HNX< eN7?MLd.$aЦk(a.%Y0XKcf rZ-!+] d=l3^lvTGQS:`yaژEkR9P`bn3<*РV%SFA}(l$쑹ۇYaK Gˍȸ "Kyk'dOڴ`Rȁ×, ҅!1dF=cCz<A(AƮ-zOM[;KL wdDj'#/̕,YDZTz[:A\`k8#=_K7>hȠP+, 24Բ-06f\^&CiA _r5 q0Ya)L|dluqW7W>و`Jw`| '^kqi|P^bcdl9r92uEon&tNGv6QoZfh[2ˤ%U)@ԡGCJB^,We` K'=^T<2E@g@Z)0u`+^oŶgQ(0g4f궹\}@sUf Mx@Ti[]Dl[7'(GOQ/Bu?v]*. exRhfBH[TI5SlXזnnBl r_OLO1mFSa72sEVR\J \2M׀˜Ȭ6.ZZ9(؁JGȗJz@v<'~UMl\o-J2i`Ҏ]6|Ks5hI9m%:0'`1񈸶TA$ZrTwi8r﷿3NW"\M'p.g$Z#V6 6'IOP_QY4 WmvbdxW?n"->Z(=ad(nO вA'zpd&8&vd~7lj28@ݩ,j(Tz砍A)PrXuRCwC5/ 7'Zoen7 T=ko0;uvsl< Pw8b07Oi\U1n$BDu&lR=BH'f0K% /T/.܅DEe:b[!WUE;njmaIm̙ot^ 4nMYTe.'UdS*΁`3"GVws[|gL6lO[-z+N@Ls2B'jpe{̔I%F`QpkcG~N+u ݤ50 (* .0O&_as 3Z/ OI$ۥ#Qgm{1FYdGSa 3jL)'ۻewk 倳%jC5Go{t()4YjKьN6` mRCT6V=LhgU[TVe^M>|UvOM5!X_,1L()@XjIv6S|Qgpi&px)DⳈ/ͥ(>B8KkUfl=nl!  l`vK s$ok&p|[, BΤ;/enڒT\UH@N2u[ YZ 0keQ|SP@hG%J 3O'JG(*h>>} c*˸(!G_BE-j|h c,\5:a}cD3]Ђ&(\@KݚS/`GA=ӼТzC, }5,eOa[z +goPRtz%+ hDNUcu"EY7Bݍۊb^rW&Vyb}[7ԔJcKjKb 4^-eNCyDj;$.X_sPV12f;Mn#t%bp&yhg0wj`.q/FT3(ыep] _v]5гĦ?SD[13BDuds)>~ LTG?;4JEhݽ[ V@ͺs\;'"|%aODI &v MI(kC}鵸DŴ~f0b'w{-@fNj< 8qdGß  JςӾ|!28G.0 g(OpPa䨿,< Ht%5?S9lI]dU);dWSoU_;9ZNhCSdUaɄ V58tbg b" eyմ'd.1n>D9*IO6w͌w @:5- 6?+vIb6bMD;EMn#*:wZqkx R&&JGnf5K[,Bҿ#޶ e]!, +xXB,He^* zmVIТ?պ={pni渗f硙􄢻W+ t@S<#r`MA`%g~O7r4{B(=G2-ҙVif/v; J&qJ8rۋ< P򬶈)&6 7û[̜5ZS//LBknإgNP![N&ۍ9̣a.zbm F:_3JrC"9C邝;zd_T gTP$7,&7*ՐUCnŋ]_Jixj !L5fͨALJ!A ,4oOY6:̈&g -uL &{Ǐ]Be𖙑nM@-:krB+(;3rS[c&"HD fЭ9MWlFS,VI2:|XLYrr>Kޥ@茯R76`܉oqHk'kȪnp֡iw%$IXҔWZ舭1/AK#ȮRmK `}rTp?{x0 db1Uk3yבɭM{op2?\y86ac߯XiK[Ek(3PޔL9ѵU in r&=')pw њ.4D<_Zt]ƉJ9- {B$@ɰGN1s'v*KH6T,$/m|o/@O1YH򻘞6!ӹZhFwvMpm/|@=@I+#}ISK}ۋm(ӫ\J?#yI+/#o*z<@^`Y/xBgץf1oΥu8)b;"ql2/ki|ګ]f2 7:"IAf|So]Ρ <7+V2e7<ȀfGokAv9t%Nz=MPけX=K3@;ï̳Cη*G8+Β1Bfzp0k-ׁ4d;0"+iw$ }x*汶DqL?S.1*-:Xa[{+d-ȶk⦻=k"h,v|^Ez$|mr#M~HG%LO:Zj}%e9܍!Zǵ;!xJ F%CM:MKwu{V+c{i/'DLPpT-8QL14[Ԏ#y):|;t.䁨p>\5~Ɔ5@C\Ǖ|#}3s~,%у:,6/fE zn.ImX9yٔS%$r /|\̕t-J,~jb?Z4ZMZ<0R&A(sݖ NC$Ξs()hG1dʬTE':)K묌B([ ~3rEQ8*j%%NhdS ]庒\OWsiUȳYb .˥O̢˻>O qdHs{*\e>Եbo14ڊ_~RD[g)܍D&IZ~lsڴ z1l'^9*;m2O@8P<6b~O=SɇG֔mswHkA;_5lS@=4uF 4C4.kbV`nC}zCy%°Yl߭8?@ 4+ t?|<=2o~Yյ`̎P$85 ̛8TPX6QT&Ao)%ɂAEZ${-r//<z=HpSc/&K\ЊG>cr~g#lY fukz@y=téɍoHKm@#- &|{1T)a [ߢ lUȩϙO)qt{4wK!-꽗4RRmR◧"f1ۇ#ȦAPΏ _4,?Bc~B~oe ]K{p>_*!=6aembΧU7Rt0T|wQN `5 r)!z-K~MX `U3sTj_ucKWά}Oo"=uM$]KZ}{E~Ɗ+ R,V!kycfLhpu9G6lbCE|[UJFZ ==`םS PuM fmuY'0Rz]$c Tj=?n 9cܿRsvq/ - H57V}La,V qcnBtdC KLř`Ih>hH\mS#\iKs|S&.5G^\FɷaԦs& /g)EΖF4GOBsQXWKNZl"qG>?hx*0Wᚵ6+2-d/_D9T㭮2ױ>+TY!L@O,,m̙bVK5d&- R MKe^\ R LE=g [Ӱ j^#;wӌu5@ -؞ވ롪kQSڰ.q'Z^?yp͙?YEsL/]c$\\/NZS1ZoᱼN~/@kEB3YOLM23 [4EBu+{HK1e/1@XSCUϪ$b{XWODyQx*dϔ)9qd4*\ (]DY}5`Q++_A׫Bgd6\ͤJ+TH $=3=F`ɄťĄW)DQU<_GfS\n1W| PdYjõX0?g ` m26hDQ 4jqgE!D"Co漕;n JMՆO\PƩ *BESKvΏ{ѣ3 Z,$ ԄrK|%$ uNGj*:̋G&zN)GH̻;OR"aC`]}$5U91wԍ.ED4%b`͏"Y߁lOQN=Z7x`s炸kw)KƋ#h s2%Q*@$π)ϭ9E(kE,h#yNDNǥT4 Q 6pHh v~d2:L,It|X`FƲ;0x{!g]+rѻnn{> |X \ =ߢʤES) :hꜥK]fl> F2&*J^<Ă9۫=oVPx6(qmeLEAkD,nGhz[EX͞|G7XhU[;;#nϙ`'8,%PYCN V%MIDFéo\?Xe:+WbX}U{M)#ǔ @m2T<6|S XﵶwCL]l,͓ʃO%וQ5>'w iQiebF~pI Ɠ#4}Q'0)hj>,EwY `JyhP~dʐD4*UшJ6]h%( 0>bXEu6Q:JJ@!?oZ:qMsODg_<+o;ġ~h4z3tVnqK 2?qQN׃}޴E#1 IekVPRaS1/֍!5YHۃ/0WWӋ4K2 tNΌm"Ĺcy-OI.f1MAߵoyC~¼3UkDeV B'~\WGfo*2pGL jt"9ˢac~􂑿m`6P Ծ[;\@bD/ꩵWЩ`J2%->$ӍM>޾;( OWSM]+%M!!kTWT]hk5QH%G XiP($,͞Cxx-HWwZa^p33JAƌb!4@pK]~5ؚ[q"Rg[>=KbQ6Jt((iKz7"nK#74>ߩͮy䝉4aYRd1>[ܥ3)i={ 0^IX 1Wx o;Rx&6QuP, OI`#IQ.[3Q~ ]9EA|cû]\'Eeݽc_EO2'(6yf}~B~{I^h7Au>g:mj@ASfH8ᚙy>?8/hje}RP J˕}ClT)pF!Ӑzze]S|(P3g7\ʗaùNom#$1D3[MxO*P-o늝?T20-W_2EhހPO0řHy+ԭK$[RgA ß&0V_}NUERsA2"ZU r %7*mCTmG`|D:؂}qio^nz;+W{*bN\-i=c! X ;i/yWl8:.n|C@ֻt 6isޥŒ{b栊 =63iTϊޢk\+0V[u2%p`+Gq k{p)3)b=o#5gמUuXrz\05جpZvni6؞ws8x&LpgǛ$l籤v9/y^UرÚBo({ (ˋY.7.m7Ii9M0 @?͑lWIm+ui#e.tuDICfeu@Y?3C<-xo;{hi&M w DU^z{ O`nյګL\rՀ5@~|N68/ЩS\aLx3Ev>bPC[4ƄH+$zHhVtBA.ϲmr_#|*r i+/R/ʨ;ޟaflsS V#"0Rw$,4 d J|Nn6^!M ;~<5;&Ah`7_NC4w'm-u.fKWqqt{(mfI"s̲`CIC|t&J%ߣ1V*#n2񩜣O|\\5D o;fRnhvir-efTKY>w ,&%EZF<(zlYT|poգBWP1(d7A{ dh 4(@EToj2hQBپSA*xX8o,ا"\cyHS80GdA|=7*Jo٧3}B˷))mx f/V8ss#6%6s>>mh/u#llt|9lN[IӼTY/ډ9E2Q1PS5 2+j.ά!󙗹י9^6>[e$g=JӞfn[# Zt"82 #ޠУ|,9Iz_ zTdCוiSRLzeZN?@LHpwhzZVfWf+[p" .oBpWv 442fT =tQjz> n\';9_,iG0E.$qa8.lڻ PJ tHޕ;=V$`vp`)1|Lj MT۹oٚYu4I1ЫTeĈz.ŰY>.̏ R^\9›J{J$;9is@ޥ3_fK,CUBJߗw6KV= ~q>[/y@U{&8{qMi5t+d4!? d I!2H5HYŠW7}:'g%" g<s0c\h+o#ݬțU̝XJYɀc/2^ƙxw{e/N@nV>Կ;*/sY4s{Ѕ)XU)So7N&:WYK-?ڳ%Zl u%vЫQJlcM'nYRB al9V[fD'l+|8uT(X+N˱OeM=z~_b"S}w\6;6πJ!d;6dl˹%F}P[å,V']jk8bc9 6!R4-l(SrG>6f Z4_L,TW|߰nВFBl6I}tD޻(YA6/u(T5 k |Բǖħ=Q*;;~* $ ?[؈Z?fskJ+ʛF' m0Yr. V >-c'1@njJ'"8?!feF\xgn8spBN$2#ɯV:GdDj9A1z3VCaꉑd߽vMW?'UP~? ZsD&Ab8,^%)( ֋_ rh/G;=kFXgaԉ/D(>]JqҀ<IJah0+χsGΑ]PFBĠbH 8h„fEą~02Kxͨљz_"aivwCk n,琶-ڻtXUMkۘJJ ]F}ИwfIoV'97ھ% 0iK.vkLHfe)g`L}V 4/o_PS/0Oڙ K=32n'$8$럎R*b &XQ)hD_.v{+!"?ƦDk@'.̫-Grh:L~yi#Eifp)SgSCM%"p`A(}Rer_yd#Ǟtֱ{Â'&7|ocq]MdH ̶ݥNÀ&4Ho#Y ?# yUfYqBVBD!4P~)i8B^u [^zl<#JxC1``mStD0< iPVK`XT5$Io]Яx&hZ'UOլ8- l&A$IçچwP "HD|{N9@4lq!:}ze Ÿ`帴+WP>&%p< &+1:ޏp#nײX뫿.XOֹ"> ont~h;V7+SUMKH8 "g <㈨NڝjȮ`U^ wV{NhY2.NʷzDehW 7a߫n9*r12ow,e PTFO? ;h`N߳MdQ-hW!^DGboMcyY*r;U_J9_+s\Re*rWSzls';PM0jvMywugK@%EԠ(BKʹ@$&-V/ _).( (GzYNCt'7(sϯUbr$@GsP{:ϨE%1KPTI}HV@}_Q=O;_7.ͪWnެStˌKSXyl%D=?fW6L)؊5CgX'3A魻3Fƨ4l5R!)HGUoA4JMIҠ' I`=$q*)/;Σo1H(Y>њ,= Ag.GwLi+Zغ}ط]U}7IV4tvV IʏUUϽydH{.F];=>U~Az/ۡQOzPޮ!(T1 B?%Vb2!24aA_^G#3coѩqts-'W[Hfvȇm:SG,8ԋ0WW>׊!3n~yy $oUmלv[%M;h`rpp%!ahoTQm/!uz7DT>TT/2 b8WS&ո/ϖ_u;hW98n?17q_{)z^hid#c,y >/bI*OOuki< x*_QO쨹x~Zjf۾e-xo;Q^u1! [pXd7qdHFRݒa0_R)C0fY&onթ֌%_,כ]> 3}΁-BdP wL'.ǝ~  w p`ȜJP Bۺ(e9_eRFAH5p6TnIJ)W!K@c/vvZZ?䄒RȪzA75V+q|l_0B8A]˷zq. IN9]_9n?Z W`‡O-,yJBƵё0YYuכ(˅Pw`J3%/$jz:%y›`f dbuK`27KVD^yl+maqeR(gIT懦`EX8wwαjr"ZH$<4ߪJW?o!1aFEFӧ"<5X=(On&v*Qcɳ "ȸ11oK]׀;?α"y3mPSu&m+pj!p^ECqxQ|EޢYPa$F`;K|®eO0ӵn.ut4K'X6D5Ajn 4#-1 `\D s"ߤ]C6tqn?vC"#`eD7 JHDbh:3~]64}HUq[cwu8׌c M [#[W/q&pnGϳ$6>T^r^cp<(O@|aKH *Qq $I[=YBM٫lrpHVŔjρ9&}f 7['-33b | Vl tp&צNL &7N?ŧF}h:ӯNuԮ(m/6LkwgUºz<&{!XU{n$zRJġ&“a ER椊6.ͩpHژkjV@|$"glF߯.%6vQ9216).}S"s!g+ӹi 0a"+7755&d2Vj(Z{8 KkS5K Vl0ܑ./ M`1ANlc_|X7 :(H:e<ntO3 _?{[̻OQjy (2^>d{em ?hM➝{_fDt LiNeai,Y/e@,\i{J@ۿ1vbd1Mg3 ؕ,YIn"ff N6":N+mU6 -r-}Di[1Dw96}7EgX'gpjW ~DB+{XnD8~$#J(9u_3!o {@d+,×[w0*Vҵ94od%F? fB,#g3Ҍr^6#'!A{6kL[]n )H;ߠkL`!G]k3ɟRy71gRflb5a.BPbe JY&۩N LFlt/.\*`[j>vT)-^E -tlV;?2z,FQ]꣦u)g2xkwGK3ܥUPVAC1&oLwNTS(cbac,\pTqQAq?.%0K5 B&\ 7 9kxz|I,Baj4G,a>~1V"kIqa>BV#+W/(! w9+Αneת-25kyм*7A3SFXv)A9^;7ψ7.R `ϖD? x-1F*%|FITPĤlR"mK` +PCv{(@'T/dž;.r*;FYI ^{1TG?'$I|{=k xq~)q9!s@45E3_cb>)YQ0yK{ԫaAV;2_[R߬ VJ;N>k!hmG9&1g$jim7|JFpjyXh%}Z߷#:C:=X!"CP;AT \dj#5j.DfXb#D< (ЊN1XťޣO]Lrarcݯe`0ʺ*o㼈B+P-1I|ԦJP@!:.$GX<| Y 6%fRB!Qt‹=A~|X5-kEmZ묺6g/T*ckQ;pܙKt4WmZ0tVa2 jyu|B%FbmRФ>hzV13q g؍8o"Т Ww,O-0G`!zq:L*1{]/m͎UĞx)1>keW3{3*>7 y}aqLfQӗ u;U[$ꡉ@rwMQ7-fQ1}ڕ{K[)}Z!m%M`׍.+>:*)EYfp eiY96*Ƚ}xGSD_)$.1!){]H!,;1VF)#~5|+ykT]cHk԰'ni7Lyo"v_E;S4`d lk쵺ry^"&~v9$返 'IVX wZ'X>y 3H*+GfHEO&@狣Sbh(B؛΁ ٜ$UA#UZUf NQ_^T"ܡ! =:-.B.gUv/m@k\%4ey᰺ţF[ /)G| 5ea{LBDhq |^HBhz00[(RUkI>WM \J C`k7^c}(f|a ĄFm;z;)`dUkqTxnq@ D].m|37u+#Cæ 2AAL#d#-퓓3Z=QTjo/_adM5ߥf{`ɶ =;c.baaa.2%m2b$Z/N=j4 R()6Xҧ _}qg6G8+CE?q+i q>>*Y!^|nuq\megH!/ WmW%:SPXˋ<^53XJ%sZY^'^/;&lWU4585z?0Xnwy"9b[I⠼NԏK)ӵp#zˆ(ɴf{ї- ?+aЧ%Oo=`xx:s_Յ&O.#à@@kq{0\)_̞-6 %ixʦ\'\?f MA\ؓ< u̞;6(ƯAeD7cEJ%γV-VMr#φ&EXeQP ?kԠB =(i{I5̾ŒL^$le[QOL4G4QVd8G'4* 1V1H2I2Cv&2l?T]SsAqcr^KU" I幾*鵥G-WݜR(-sf=BZ+Brr *ά QRF eTfs0X2Gx-JA\sH92%Xq*<)*'}wW ¡qd%t25uA*Rz>kT6ss#)YUʲJ4Pt~`uj޾~Z[`Iۖe$DKIg%qA)[I}о(CLv뮊4R)dr q63 v6q NhnCĿkK0 ;$O&SSm878 {. `l16ͩ'V5s QB +K<G56f qit DAr}e }Vcl YJF~R^Iz^zsދR9dHvHM,I^/W ζIOg)}wx3rh Gį)hcQ;4!:Dqu,:zIT- uQ+.o-]DD Oj&g\!_lbOF)᤽Ef$βPkv'>$KP鏣Uf:wXǹ}VυB yܙ 5S-1/S>N lhIeú&>V+O%{h1O;E^:ﶇ6nShy/4F1/DE"S?c,b ّqa`[jJu`8:G|,!rAN31^EhP@.c%se/:&]"٬ȱbeI;DP,?I^'GLTGt7ؗfn-fE+.܇ /}=W./1}__1xLZ镚>X\# ;(2 n.kUGVTnAH cnVfrAB")UA^wF-קaS7-E{~w Y&<1/-M5Jх]yB2O|{aSk{Zzw{}^T}?7R'hDۙ@zu,1Qj4h"~`6lNF(q!~_ ~R m "*惘j^,9Gc+K}ЗgLݡa!ߎ`z#3惽*>`ゕՉ9xMDz̢1~L<"Yq g{ΫUafaτ5`c&`~9֧2iؿf -FA2G@}5x1޸? c?Ẅ`ƩMܒ q:m R݊f&cC71l,>4r>idCPx4BBC͆hhdñ0AmV}~m7 Y[Pm(Խvp! ˚uNΧvy{}9'`3]o*SDrLr1n>Lk zZ*YS0.HhTS]r)o Es`Q_cQL7#o" ˃sJwT& !Χ N^]>yM$j<: ͨ ZHs^m{u*Ǻg"yOH2LJ@i^jIx-ɻS||nT%[r`~;Qʼn:) %Bo=0 [7&V*&8$'d BuIPX+@n`t V~ȥ tZ:8\Lrk¯f^ꊽA%%ΥulWorEqpk} dn˲on'q)jF/Fm6+Znl*N5-0T $e8̗|ݧ3T1F<\gϛ"(-(#Qӄ.&=qnsţ$& *_gJ(m.`ͩfL]-7|Lޑ&)ށ:'mww"4ADA]5,Z+0@?S˓6?\C[^dIetA0^\9++գmszsrcr=j;!ʵ}#ѶdBbV\9T 6(r+>;W\@faε:ڬ瘴R' #VR_6p>(u"P(KƯƣBraSNSaܔF+0=WL2IF,J2x$$^GN;Ym51 U`gMl qbLYm;m㛳tҮow˓PVC"Qm]E,k`DOK0Xe]̋ ?.ђۊ*l&Р$%:YM dUXo$SO#1p0 o,wJM1KE{c+A69, e7֊0̵ZFl?(]zh`“vۭ;:5#Xw]W݄X 9J,wff6.OZs94^pdͲ35{M\0ZkA Qv4Sɳ\]|ŃTBg ;XJ ia*NpYK]s2|x*MIh#+.UͱjVc,XAȣ ^E_`E͙s({4z.嘞HDї3dY1f9٭g\ gG|SzOmUwkj2'O-F Ift ͥuc[7Eѡ` qz1)!V}9˰e0Su'^ŢGwoVCiLdp3(<\N u!v~$,px_0˝nW+ABBlZ:r&L"Fl .`"-7Yn_,g#¦=FNAAಙ7E 7ث= m~kk#B`РeW.轓IgL;2ʕ!{4"u(Ky9 nZe6-y2ϣ?6~KAXh|s->2XK߾j&Rkzו8݃Y='(VSG̿zH~jP9yRuCKE~1@-2@h%2L}QR=B*Ѱ<),㍁Hnph.?u.e _o(st_ QWHjML$G%qeRB(0eQH$lۋNljభIQpvҠNԺ/DE-WS@4̀SXZug\ l(~%cp1{'Wx aS/P;%)Yt7Ll.,.#Si3U>V0o]vw&j(hwON}E/ e^) xҋ Ǔgǃf+ pYV~>v蘌dAngY6H n6 {?;؟[gm'^|Mߺ]vw`cgbwI9Si=aY'w3 +}0%Hb,@b젎H]~nÚ\\.4Cey}])fJ 0n쉏*@NVKWv:O:l̫pA_9V^ Y ܴ?m#c/zS݂"]U4I>5>3JBp[^NןVWqm_k'g[d`3 y%2iR BU1E|P,L;gsx U;w¨APV(23oFs"p<'P(H$T&G J$Чvr5J1&|{ >&:,<OzHr]@{)%$\LpfV0RS}݁CXA`ѫu $dg'X.,\c>&yY`"B$2b6"p RF!=Jh<;gWR-[{zqE1M2鹙; P$}^ &$@ĩD뉾yٲSzZ|h 8MeO =1x[ BA p:'!//4Eí}S3'm 9ԤL^C<=Q@+ׁhR- [ݙ - ~IޥMP; Pv0sg8z瀡dg?5U ޲&*R㩬/N L+8iw&v",8&+mʽWӔL! KyJD!I^pIﰛll&CdimiE9Sckr\bš3d8Tu) xr^\(1o}}Ls=4 $ZEkYX É<..pAG:dTI\xT-_<k8q/O]yvuBiQDP(f0#&MJ Otb厁 \B>I±ؓŕZ<\ 1˛tR/ûĎ#ϝ`¡7ߓl&ތD 1"@Ck7mR fĴL4tA=r4hs`o=Sxl{ƚn/0r ^}d6!W᫳'ܻ!o8)Ԫ ?+K"ɳq}D _NJvFgZ!|sߪlP-kȝ`dn2oeƚYbKw1 4BHY( VO%'oq"~Q~~f]OILEi~.jOQfL#7iF?᾵ } kgJfKaͰV˫w'~zVu.<}HUվœ d+km8ށPrcmA04R`^{_TN#t,xCiۉCP'n1=CIlg m1n M|u>M0e'ѹƖ窠ϸ,bBh?p8__*-)%luZeR l'3t|JcObSo`\hݧ)̂+xY1ꎀS]-%9r&^s4 Gx'ptB.5*Qaw ^^DKg=4T?Aȩh)^,^'թZ~R <ˆy7#p- $  Wb֣m(dKAm4ժ9؜!@ta =z\ ,yz J32G"uSq/&+޼F6EmKW~0w8lh%M"X0w׵/A&*kQ8}i!Jb8p&W }^A5fvvͦl5Cu>-b6R6P/@+lK@ApF:۹˗,k%wSYIC^-f ꠙnq fuR\ͻNJOXl*[^a? xE9z'y3alML * u.uE |"E td;^Jz+UJfx {ѓdO[[N,q% ]wȸM9g%$V3aڃeL1$aq{ 0gVeE뾰U?ebЍL=.I$M"QF5֡ÕD*ϔ64PimHre Ͼ_07jj!bۼ]y?::] ơM0!R$+ߊfb,]|1jV/2X FΘ(Pwn^/),xn']W\Olw܄uʉi} .ZMahE4FV0cIE2 3rFC5<]\uܨ^"(GJmWWc`} 懶Jؐcnu:#?. 5;rD&贲&]E:/},BDC՚Gp`Y)A#5|EșSMpg \ٗ!j]Jvrad7=r܄`_8r0;]DB*p{#@fR,^9]9tTnnx׆; [=1hvA5j ;du?Cv{&J%;r䖫 尦ݓLS~EoʯI-qӠWɸPi8ҵ-0ce#|Y8C+x%% ߰;yB!BB# +-hxHeLl'(4Tgrv |O@!:J齽tDh]]mvi;<:7Y+W9 U`hl\xRg86$MAK^JDDS/|5IuwAgfiLe]'6,BҰg(WsƴH{ AI07$|.bf>5L t|Mwͷ@cN}>,`E KyJ8]8)_Pn㊓E-oF l+<)lfPP9aDo<MI_|"\_`r[[,Ꟍ_DީG˸?B^C=SVqWr-?d~Nяggܘh&:j[JJ_lx5XJ1? 1O՞`IXVr ,T'Ma ∲J}=܈eH /(oc69TA,uWL+ۧW@oU5Lr$rՊQI`;\gWƖUvn:ndyԲkDՉϟ-w T&\!eb YO4˲u9;rIRV|ocI.+"}z48e<ɱWٶ Dh0x42CI*o_WǎV"|ER9, T27L4i#5I'̺s$Xfef4%l$1A-9LMeݷ8ŭTTIyK%go%#聶'-shhrb܉4 iv3ȰMh9&Cn;|ʨH&ڭwUXg}< )1ŲZv7ozR0 Jyb?1qRF@^h?L_, ! jVf? #JJlj$ܻnJO\3&7|s̎e; ~p׾ Eq\yoO7UOJ2F:~K@06su=o٭skh)&`ݳkiG_ .lNT2jWyb8JB`) 5e{ C'$ ߇L8'x}?Ym̡-LP1 YeUYI( #g| GKn(^ ϏFSjYQ` 'TRf6mkBbJuS %:!G=x~eTF=z)\ aV>6,ѝIGH#ٓU\S8?$ YWH͝HfV \[OT&C5eC˩݆v՗@Hw"ApLU}OveChs/Z;mGRh_0a`6غ5epppBuIM?#O=]cծ.w};rиh^.m86;6'\ !u ŀHdsX*rPo!#:rqzW8v+P ]cW庂:+c.qxϽ8Ԛ5~5J[<7Gxt`h2+K Ag'_:lbV;I5XWwdϊcG.bZ'7nRQA{eǤ)BxU7ѐ;]ܗKeKҨLGᇋLa%!wdlOPg[Ι#ȴ ? ya'Ah,ڢzZ ܶR1_ N0ٕ4l(v"JsV,1 >o}ˤj@U!@5[)ɏŷ4\YWNT.Kj]ɋ朸èqjU^S/aPL_| m( 0QΩǧw=ؕW66ߖmT\" SOX0LZd =xq d1lܣ߫~0Gxc͈_"'[ X[J>:\-\y[γգ2b@-t|bQ(/WѐϷu|P`񇸽B,D%9'췹pmiB{t} sw40&),pH" i`XB(c(i?.[g%q4ow> E"[ӓ&!}em"@,G_ ZMlڇ:k:19*=-j$DS%{Iv~z4g&D9;r;!brCiG#`8I1km:y:6`6w|YJR.G/Rfl skX.+Q :?C\SZOKp5T!g6׹.X 8.ϐi!lٛJ$I;WÊ3miq(u[o%tnz؛֩4-("8Ӹ /le){a. g[IN] D8c/TEQ (:M+7:fRZGxjg _%W%: =:Uͯ^74&ဧBWvKIeӡ(iY$"ii*~*},Z)_9geLM(=$JL7*b`R_}gڪqY7cYLSPʐ cWtIJ ^+׏'gFs<z.) ~]V'7mse`[/1Ra8qyG8R㨧-cXh1 b0wKqz#]F(Ek)ݒQq@ɲl(*~J q˜[g\g֯DQ apUu%^k@0`ՓR{q N!C,\{z,1ɕ`( 0Q!#;@w !G.od?EyZb+A-iFɁA5_/@e #X="2 "fj(˯mJԥ~Y;+|&'g5 X{dׂ1$Kh$ , kn7a{X.\9v zjsErjFr{{[ c42"qR͵^j>FD tW\PvpF< -g`ݒ o0y;Ŝ+AzA"^/_rȝnIf >._gL0\QazjZt a"Vk}ZNT_b{mtm`IY۲V<6ڿJeW)Rj|uf_en[,O WE݁/DEª3CƷ- }L}|A_-X(dE> A^)!,:/37Y*#?uO'b"Jd`gV" XRt61N!m ڟp[.jM9e>T>֒b=]֋-G45f9MÈlB2JMf^{Rds}^(Z)/_MMЫ(8,}=M2U&Yi.,fXya դJ&9j+}0xNuo2Xfñ ί T "/d[ql(̫W];O2>GzMu!p\?}T7KqM#W%eB{DRZtW~wpO#&5#*X@[ I;&pB~#<(#{,l98>q.r@v3qWI`T.eN(Rs_|a9GªNJAn)e7 >ja6Y]dÎ DJ.cyhn&@2@X`lmWL{N2\}˄t7 &}#y݆D{8E`berH0 pX  LTEӼ7Hv3ewgW`jm.+'6.&k_ay9"n {jQ$~>A}S5H AY'}(9l,;zo/KCq+r$)wM.ҏԐ òC Ǒ&V61M~7ݬG}4?kSJUKbMD#븾qYP}8Q}Fjp }6oCLԐDž> {"Я.ǧo-J 6H72IPCCR*,->POG%#\>d]Dt Z%ńGOq"=KabG+sm HȺhOO(IJ݅dP"X%qlELM$pf6g@G4>K)Vb<+\H*mTuu2Cw_:<Tв hpl|E=2_)}-Ă\ՐCc4=Д2+S&M?%6^$94ndWWL?ޓco`!t& $@% Rbc)Rv %շV7RێU{X"04zkP7`!(~]_rPUB0v aLj򇧃@'9MҫR#aiTH涑Z?ouU u(H„rt20ꑭ;/"5'jD'ӥȇb5DX!ʿ7pZEӝ5mNv%mu!!ˁ2IweuWHY8J9:oT&bBU=ةmcSNV5ȦZ2RΕsO~,/Hxa_i0TKIrWI%֙t`+ u); \i} 3RಹZsVGCQSg>8/cQڄK%\?D#ߖ3剈FRF \Ht;3VyΜI8 GY2ğ9MjwOaoBE?x͇>ek+o[t7Jo(!>!:$J&|R [$%i{qM?>|r1ĜI4ER)Nw>nD 0I# Rc5 `3y5ߺh g20-IY9=L(~3=>jƹIxBN<NL ³` UM%G%x[ cI"bWrQ{^MؗPLxKʠ=~ \QEtEީI5n7%p1Rbg[`_c*}{#:&Fg~^jqRa`ȐޝM)Ծn9)KE'Y O: kWY#I Y{#&lX+j, qG/zTi3D>qsC B6TDW/fQ_KB4:o)=btk$Z:Ͽ}u۲#R*&2%p- ʮ%&~7o;巤1j&{Iq،ӺՔԏ{CcOH3A!5A&iglz۽ ==J A yvXW= ?Lס]d8+GHYEZ]rtTpXo f8( Ox"޻>sH^C- fIrbA/mDүtNޫ}awubz2Q[ej|,DUݴ[ǢAUsQh8PwB3P}zrj; ~5$*QpLBiwa# ޡOzISh<iV0>hjgBuRdP nߣS¤&q#!QN!G/|mK>:xx{w~&슑VGY D <%P>,rED1U 6fG4 $6NvŦr0Y}O1м}bT:Zz H(8|SĴ1lb$x| zZ`dM=KyP-д7U*w4Q ņĄ7+ `Ӽi?'mg^::\Lф9QwZ<[&ɃYdQ`|K}VωМc?r;†_i"};S:^{d$W|M- >J9l;.:zjfI^P|.1'^#z7GzW _Fa9SsJ`zQ*OWM/!+$[hR. p"'CDAydD2?5Znm0%$W[Ƥ DCuM|{'YW+b3ԙi`ab g]U(ִd7TAGw>7ppMͲfĢwu 7ԷD>KŒƫԄCkT^}b,e5%oX7#e{iM9JP3}3z qyHtKs#:L\ c6ۼ+jo*]<<yQ` K>%O J_PEa%/v_wPȫB("V9M6eI}ՠ̝f{qʀpgw__B_dAAHQ;\gAտ[rcC[U v3V<:uSV'"ɃbH]p;"d? 4Fn-?,n,$XNdJ+p"-ZoɄ > Q`֩TCϼE'Pc9 '0W֭ ycs5JB5rN Jk"+V㓴%&u0&\U,O ru; kZ ~*Ust0žf1L@ `u_c?$ ;6* tme]s:&T[t:9yl(ʕSy52i(mJc0TKյӸn9LfSt9Zg 6q$b*Ê'WA[CQ+ݭ6սF(R] +EC'o }:ק"gNhj"5@qq5$Y%ۼ>?3A*%LA$:i]b h8`^HԮJ W/HQKO_>d=u dϋhچ@V遫aM-dBgbZcgVjKOSeZSbbÒ; wtP^Me!sP>![5zP1i\^{\o;Ng8ڬԁ*t\P]*E{Z_IAkS'[`:Gb3wQ2]1,/=-Nf8AC7kΏpsFfDɵoԠU2~(lUS߻g(i݌ucDyjm_y._hApeY' ~^ƿ]+)2H݌߿~P/ x8~,I`ĭ\f$1yTZTs5Gh렩^U/GE\P) CN#2"TSv+$IXCh7-4O`M8C_ }wp Zܙ*d]/e*]MfJ;~Ū!/)x)WWs홶ұc:jx5TE/hjO\5Im۶2)LdO~~ ZX8gwcsEo:Ò%c2>&R0o! #u@%L}Ϡ-x$S1v,PW pTfO-B5*0IlU.G.;QVF7,b̓`!ͥǫmg [`ÏIIP7p')7D۸|wM r^ }%J\־ICD5Ӑ;A,0]O= k&AHBR/J2F’sXOqq(bGyAuU?UưP -,ߠ 0J  &xAVN'ρ47 S"Xge92PB+}.4! U&6đ> d7͕ UvͶ_hN2IҏJTE;Qa[ ,"5ve~#Њ˧uI,+d'Bv}V*g|q(GsRz#,_c\jR%Raꪺ%> > RrT(!ƶolTktx-7JFF8Ș8( \`1CS𖕻ǥe_$Ά[f?/|sۗ&MkCXETɫ+ / ~ãݡ} V:'kdH"ԄQWyULcI֜Vta͟LQ_b(J=l͛%nK]nÇ *%﹄s탴d%J6{ Y+b7 3cIܻRyAĒVVxоVQ$kf?%/Mw6ΦɩmBFӘ 1fЗ.aVÑͼ4&')GL@wyEq qʓzR׵.[ГZh_ץJRCӿ\%2~\T:$DZƛ;>+(hoB0ɾ4"zm"Bo|p" ݠ5nT]Dk߀.mlp0W-Rrl\;rVrU#N|A *;Cos0)(sͭ;i`զeMJ=4vjERS65 RFBkP]S^cLzǡ!Vt}ƶLO<4jb~K u^8 U<¼PaLM|hARj: iUDХ(҃QVlMkʮD:ev%}I¾Lؔ%OI!ߺUq0e!],BxF6I~C#!]6Զ-78 _“IgbQ,Dg``yLB1cE݁75.E  t@pOC]R!^6gI(E ro,P%g6 '7 a8u87\?H$>9lȣ>t `1Dg~%"^f 3H0/hTϬpXXRtG\^{}8hXشK,gkтR=jvm9ьQ+}AoZ|l['Ȇ￘ :K3@fAM>&Ke`-ɉML"RBy40 TCKT,NC `e^IzQ] ]$-!ɔҴSrr+$}rzxG7dZ.9 ^9S_(2P$ҶvгzF)j\E5$zK*zFg6 t@k e-mNd撜%@W(#|<㇗ Fjā}-.6E ؿP͗hc!UsW@Jx8 Cie!r|a/ Hɨ~RQ hcZZESxy}e mHA))zpEWBe+-J= -ct ~&o .@m4]J_1E6-ec|k&=N' -uo1 ٟ|saS{F.Q`l 9Yl'TiȐi%Ep;}kMhn\_{;Vr~r.,~ qʸ$ͬy0X=v8{H X^jM_$zlɥGqKr/YK㮁J$b&98}3 Z13db_}R_l̤\)6"(gnջ5*ەH2Rw%֋ې<67@K|$وdm}B'\x!P62jن91d@`v76MluY[=kkp=_+a I<IJ 򛚞P;dba A4MH,S|5skZ7_v6a,xLD໴uOB7 ^V𙶫qI/&}Fvh5*Y(JX=5. I]ѱ]V^"Qvrhob)$.V=˳Ә+xf‹C˂Ƙ~f2V[^$,Fk <UۢTgy,&Q"*&us=Ѹ\?U;S@qN\$r;q#w%K%} 2JTH $rpY}v\/"$8QNp'XL5Ӡ+Dk$Lqovt<1Qu Y(Щ)p1! ޲j9!ܾy=T8ן LLM栴WB|ɳccS]U`Zlj2#lNUC䢿;]KoR '?GZuLv `IwNJHyCn奨r_讄ٸ;O|Ib{bLE@(j^@KcCo\:^ˑ5 `qfb?)dKBԺXâNUWd$p.h@sY2fĖD3}Դ@᭳A/9H¦^rc3-暥 Nη,8q] ZC¤ _t^Dj~4:/W,1%Y!. 4'JQVT,n!KԱo4벼ݮ޾ۂ {RETI7|!v`1ĿF<8#|Iz7[oEtRVҫ1HIF\.L52O#"';*|N{x| n㍜ 3xF!LOr1dqx?[rO` H ^AW=ɭ+^]s?U(wH bB#!Mg ߡG%Q$:f|sT=B+5.ʃ jI3WDēS4Na UepBjlw RC5SB[3[M IϫVYi"ʽ9*Eq)qĀP}>Z0X)ڀo4Q'0!_q\m8!.KxDAb!do9-O`Tt' (vk0{:2- b2@ULǺ O7VY QnMĦZDrQ_78 ֡l߻ LCi(nt874R8R5|FKx^h }(5d1ɪ8O)! !~uC;P_ߴeʱHUZn}]fF *֪h#ĚMA9$_ % #y Ou(`o^h~ 2FFP#Ԍ(V4O]zt? K7Ǵuo!ço:V[1s +x'*ӊZT6a[wdKGM!RMp<ӐOrfNW/Rbvrxj4ybN'_>k,_.,x|g9ط2`RC +;5=#jA:3.\'&`ư;yF$Y |! i2od&:$ gnM'<fgA0(/.ڐHo뗱i$*5?'R\ٿ`OifP-<$ɤ;BG2J4py亏[;0z^9WXpםM흣nTiRQ Legb짒 uGJ9\A "(F6'l2хAZK)SU!$4"-_sKyZ1f榅8؍&m̓g EPlUO1P~#/^4#cAۓdkBTai5%&Y1 BYZ/5Wf1h)EﳦX/Ѭ֯( LVQC ]l EQ/խքё#}f脋kA뼽$q(a* ?_0$hb'O!6u $J7ũ!Ts{&]!z +ߎ|뽼emB}j̀J w=ճ3Q~x VxaR N' &6&w4]ZCtTry;S 3s'it}_Ff娊V5q;R>BH<瑽*o5Qw"tۍϒZI:V"3 ~=]qNo/_2|LϨ"{?suZb %,F{mk2KWf]ɼ $Fb6G(8f(\P̀.'z#yT]U%Pt5tJ^R*г1"պκ[]?ʺ5[ EJAb9XSx;*:苖9hx;<h }ԶIrx=>%Gwo&mj0>/e}¬Fӓ+Q0->8xMJ~wBMp_96fR ўEz = .ǜ!rR4dt%UYm"~G}נt9 NբssWmKej/ rPrf7hka.K^wu= ;0a OV=O]U9RMEoJ 9=WXN[*_2w\Mc8h{W~sFa9g^C<BR,_1>i[IgBO]hc2p4&\"*% ǢvP:{k y[Y忎>mw3O2?fbhV) ^&`ۊ@;{NFT^&]V7(f%G.e7v&UʬIgƝ݊ɛ@ ߡw.ȉ+G_ȵ1p } cf#$:U:QK,s l:p /Y/uۯ4H\.;XhtB6[\k5Me0?$t>=8me ۓ̘@fԇɍkmгeɨ~S,[iEgH0sZÌ6~0ۢMcpR8D}dwx4QQ9 hS`,ps=[Ӯ!Q"]_~;E#f6 Y']WOUgN7"1*2Ѷ5gz|X[1/0Px X75w5~JHjBVY}b׏USX MAA/#wh%ߖq{d܃44Ƀ0ܔ E sÛOkTGy؍-%ݩ>i:ftL)pNO↛&Rds lkww :an0~Vy<;byzXe|ŕxi3tv98x%Z?Qۨ?~*f%aM+TyjDTbv ݣ}g[;AMO)ʙ+x !p=$VY_oX%t{]r噙18c>̰U0`g~,s ͉plgWĶZLHEvÎ_p& y? ^8{V!(mD]8'B$37M\]WΉ7@yIUhґwM5L1 #dTC6ۂyչmJ"ڸ>nO\EYl=<>ʞq5G ZmR -%zi?ۮ_(`w5 e&jy:-aHO'|ͽ?So7;Z/ vfǑcA#Yeًغ|E2ԄCeŔ!F=l >U_$}* a?SRgolkx.AfB$* AGٌ<"%Eѻ Z D!-Ʃ?˾N\W^AиX,;+M62gDҙ A֑l04Xx>~ AO /"\=@$Sy]Sp {c;N8\ Yy,h(z/~ũms  >}Z081;z}4nr@)ɾlٯee^;6BW s^ƒLL2oFo֩ryahZJJMõo@U⦄_r35Pk+( +ĕ\e#d6j=f1f= JֲaAbMIVZ 3d(玎ٟİ I\ܤG>ty2.0FwsVsVM1ۏ0^v?(iJ Q 뮛> MfR$BZK6lL q~fဩ~q=l9K! m:Q) Nmݬ%%0}M>0f0aH|M^L40ZZ!lp18 N,pwiPyJx,i?.R4iye vSJ6G?={ f zNYHD 9Ҩ :~K)ɸOĝ&}=G* !\<|:!j4Fqb.] ֏ab< qOljO_uThđ0czcYL`ȇ͠  }G)cD(Z81:Y6ў ͛Š[`^,:icShWVEr|Ǜb{@DZ;#H2 -©5.CލkTn-1n'ڸкlN:ߨ.4YlI |w OuY]1ފ΃37ֿ9 I|؁D;2"%+CQX=rW3p-%4ڠ@ߪ< PVn2>*N'wuO^bHEص)Y-aS1!݂ IܩjX#6M PbEjdI}%  UMbV<Q%al!%I9BCbQHUJ`TQm )andd'>D>99όM [>B- C!ߩ63Y[X;1%`|(ko%'{Bs]tBIJo_!!/SM:$H0ˀ)~Nu^|#ysii}6g.7.uչȇb~I'w= W~[z$,cQX&0aE/3^ S>Q{q5n_ k:ւ-]Q3/r$xP;'=ouΛDY2Dhw>(z\-Npj"t|TmP|Yr;͐U'=yB I'bGZ(s:`3 ]nPv+'Bur{͞#2)d Y'14 J85,jCԥ[A}hxtJTŚJw܀=8.]y&~)6yV9Ȓejť>hwD‘}uYE1;[k~tlVV6d(D7Pw4: :9$=d|a6Mw^FAUm2c,K$Q򍿊ME4irgq #JI5cJ[/i~Nuy|qgQ ; ?7$]M/W?:ӥkkTo%d|-@R?Kֺ{TOq淥|xVG?۲;5;A_=hդyJܳhщ;>mu=ʾ (*&QǑQ4eEz1p$d<t#l6# -^ i7=̧hi}2!D-S_5dzܾYW"]6-V)W9.[D{=A15W[J$<ʲGk^!& W̻ػ&8ྨDNbJ?(<(b.*+: ײ+<ҶN3'_1HCxMRm5OQ W e=y@i+7z4) $aICV 9\ >ght/3>>.[bq#iq̧R}$za\J! @؟(..:CS] );VU8j%j>c@wp ZL:'uv`n70o;Mp_N#C f nZjSY0iv6:Ok_:x]DLN%;"*$ `B!U8AvXIse*XTϹ z]6p&RkYòE:T]Dvr~0Iߢ8l 䃤Rr@_.-APLKo2JzR)gö&z+{"b gmvM yR6(8i-l"xzӃg\ՙ Rܼ^<,~ ը4}j? m RHYFܞ䷃Q#x[ 69nǏ| zWGuUOPs!#ߦY$F9P{z/_<x?oAvd.Yb`KœᗑuS58qֽ3r$I,&E8/gEBW:hF>V,{}w(]1Fp ٌ5%=\~$|Ivrpy!%?eA45^ +@$V<zmzaM hkR]]%A6׬oͺҟ% K\4*'S{-1,gX1@,ƮGld.?)~RErucN:,1]/޼a@Os Jx埐NpɆߐy]n# y>Q9}W nl$K_^I]Ԓ,i`qw]Nl(b @mŒä Bcg>r|$-;os o߹Ad$^aI \)?n!Sd9ۂlk{y8\/ ,У n)(Z B!k¸+t^,[uqҏFmRTf ٖ!nEW< 4B3[|sAhK NY\к1ZCKoA&VT^cLAxq [Awe`d`KR`P9{nX?v*l_nGדAFb^+٣aj 縅lU1$qC a4݀0b_]H0sHV1RLm y*%Mh?I2|\^?~>CNޭ!)wwRk]׆Z ~+;4 WzhꚖ id]l؃*ݪ ?W!0gc [~UHpcG~Ǫ0Z`-tơGxl@cZ¿B ^E1zi=]r1n'!svJWo\xz8aZ:߮r`uv=73@Y˽ۼ !VW"ߠG)yF϶09ְKAE2pRq" VQ}('͆(Ҩo}gܚƗNcq(bHH"wʱ503=.ᛴ\sN^mVDD&L\̤/%e'/lDf آd G 2t[-". fS4q)g0EioDeY\6Z#Կr.CXG$D+4Zpj}3a Kz68vM"GitW1Kq<QhT5UQHBc!÷ ӅNŒsQ\,GXz?1@Ca!MoUo89N3d3X+{E$[̰ z zd&=B?`0eBa|DE$p4:NsUvBxnlRV)DS+ap$e#o7sqjmmGX/8=}9N-Őд`)Ol~_ײB'D <Ї:[t "[-`oF4`V?8%0 ˒pBEQCq&nְR`$EU hu$ #5{aioIP@@_It'd&ю8ҩKs:w/ iĐqBE^%JQv_zb1sBLYxZݩ*Oq%O61"B-!n{"1Pѵ4 >w yZE!oxy?Z80+ʺuq聼MԜpk5b}-yl& y6^|1mD)&)'U;L&WNnbg\ڍ"H,:WSi"hkJʐg<ݔ vGX bU' //^yԁ; }d?Zƅ2C@pY{8yk[5xi`kJDz{4/ݕ' MɆY$GjVboV@_d?ʋllY?mb)$'vp筯AO DL>t6$>}%υK6VE*OؕwΡg"l0)DNF%7^.RV;|?8YidG&M (&v\{p(fU@Oג[uhV6 V]o",BtE8j}67E3Ļ>林7 [Xj"_YXU ?QϽC 5@nc+T<ADü[4OgRHyM^,[ -o&Tcsy3./ u8ҳd8:טOcX_^eCSÿ_+]_MsVEƱ+L@oH:;80|(^ } c L誩Z%EZ^%1'P:?)X1Zm x[ dD3IV6ԨB-ĭ Ie!U SYW,'\5wحoNPoPao"gn',MTCi|D]V%"+z ]Q!ωn!3UWG׷e rW%K-'(+kHXAھМztbH[@k;d 3'34](@ĸ yUak!eNӲ[ȶ^LxH5r팟픐>:hd$ iuΈ6D L&ܮEA7P-:r`pTj:>^=~J6_U_, #32evE020T:*iYTOM@T,FwRhl2&.NUj N;'e`?hQ{V HU\:F{x'VF 4y³5"f8!*-a2"!:i{FT(H$[CzKqibA#g([b./LhXk7ps~z;jaɺA07Wi隰*CDžF嬋%fz=Z;quru@[%tgBCe!F>blGmqE jpFFZs6[f\=WkCB'Vz\J)I 6ks0TGB.` Px%oSqX<?v%n:Wπ9ވC 7пm(u%KTI3^|N*p5nZބ[$~:=Z?Z@RےLӆr5@m32n.o!a^DcRwӖg):o҅ ukyZ3.}llD>a"ϿgGxݭՙJ'gv*s".nqE%^Պ_[-땩l3IcW<iMY؂tm7Y*. +IyxRn:|VKM۵(R-CWY&:Ǯ|anʇ]Ջ%]KY[K|K!ߵd@DºXKt*/_Xxlk>t7\b\~+.(>k%<֏XduB%^{֐Ts4= /ӔN!ll*j\2Eƹ2 ]jOXsHYTִ䶼taFt{ FSEe'ۼwgˋe ^.-o]\r,xB0V#_>!/>sX ȬCx >K~g"K]nEeg҂NLh\vNicbU+Vjk$@VP}=;.S)Z70e=xܬ p,ကk?Y#ϝPPZ)R9 $ ,U P?},i78Cz Đ nf^bI6ZA7cУ)ԖOWKZ%Kg_wpj$<1IKP%dlCn?ϊ@z Vu敲`\arb?fƦ_M!7z"?Dy^8PpxʓAxe@B8yQ>2ՀU`p}.T#N_Z%PpؼX'~0RS_~WL+06m]nZTm@G 퇅ޔR* š l|cY[_oM1:}#~g ~ITp`6_ʉ<l ](x)VVyc "W<ZoPNzzQ H:Z@(NOnӈyAx3Tyl%g X9ȏWm^yT~ A]>$H KgG_/de76xD>$4wҔ1 FZrՋSMNLnouHF`BFh6YHTqӎv276|KI2DfhkE r!?4k)ܗ@rgʛoù_(LrŢ-_gt=B WĤd+1y`1CAX+=o˹>0ZidaZ!)Ա z g-n?^ׯ\ۢ?/UpCY]\3ѾV GD~-Ψ-E4c0 0YVj~P߷ٱjҦvPyܜ˅o> XLBw0J`&dl=wpyۚ(X)i\xM޳a|yzV2=o q&K%L7@=Nx6gK bU~J[詃F*EpfkdfV+(k#  ;eXZ&1uVmPs=6?n'9Msg:m%|mok6ٺXwNC3-tu={C x T Z^@쪍mh{ 6ḧQN ЌV ?Nko-Aj"kfRYue+ 6 ;,ҍL٧<ݯۤT=#IOE楶zKW[LpEY+׬uʭhABhb.$FBN)uv[\tA*MHa:&+΍ˀ]l+i{,*?4>eр?v2JB^6W쓀i+O#\ >X3z7eX=טĝ/ b0lJ_MsT+]$r|kCP]Djvɘ;VZswU ZXq~90BԶ =^nw ڛ-LJfL[x/<ۡd֍ (NK\2UgY)j=}@jkVYX9ﶮN(S~٣c*EĻ^ӧ 8SldԆFW;t֤VmE03Srz; EAR C%jd'vS܃ρH Σ*!qQ*^R!#]4 ĸ+zUa(>he:^ oK.Ҭzo;~L g{1@ߡYHWxl@v\)=$DYc17>GKÃQhUCzC1~]ج)c{1`ŸOdLdxrPޫڟ=^R@`f)Ҭ " 4m.-#@PmάVBCrX ]xQr_X+N&L.FH|,Rj0Co{;r} NFb͈~BjMG}Փ/ >4* X5՘ 0܆Q\\VGZ+"#窊FGwiX5XfZ?7=dVAPq: @}UKt:cR,dǴF!I;|d̓/yֽǟ{EwZ #vU H! E;yy&/~>|ڲОMގF7YWucgEķLQB-rP(Ϝ<;&S0!wYFvbFBC7W&//N;wylEkk_;\dpХX ?}3^}HEfff ՎU$(A-Q7}e(R̊xtj4\٦'?,yu8KN ֎[|IukE4vY1=矋C#MW'Eo rNM\@E8\wrJK8okЍ[QPn꒹+_f|NS%`tT9F U!@CM3IYjZrm{~M 5bZ>_ax BvCe2Uf떯k :]km>CuG :w y8]/ ) f&As1h E `i!f),e&B27"`f5Bz=[`L*/^($|ᎄgaټ>sӢ<=bN… !G!3iгWNIjTŜA^2E",kͱ ҰvÏ<&~Xo -pاuK,Y~P㪬Eab~ |X:GDL˜@2-IB!;[bnY<:] P~L2KOVhGp&|ͼw$9'[Y.zASaEl{jŧ5ۄ3|`}+.%}D.S)V!Iokmm5J*  9xL$݀tLjĖpǘdb%-&f$K.-0]*WG&rv_B`E?'uʗ^kj-7afkU㑂UȵSD s𬘢E3KQs"/js,s AyY"F4eDcmFKoޣ"w"9p_C8F5{xBޜ[#kGbPՓcg\YD̊O%Y&2]ei(w/$]LE\ $P F5k/ٗ^ -.M!?ӸŃ'{JD&#{ONNl=F,ۆ{SV&l!rD}Mi>`^ObֵI0 P*U>)dTBTěrWGZFL\'o;{"# }ϐNb[WмzN&3W3g ],}ޒ8o/fYd1i ʼ8;[p[`ȯ2kՙhއcʔ/"~"?WC@u<->э_t.(r!VuHwYZs`GT `[ڸAa8,EB7>(C3Tr [,p~aV}V-o(ز7I3Ku7PNs! PNHZy,GЙtR;wQW.|lm3hI :hWc؝ v;;”'Fm p5UE- K?Wg|yf*Δ;R9DJTA]m\E) ^5^A> >YWV@ b4u: R^޵xX><]$dAΎ&ݻh L- k'΢VY. V~=段ZWhvJW{2u<ԙ@>İiтPƱ..ˠN6LN-ҧH#u;+D. +jrT3n1F A8Oa<}0gC`Lv6&Z36mX0Juwi8ֻ3ޕUpg2=L\ d@frG~4뛈i_x1ӫ[&V.ij̏3J;9'R,{6`Kўh\уUic8)O,y=..;ψ18\OfRzD((tuyB&!hNTXʻ?'[IK׬!bQs㞛Vd$rk7 kdY GP@Dy:oKI}*CrA&5{Y +ɀ%b( bM1p ѹjw+_R pcY??L$LΖFbt=& Q+J:UkkD3cH W8yw"Kh,`]px>2kt~w']i{}{8\bx1A\/#ی꣪OCr#(Q*^_c"_LQTsxsm:^JCE_v&N8buɳ2=|flCqNOlw\[J X^EHDw_ʅ0@V1<0q+çY`RR4r<׿}*0.v[\xfpFG2UB21$Tuqzɒ0JR ]/G=7A?CH͂dezG*xp7G4zW80nŽƴ@" I§8>XlaL2Kւ4cq\1قR)U=ĭ畅E/b<[ "V$:'  ~[ڒ&Ÿf=s:m&]|Pr̃Vơmu8R&&PT#qyXϷFOGi'3AS7So}2,{5MZq%O44g`C

?-Y/Wh nn0I%$ kN$}\aKG6?3X~fn_:9-ɏ'plyٞkYBL#8 %CQv$?Duj#ߑf$&ϟ!iiZ[g+Ի\@`^RI߼fF-]Jd |eQuMqoF7{:Ead787dȍg_%!Q–d~:k$D>?W ?xRIsD_%6|NG tdP> wS=[QHԷ|^yJ>#CW IװIX:MCx׳F碓q&616Stр:=c]C"+ |8'ڸǢW F՘b{Vq}ŵū,u+ A֡KH! k>R#wr,Gk1`rHs4fnfa]%4r(O]-,9wM$)/c6(˗"awN v4ɤBU蔄u+ J=M+y^TƑڦaO Z9E|tp:ڏ|UYͲ ""cz*"7$u[z FDO0Syfv{hR!P}yYiGޠbԡUD( }rhʨϜAFs [#{ >Z`8)`F~-.@l )5wuQg]eŁPa [D0uq]C(ҁ=^oD+h_<̈,4 &d2Xi, vg@~).6@OvcEۢ|b.Wq$X!P{g|˃5a 9U`jsn62j3}놽3p&{M¾}Tqe ÈXfgڬxjettU/Dm9^~Me@0zq̸tx1puQb.9#8kNz.-I'3Ҷ{- 8hvB'Fp:\wWf4F ;bTPJ`rwf( $?`tC4`7ήK"۫b+nPqsol] wC΍7'PnUlXxEY zŠBzf85-];0Tx7#EqбUp$xJRVxc$|F3;}[C(;مQ~|1 -@Æ$ҶҖSVQ~P%y3PyD/'-#x2}qSÉ{0jٸ~gsMFؖ'ɩޞ) .-8̕yg4EPKٱv2:.b)z<ܫi4ZbЌi WQam2N𰤽;OM+;=\;{t9gۇ+ጯ=*z_k_XѾ [8R4(ا"/)?DP!N5d/-iCl@ˍ2 ckDQߒWk9;tC YNwght+am * zn>rŬ$2QEGt1t-J6ݞCsHM#`{2QɃߏ}격'Wǐ5'ܱ8$(IREc p~Bl'ʷ<ْ`zlTR0d< I|i>#ؐmp9Ua$\H(BZ5c2b' :,y7odԪo4c߭#|DT貮ttl{ 8KMW-8TBjfJ*_q$XdYiǻcƖApL~$[:(&1wΪ ofvpZjT*m4$|sջ]0rc۹,qjETlǖ^ WkAcW_-7v|͞6HPf@ fסrRU*qYF+'!fd.{g'bҖHoiB&Z/KNmP|l*ƻ-ϓ.:fQܓiʤBUdy|h6-2"U֢9I{!`2xpAxW@BY!kxjBzTJ4$܀QF8eޮ@éG+W3Y  U/_5e b"tm?)Fg>깫=L h%DmC;/ddF CУhdow f-8\.ǩOVfB6Ϫ ;2iDRfR:&ڸ\Y]9 *OF: z;oUx{#ung8ɲk#T\g| he~In2ڍA~Ukr-fl2l5`nmo,)'>0)w؀zfg0CSDZk6%`.i @&h?@III5x|/&u\xdPYVT?-5,OȄ|X5(e[0lT:Sߣ}sjF޾;m-Zؘ!4\Ira#Bg:Kh?XW6 ?WYm{!0zQ357B~:@мdNf^ ӆ1E7_ uk@vn2])Xgk`$%|,ݱaD@\i|V9fk_A^ҏӧ։[e8I5?բEWT%6uGR">PL?R;Uc/rDKA9U2g( s}ьΦѾ?Gb,ǟOrvz= M #Qt ;:?x i4=e)RN ~tOeucghKbrlՇ?x5\ֶOo 5n漶h7'Eup샒It:.%W_+t|w*Q̺/rѿQ§h)y?ϘH;CR,ͨd{ٲϻz (][ =ѬD6jeŃ;\GaAC")B+ Q];n;d`9Gj:Oɼ*WB qyJI;KA^L?JXN6/x*'81v$F4|^m#~ "Ƨ@߉:8mP QXрmK=VXfӰsr G \E8֝H8pPD. [o wsNi?Qyز U_`A#{t__ z&m<L6; (B=!1" rbz7: !)qv,nrEKy,ǨF=>_G50Ti  t^Na]ZhQ1&Ng!> /k&NBXLsP`1U\M&?ͯՀHl9.F@7g>ɇoN'>(i|.  3;cmi M&Lyͬɖ^SsXII5pK#4KCGUXa'l'bO"U=hDKzVanSp=2 6}_s_%`;!uqHPQ{カucYmMkUEǡ4w a CR(+2rBO^bpo8eޯ9}~eKħT4 F#}: -]s(xزX(D.8hj2U($n7ρ8YϿ pJAoNwwk,<2G?_EoFgUx)mAgVx@[?<#Dz$qC5B !;<EzlBQi*s!Z;AneF,;(dIRFS؃2,vO+?;Ygx]+6-e硲UTr]%FuڵYP~uݭ^@Sc^oȣiUW{(#L ,g_AC8giQs@ܴ+.pұ; 2;&8'2FM=u{mwJtap%IY!$kfq\2JY"k7'"pEe9/@g8Fhvm)jc ̍xp_F-:27T-ɤ@շ{y07 DKG\E +5WAA|Bu@ m`hC _d{9K`/i35Т2;8%̋ ՝aj+LxJ}2n5:ЯD<2`3,<@xvY^84oP0s1ޘ Q>1=aQ(vtZ̮WQf kWqcz]Ck.h XX{=8ϝRW?m|p+8#-mG&}:9_l>^MEsc|>;)8{co ,ثK=,Fq_.{(sqhݓ3cS!n v;E'LGy!݊ z -DkY/H,KH61iLx `((6nh#`p*B c~)K0)Ś[%GRra27@J wh{u exm5a=԰uEc>Tו8(&rXH=5'7s&o);}rD0ÈLk"ᇴh 7LIwߤF Pu]"|8?tI1ULq˄8`;#~H|2{ f0|#c ]+8J3qƲ}߹ψZ e\ h3=##- Pp+3 Pw؊`tSfivu4bwM4%I2׽X=#2D5'-kbIc۠m}҂F\ Q?x0jj|y~gbxyyvV)޲BQAp\g>x3S ZD/ۀJLi`f ς2LJ+kɔ&4BX1P|80n+y#oCILkf O۠WGVw+|TߠuU6F $"qu7Փ QfԒA7bY(G*?Ԛ~`0PI^Uܤ37}UFJzuB)v>V4%7TZOjR:})1Hh_}m># O{6`~axh/ p^ɓ$4eY<+*dҪ+]?nFw%YD ,A[ eYFƮ)lS e}U72ZNnT%^X)ȬW$( uY?/-+ao0e B %:Y7r *D+3:꟟†9}jH`Q8Mqi!X}iB<yQިCwӣPM({]veK,U=+9Q 0JGI?ϢW8ј{;.Qn0CYWfعzo5~vg{PO2Bh7aCi.#XlWצ5xl3gCk`zӲ<#1Ÿu<8FtjHxtw]1/NGsa}d:ԭ0qˍgVnz<.̩ 6UsumEdb c5a\7"׀F~?c%fBu.5$nd4 {G4lfGwftoȋ5)1ؚ`p Mɢʬ*5'/-x,vF=7ǃQz0ɓ.1{7V -Q?Ѯ5Y-F{[ XFS]pk5ܪ7HwNMR%[n1{g2ksRJx F/rOW/_=nDK1XJ" I[[~bA`Tƀr| [bEji?(XBRY!}HC\S\Tو{k;H~!/# g@zΑ?-¨}?7 E]S*juRy8J@?~Z3og $ dU&';Wp-s(x$l 90s7- nJ"ݾ=z[`2sDu~כi&.s׫'hjڶrl.ɝ?_J+bj[\C ⩆ &Ut.TzKAsɥopaF :ʻ}n &.737Cle*NaZdyfn,M^'Q+CLXq5I;ƯBkb<z,NĎ] _$ivi~|荈/Z3@cs Q kT>~kηףч"0J&䶷}O8g'TS%'A.)ZEcxx,(GxY)Y. V!p$ ӗ[:u {yEyn.GEOow&G/qLNYF:u;%)ʊiD)̱Ha(,}Wm]61|!aX QTidc]lS%lո, bT-*N>tgZ~|3-ԺJ$!OE'i+,/ !ؐ-m7cfF|:;fv h+lĊ@C[BS"{+ ٓIJ+eArb;FrӘ3G}Ki~8p.e$6wnYyn֢ >s'hHV~wM]&:,:n$b=3Ti56Qz!Ţ^uQKŤMQ; 0%GG*55J[qZMo5I[>eu^(73S`,P]' -|]{ .k\!0RbU=wj(W}ĝ“. rcAB_* 2M`L{읏`iʄ̫knPj)оLr"7l_ iF-oCΉn (R EOx,L򄹔.K]S}w۬p+ou{uh/=O⳯@0K&(zOe!uz䞝Z\ׯDUs %!4*EgS4fL=%ŞN9-dL#Txc*@6`PbCQ@w:$>D(3Mp,;8( Td+e~[S6gJ\m<*MVѸ7Ez1)23YaO7^L( }3JhBy D~vMXj >?;5PEf`s0* 7m3&u̶4ZS RQesH3Ň#5.|vO25!`3l74%  ec5u'sL$e|G 푙y@=NmnՆ{ϋY!k:c0zqÐB$Cc9G ܣǪU+m(],y>K5.K> lvOž`?u.V@FZ38*!iD 1/ccv![W0kˮ癃4"Ɂy3!_}w\_ @w;d޻TV[;ģ:l=z p6~sd]\òRn嶷xR2}v;]y<=_&*;vCm~Z*F ;#"WWeC֠9wsz@@9i굴*.?9V)7? ӭ^oG,]_d(  1#m{RglrI?^*{V11Peqm;xCЂK/<i^{Y"A*~NRk(Ɠ Sg\iSk~@ԔAZPoi_>ȍO՜]iq"+P>RA^võx+;c}-0|E Gu_01SOxR 㸻DXl#D24ڬU&Vb G~!juyÞ6TzK6qʇ;?-adg~)ĉR`ݑAd9 {qmu榤Ô77^*6NMH~`lGӴ*D>a,-0hNbvy3x] rGEW9őjLS0`)EFƸkm^Zuӈγ5ҁ\\No~i񖔄(F(`%tD l\mHY Pzy]oUv e0$DY41sSi֣;GvƸ +xk]˱?h;M 9c|@v3RXjÛZ-]y{Pw[FY w[w[,`s kaO|7"O|`<#Iۧ&%W$~--uM32 7r& eQFrH0"Mjֆk/!U:J<ąӋp~da3ø+q¼ҸeԜ VpԞsec$4y)07CMn؂`{t@L;-hxTs]VXfxaK%rPQ[|9nZL.'VWD3a'>]>h^"<&D ]ߓTVJLAƼ df xvsñhd7aBVvheKx#ɚ.i#9^NJftf' ȷτ q=a«N*W[/o¶9Q sXp0AROՠAإ;w0?ic ݴ1iH{Zĭ5}7(~éMG@\9(R\)wx?-{Bݛ2z[ŸPί3bZbw ]: aXyyy\ O0na!d-$6j!$5a9ac=)+LD@蝡.EXxk\ͱp+dL}5=";,d줎L3Qe ?z!|Cn-ל?/y"*kLMoZ@l'EQiRIdGa%#ԟ,E3+[UҤtQ/!Z^ʔ[) ]'[lM0s`wꎻ`f&!(,m1.Ư#q;9(i=+ 5[Mv$f7l? cuqmTCVFdkڞrrX=3A&d[? *LstB%/J:LDžqvҌE,*K}UfRABxp+569he=bt9jfE]n_wC5(^SNmKMB[ApkҸVL4A`Vb92+~ RXBttNggs^y[VilwT#pU';@qg>P UzP˓Fo4[V {@Ly(jܬA!:8`Ey^{)$"Bj|U+w3t|4-Z`rИ*&u&oݲNZsg}#T=c/椓DgJMTR%jRrML[cmH?^!!%Z W֎&K }4-H&孛nu2u $(e/OI ]h)T ض `:-GT4D#A jq5 `|*ϔ;%_,Ŝ(=oP`\wx%r5Bz/<_$\!;ip\V^" OJgjjue 1{ȟ3SY )\(6*iz)^xGH0LB֝,/p_-=; I<Cl:'bg+APX>+Wo _}l=(|]ڄy$ɂؠmxw0;0󾅂`Rw׭ e*1aн]Ÿ́LOOrn56G?@z,+DWXoKͯ!k&#tq,y R/` |ċJrzc{S}$l`! z)M> :}Cww쀪06\Ҳ78NZL#4f-Օ{} yf觳ZFZax8anxQ^ ݶ8d4:YO[HBMSIy!1!o;¹rWMoCfF0I焼0^l  7։//t-kIk${xO&O ;,I^w"@rCߪ~ :$yy0bt5acU[R[uHut]B;NRH-tuf튅.Rt,™IM~w ج`YQaFc=/PQ& 6/& &5&JA4r![e6|{/)_j>R֮\Ö3!j2x2La{oi=QK[vղI3ǁGWI}ZPvzjIli ;jgiwgz ^^ ,DY t' hb||A=KXNRHl("e"1}Lو{L ViWAЃ7&=UNUl}}z49*+hjtI0:,|=ZLlPqدQ^]>;$P:jbv EɛB^ u?gyZ1:<PaSa:IiUP+|y7n|“'3DKȺV$p[K`98[8.(+9x- u4G}ӈR+.q\yrǻ^A`aWq~$%xkR ɂTdQ(?Uf?cL4-\ZƑ,cb"gImg!f, жtI~'K[ Flqkp͙G\KF:iQXSs19*郣 ~(7l4DՓ JZj v,zϓd3H;2:zW Kc[e %%//]P~;t_s4Ҁ=t|n]F9j ò-,>#97S = kĒ;y "tԜ[PؚƳ.-_)_#8TU4r"fV@g?%^4!f-U$Zs=OzxZD>ehAݮcVE1ׄ])E^O,ݍ&+:B{M#V9pXJhRӊd2Ay?ϼR#o 7zD]IR|)o +t;AYAw~U[Ox>tzq0TlVj dZ S?.)6MDJ< OUqfa_xNM@"Njx-U$FYʕE7{ ߂z&H.ijrJD[֬>8jR҇vםtx?39uᶝDkZ[%?2JaL ״hթ'. A : S^j:fu !@ T +DO D!97,|"/kږ.sfx'l9psdH7mD|  Q-lRag yl`;zxضJfPl|-{ x Ce-О\ko 2!ML݂~u]*D!Rs5%^Z=rzuoO˹$FBm;hvAOy/}:0ކvr#۬uͧgR<"A,RoS&6ڋc0 TxK<$Tx~:bӡFL颍GeBn4i:5s醅vFP) HJFy0_nRKGa[3;K)!&Vʷycގ,ñ1UzUsizۉE:Yq\߻gDOozqi29 wl(g8}DK,Un>$!<gr( @`JRVED2lw^gjZ}v63W=о$3>m7{ I]^XDY| C e/&Gʌ pDYJxꓣsQ/1m!I.H}RB,8:wuS~LItLwR_ɝ-qE2} _q?}dzh_PV;9t;M5B )4Qk O`M. X.ńS8D Y>,7"IX岿0c =IRY~~.[Kw2ؕZjt$F_XoSO6j΄u΁49)qRj*q8m0/ovTdcp4=_ $޽o;Kmbd-dӍAOI_ʆ^zl(Aݞα YT[Qfjد%zvx Q%Eh@3g9/̭ʷ%yiAJjQZK4i21)Q/k#) B ߃inV}9w }СSlo~⽬!Uft ]IDo4tfZ3b|s$(jffj+mf _9yģv[34A'νJgPԮg G*}.Ɋg4/N>Y{|upp[ uA-\\O@e[־`| -ʊT&kNaq7Rg/l wwm: )6j-V6$NhqcB$ `b_$VX5xB&JVMSCuL)saS_$@{:R-^֊Q y1cG#r^m  <݋ˆ|JqB6CWYRe,]AEQtWkp'ەnqDZW7V#WN Q3_@gD̑EY ,u7VA F^nPCT^8Cg(S/^}>>+YN]>wADt(.WZy}XS+4SyzCAa@LVL}q.I<5/d[bJ!%A|4|n>bRVJN=+{桑C5"W%Jރ:ZmSk( p(ts1 zR&;p*J`,knI}.GdQ, CV Q֍*oM5}*=CgAY{^PђFg=p' slC SW*Y  RpIý f,)[ԑhG0n=S6(S/ C5ց1[ItY6S+wJsHUKZ 8;fRv:ԿsJ_:'b= ou~Īv4,ȿp˶PrWLRWJ~?/kSJT~$_~>[>DZD&++h)ӄ=(MZii[o.We?>>=ghJ9 TXk-l_{S3 Ό06&iaD@X秓tk.iyo v'CU\M)! xj"Z$-fN[%3!'edսvꞿ7z>wjxh{;ҦYV'@`öarщj)wmW@o.F>|z;1zQȶ>L+ $^ ^c60f~)lJtXx ~r6!縥s>݉SeD}/bdKbV7e~\f(޷ $A$68-Df 5 c~ l}>펰n\aPs  k>OL㦏!m&mrdYBruNsBLA[/~*ZM*fNi iHp{Gg1&N\ @ȿ*n fÂ4)yC@a@J4;M 45*fuׁ/:߽}<UH|J d-fnp&'kY8Ug-("5vȢ!:yns՟NI(%* \a:0~/jk_/)wc߶R:B<]it7.Q÷G#NdYA!Ov-(zbGLQA#z67fsF"'VuЏ0jʕ+mRVGlQ!&:e?5VB9(ǖmT*np\FIN+}^Y48Eބ ` p9Xs!H 0WXޢt!fl } +M,* sF1W'466zP$Tjdf;n* ϵޫ}x@a7A-pG@Pǻc{-h~B`ۚ[ hyG?$-g?/jf݈t%A[u> k;mɡMI֭ )J5~~NK>x`[l]Tt qa*yQ:hzh&2Nvsa2/?R"̄qD]AQ3n2hmYNI8F﵇ / !ķ+f<i6֦2@|a rĪ8F<yN'u!GY]8kSH3c:KFu›INԭGQ|Z.uH(Q cQ`~7b ?|+X:5Lq^DPԫĆw&Ҋ6n=q DYM fO6ZlďIz84J4ucI]eJ><bYBvߌbg x8UtDitv"+dW|o{:76`w~h_HMTCf~ ť'*U(?AB0HO-pY9uᰞ+eT9`8dDƴVT1yQn3VE@W#9A6HwV_s y/F=ܓM`r/˜E3Lj(}63V5N zuoZ\\/cƸL!Bzxp^ ֶߠC;]dd:zN2~e NQ1 C'z;yUBy]#uƺUrt|/)9񡧳dK׆Z#|lX"=xYsӞ0@m^JV6O7hdDf|&4ß/xnDl~zV]uzBwi? c^M_vUJ;VHAr/t z0;'ƥřL<M<%HD1@=qmJ~= ؚȡ"|#Δ|Z/y*U$Ik<0vFsJtta)'>Uɲ2.%ҭ :?VІK;kIۋpp6K+YVZp Q*o@72mWM̱g)#93/F_h89 v&HTLWڛzEO;710غ_w<2{FPV{^$W}[W#&ɍvAq,{6|ԝb1 vJѭRR&ɁG a2]ؤ:4O]T'Ģ;?==HCU.e& [HV\Zd;XA[ u?.Y$ <@LUjLA & "\( #e>GҟW0}j:D`TCx3_.l5ZU2+D>v{&@ 52H{O-ދ&r68OFo ~ߩt J!o%':qVW ,+tvhz3LIE?. /{ᗹD+xq.1DfiXB-@)[(>Tm1/+X %v'C܊sz{)7g;粞30C듫>/9uf>T:oyDq̪ڡv+m5C`$:lC?r3:7nZHH"7P}e죓qSjf/5Nז@1Bb C0oQPc"(!,{{#i<0J1f%{DfS2paS80`Y=& GGzAzg Ȳ ґ%bA9 L_ˎy 5u| T9_Q/lfޝTU]>ΕZf.gk$9>N?(ffAb(gПe -O{f\Buĵf >W(EhA.]gfޣ,2rm68o4.jf}lfS6Akx#rx'%ay*ڶW"~byÏ M־uvx߶Q-W ϖP~WkC@zmiUBQ%/sh,ˢ#Cfp9WZ9B$c@_͠g~Wo~>)15T0J-b4S1DVu!"&~6OEBL3Q#eiλT!Ҹ>_Wd~g;&oIv0Pp0E_ƖVR]Mt0V5e0704Oy4%ˆoD`\A} _D+LoѦ U84:9VDEpV}btwTS*F10KՆ8L]HoJ -N^Z]r(vMhRpț;)Ksm&&!B]^,&kC[4]2w%i#$aM(yr.3zr۟Ǩciv)hlsz~'V<(LWʠزw5*%vШGX`@crK؀.cpi R@Q"W@@ m_|_c3TXZh1qRRXBo|L(^#"Q<($">4g]k!MnWejvu7# H(@e]dg{^à+@DmT87>Q@s ~:(A%{4լ]6"welǎ7XEb'u&3ȯg`7gxhjL5OFm]“Zs?V=>>/+\G[8Mo=Bh!JZ}M fH$RV1(x&K  f`yPUY~O;Q_mп˩sWYeLEfѾ,{KkAg8k7 [`qlQR [U̹3~?K0gZ'J*}PfŠ=<\[uz$AՖpg”h޺n\aB@#.zQKYgd^Q34c6kV*r0{1>6-24'.-[8Ɠw޼w]5@ARS$сEhMU݆IxaUQ|GO3Q@yLmݨUF.|Ŀ檝H=kՆQAQ&)h v-6"O hjqp͠PW챶7R p-RM4zۓSR@> Dϲ\7LJEl< J's dSvZ̈Gp֨~J۲ q 6To43lǪ ӺߟuJASXlK'߀+YM9yC L^մ|G<_I:ut2ր,CGŀ=CQ>FTt"@0.G7yJ)+M(#4zj?m,5Y~Fx5w2E$ ƻ2Xk+\~| {Պ(Y2c*'&., "rG!A nM*՝,c^{} G)P`'b@n 9/ۭkէM\ĥe[hd<+U(9P=w6-sԚWS*0yTBTi&vIsG.꽝e*"RUAk &BG#J!AޑT2@ӄ|*OR#ps{߀5tȒWssGtPڏ(x~ջӓ*=)bD/q;gaB,2OwrA$r{I/4m; "1IΨm |7=t熝E^jpmف(Ω2hfkܙQҮ GI(F K~"?a)4% Fg[aSǐARkeH%,,`m/~ TIV|ٻtt3EbՃq*6φ,rdl/ P<5ሕdmcq)8`np:Ăuʔ2(4RZlfHxA YV_0?xp_ZZTDC9=ʰs>);2eZ[c⡩ynI5S.-mz3lv/ wBH-SoJu<>E 体-` gy2mBn'P;rP+eܾ)dZXAK{GS$_DIR?!QCZCgBk|N|V1BAg·+cd4! &z{[hFDw21ٱFnWE/OT ٬MOª 98MdEKY"n~xfSkAj\0Ϯ5pzhBᣐU?_mK#Q`"3 <ҪF#^`66df$Ys> ƔB{vk>>u~>74:US6!:W.؊M P78L{ؗMVH bȾ g_8aI!pTĻUCQ_y*,&u j7?͇[AqygN*$"Aʐjb=cqbDĚa g޹o)]!f)zJ|%h9eN['%jٻOP}Gզz{}&>ڲ C!ZeK )rjk B'C_Aɷ~*ꙫL#!3ll,f}EARMMiLcR;%n]`lU ogҫom`@Ę!m3r7j]S"5?ѩ)WA䣴Gg-cpl|aˈ8pFBr;X:j84&-Hido#oٿi !CW+"4V?-@" *Ll[4{/y#bZAџefra _0k ,/kMb+dy vb^ZY| w!~cw:Xo@BՆQ?Ķ!'f<1>ʁNJjWI]:sB}@*(?T9 ^3vhx#fFUt5͙MfcҜZ|ҭkڂ\_,5e?Ge,33W)@; Hw0I$!zͦ׎WAaG\˼.JB3l($,cH??^ɤK@#ӵ~C&K3})ءو}/z(?1OiΒ3ڶR#h\jäE&ƣH86U~ (nO0zÁA)3jbJv+1{_5pm+eh];5Ox=i-ӑ{8\bl&'S:ץlKS.vD9xw*͖ w#o(e`$8obs5ˑǶbz[)\ɺe9+ty{^%vyt%"RQ0Sk1| {*ϡJE {[,g XTȤӵ眲R}![i'0`i/N3scV-Zz"5s 5DPmxm>)Ch5F9N-lp5MSc."kס!70UVǭ OL23!ِ>ȴ]/v*'VEiC}e1^a9@h59UU0#O#.t'mPD, " V~ީW0ؕJ(c_RߑN*MUAix\ơjm(݅Isg[@1 DfR9j\0w"ɞ ]ße d\)^fpEfgΌ^*+o}<3bAҥwȉ09l$ձh#2Qmxɶӑ2x AKfhz8e'(rxcwϢɀTq8M~b،P {P k{4C}(TKv%ZI02SC(':5WJR9/טYHQE-%q+ '5$TPλp^Fo&=*n)^xiy5ښ y @5K1E+_뇪kեX7E8K/K׼ Ď + q|(y<ٴGyr%-Be.g R\B F xny皧H+#|,h*Flzǿ~aE+(VM11ŃF=\UCܭ-zvjȏYP>=^l9MUELCHA=`ݰBMP}7ocտW$7%pY{aa'(5?𼰆PA VHsw9w*Ք[cߡ84W殥D x) f䨱;;h݋F~|g<>!6+2L//ooU^*fk/uݧȈń X;R rZ|MlD.jVˉRuNK TYXvnf]\]~(:Lqu.H7*8Pw$MSÉmL+(ZyoN_tܶ^c6'vkYy?|>֜(w;Lm,&FĈ!XPG<0YM&\p,5+bVbL|>W*$ɟY}kҎ | _Fj-ʷȃcTH/7_ -F{Ͼ RDҾTY:f0?C3u֨(qjC;I1͔>%,*0ܯ,1L knH) lBL Qj -i(K_{6oWJlP@Λ].Y;2CuRӞynChW^ HWt{lX˟,a/C\T+yLr/iE|qUWEҀ|ҟi @[p[|C26A. W ~ ;?^v `P#a{-`m/Pp*MJk /a4m&26۰,5w1vdL+QcdeWh|[;$(r( kb -> ^wF2cT"bDDz3+ˍG=5XK?ވu+b+H%h`!LE} 5|4f|%L-gb% \=F?xjRMxB"J ҧ7LiM7*cVlzvNjZv{C@+8+epY=!(x$OB! o| mԹo,n~ѿ/f =>NYpo}N;5{eWL`t-iW-By=9Sg+ޗqans}%p9QdF74o4<"alf_n@y Wت3"0>Zs9=A$|ppP,s.}yݥd~Oᘣi\w͘I&i ;cSt'9QzE= CHU+G9쮡V ʚظ6L+yUiф!m*ؙMe?V]]i=Ps$=>>aHù.p䔭%֜}~|%8|vJ$Ddz O|)Pxyh]t ,x4T`g;PUFzF5{3!iCbˠ"L6z֋HsgS =>F5uQݺ hgopf˿g8Hkm~'LWvFzJN>]&n' + ?[lLGT usp櫳\$;wQhm?OLj&jqÇf0! Aتn׵:۶Gšb(FvE(mHUx3'Ad3C 7nIHfF|n'e!cƷL3tpv7 VoVM ɕynzO(_Ê"AMa1ߞrfVv;p7Q :Jxx3q|hvz6oT]0sI֎ )ّ#+XM$p6؊vmӒlQ:4|n/;}/up20,0NJ<T3wDh\X}Ztt mxR;c"ǫ } ҷݜyb--\DlY>/ߒN~D:V_A5x]Z0 (23-ōOnZ 5G_fA # bz6[=Tl1+wﴊ ,)s/q/#YƦgo\sŚjNc:ũ)-XwuI9!.͑ ;ăvS'/y&%|FTr썏(a8X̭.dzT< HdT,F̕ qnZLc**p%?PхgOR,tYhRDm0fTe:j|AYZ 5o]מ,/8al:GUMDN=V8 oJ(ua,\P Yÿ,qsҎHXA8v~J34| 7rKhW]s"n?m(MdFKJ4cvQLK2Q:2uW4 iU:NMT&-grl3@!PDh;п20I(9|KP R$cUUN9VL7n\t:|wu*ec^N~JGs%g5=-3Z WV)|e&;~E1<-- q eiLB^{T"UʩJ"Z 6:'ٚ3z2IY&l ?*`#4d\G%mD6h0ӣڊZa -LL2W8R;lbZ{mdD[1@NӨƳ[^EsP8Ş:pPSV%^"mLo [I(;V_,G2fR|9 /) F%tp@*iP%;뿈t?U/ML(>OYT^Թg([89t,j>It^wߌ`Hq1PZ3Fce}'l (YvTK=k!FN2 aCغ}o͂ٻ!QyUq(.џ-SCp 47tVW%:ЏҘŘSK])5=< /~l' HJAӠ><"^ܴ^ɿv7vKc*|hf@Ժgw;s%x8'B8!7r(cpm2fzOPٹe'Faɐ+BZ-z~J7"H@Ga2.h:Rz#-`uD(`rza?'E`ǽI Y0&!g&<>1ǫ$8Я@Q"wSjĂ=/K8OeO{<I)ZJs]EZڕmʛFD[a0c&RZo!KyiB| ZÊBڮe÷ЧP>z.Y7 3ZN9c3Mci= αmjs-*P\EHץ7O\Ťz|v!HP>,@uKavjښzڙ÷FՀe!xg*A{ f>Sl,$/*Km $yx(0"&*_ixZ̬5}t$%-wXѠ~rLL2j_Q u6NLjPބ8l.[洎$~#jI8o*b5D !.G̨e - "愈|MrR3P؏IeDIh# iC@Ⴙ9,۪EU[$혌|R\[p7SA=%)|[ʾwR0! ½^.YDU'3u?!e A\-/Yn24(uH~ gNG弡h0tQ1:xseE7CA\!Zz {T gZ U|bfX{O HÇ ͒4p"u|Kꗖ-N(]M?2RN5-^|#8|M? `ԘyWXI@(.Pی1.p< %  :bӌ] 9J|JUЌ0빱TQÇ@k7mM<z?%(\))v_}̺6Y1XN[:ʐFj&b:j.R/<8"{D~PgGL!U),*k?|&sY3 ߊkaY0r9ɱ /z"t ZeJ#EON?sY,wOl/V2Y²#{ ^~dSVe#9Pǖc?,71D)">J} =l^pܐZ{Ym'lC4i s*iYU^?(V$Z9Z+^M86Y9eyNCD`R[~W (0𢫿 diE08:1OtB~]e'(@ᣵAh,4/rvNT=w._LIWa):S2`is$v`'٦+,(==W 9o,+YÓݩsA@ߞKECk9( h}^}39DcYZsq(;c*Ĉ~500}L71{5W `C/c(+ԠjJEOZ֟F8gFfg:j`)Yヒ̃!T;=\Aw_#_߅+, Y?îKAirO+Ry3"!:O"$UnKػ{1[Yx@_?>nD$%~d2).%2CV覆.qX+$3ݸh`2uoDp!p:MG%oGB'8Q!f!YMhVc'΁Ao:Yzn:imMʏȓj5CN֊x9yFAS"N%\e:* VR|xx;T;*"dU[G'M%mM\2oPLwu~v"׬w^ #͌,:ߛgjV8 7(1?mJ)S|M74E# r=GKgK,F tbG^okfmJk=~+A] }!sRYyxۃhSx aZFgv6TjZir=ʪ!O&cM-!jo KE7|ed4gHp"YP30-KNfMVwӬЩ8],-E1̃"v-U qʁ]!Q$I=E {B@uVA&w* K\qn$r0Nt=%s/IUSI wim4=, 1`O_ XW+좎׿G۳q) >(:ϧ.ȣy[="}WLdq5}PKMp[ޤ˽n) 1m|8׍#i+b7stW@l2h; vu]4oX Iie{mJk7g[NjQYU^1J`\ꄦ9쌪F^ Pt=)B`' tl/!~IPMk+yje {<,j d HF៓ ~$W&'ad`.98YBpARD?ӟg"N,(hĒ#Dj* T~N9I*S?'l)(5 %MoL׺WVk㧡%q4$pFil$H)D>H>>j 7N=O,>ԠIލi;1 P4;$?6@}<_hgHQjHƱ;x>kG NSV7}e||uHD2%m-+kƆU(Ainޛ]'ṇ QkJ f5o QHŞK6؈7!)@; ̿|)M +x#z7)U JasO^^ioKx}a= d襝qK ܓ6t-XbUvXc#/.X0 /0K/N pO7*T`D1#㗐oN٤6y_i`]ЊE@Յ ӟiW|b"ݭb\w-ia&؝^KC]T|Q" ~M['ۘkP ދNܑ$SE ȘJ$ZwLttbفjtIZjA78*ɇWh*2lgzn=M WqC·@2P ʍ p+?5 zM;EժĝÑ?*<~#G=kPt~YL w&f5i_32dot>?G02Y̻NQdkf!YY3íB"18R`y"ÐlJ"1L\*{4F¿ f4&$).@Q`C"E-Qx;Pn߀,q$Bc_J4+>C@ik2Cp "2f@Um/CtkuI!iB 8C-^HқnYEx=m 'Vt69ī寯82m6{'#p; *ٔu pWUJbЁӈ۩qS+)^_X6xcnҕFpg + j>M\alA_ N,SUĨ/ SlW@w_Ԇ0N͊ zKQ{^L>0Yf)5-׸JS,o⏂&myV&?q9hS17pѡ C.?+]Or%5Dj9حM)ݶYg{Fa>kh6j3";;~5WL3Φ.Ԁ.Q+OLxfBV|P9\IG޹X3P<E&L3 /2R1[+Y@M8iX`,`9_`$p$iԘH܊{Cq2pʼ,G >jz]##cHz0oz:<%eOujYm<+YWЯAG]>[jep'!sOP`pQgQK ,v1t kMde1E l󷄓Q=nLo䵂:unSfDtKd#5V,Y56/:Jt:QiI{,w/ηK? }Trs] mx^ VE_b[ n:<O oX,"U`N=0ts}w*` 鈶m'ݳ3,Sg3Ӡg:x1G2_ fFDH*Nkp4U,Ē\C^- /I [\ 84ntC'UH@XT`etZfs-Ϥ+mF%s#">5Ǿ&$ /MV(5b (*f0|@b֐P$g^?1G"ԔsU[+h 5`G36C~$-ʖy @To5P\9W&fPjgJ"Zqj%8f.F߃L&Ϗni^:_op(TUo\_$?6?뼀k! .XUAyVçHO_UP}5i`cpdƽ>]-OI ifX8NwH9ǝ:_=j[!tT9 'ㄓ4oԟq LsRx|Mei~Hȟ݈UhVU(7 L b= R)SH"#L SKSobbcnx%a{]fW¯UzI\Oq1OYnH,`SJ5v5m4ύr1s+5($-q%*)6nm" S)]Hng}N1 >0{c;9}"qt;jDn hg9s/x"d$@QCM"vC»2HI8r'$6z-KT1 $̻ dpFldmܝ~c.4o@{ي+oG.yaP-#|9(lsJ[՗bd`Q"큺8,iCEmIfD2ѽTWJ W AL츅((A-6ϲPt1[1Qn յ.>pS'sǠky=Gf!a2 e{rwc^aJG&*`NnG/v2ԝJ1?҇{ؽ-"Xx.VgC5,[7V,Nn {}b#F5& ~UW`^AИA]v0|ЪGAfc&ƿąӕB aHϐi).dմBQ))ЌuM lbsCڸ7èPh2\g02~tCk/o9KC$3 cKY&VfUPte@8vsk"[M#̴P&^?ȞOͅνk Yv.S2egl8mYY-ڻP+)|EgMЏm&쳩z;{'m]LFGAqr_qm`%R K2R=,4/YEΙ Az7Vo<Sp;`R y uKyޢ> *A+D;DtUAS-v' h*!P$XELn._ ,+ !tc T`1&7 (sI|L3F:Ş4D|&l Sc) o43IsԲ#·*ƋwSHxI*XsvtOmwX,i~{S[l6!uj#~j-ћVR1E۽Fh!_Ї4#0Ä]"5A n|;y3h[(~J йU,їgnU`Xb]{/[*BpP!ƘsZ,m &:*VJ} %0EGY@ľ,V髡DQ QycG6ak db ~ \9DoGmOǃn Xc--:p^(paA$2wҤ{52peaW僀mPhw M?_>kM!\JOԸhHwHu_S?]!'*y @t@3N0 #. uGobKo Ë=^SZxVLV|4GRhr{pYM`U{&ߌƥ]6qᑪ16zRVjZO&YGb=`A{N^96ouV59vqLW k-uOq{3.BP g%5$Ҁy{ m=SqTpsn߶nZkP0^-U JoIZƭbazƥpZ3ZtJ@⢊ܛl#~7GN:(=&P|c",\ik~t0"HŀLsu҄@^+c"}B^i(]K)< uوO8*wђY,<}f0~fj պikst52C}2ғGI4y>LM͉ 3l(X0r6j|~ yjD^R0RD/Or5D)mT 6ڕ15g@u&+2 ԨJ%PtYnTzjIUU &"ex5H=kx/_>ؾz xpU:ˎPP߳D7_G|)! *F2ц=N]91D:Tk,5Dߟ9*vc,$hv8t眜MϨ<;p"OP (t!+3&1GLrO3`.R8GSRj9v#4>i\Yd謖B[5MVCRFv)Kq.@V@. _﫞 -j<%lV?dĕ0:_c~ Xe [8"Q/CU#M 4ii=4w8*G]H`OB/ wV:8=f%a*2' Y\z$\a't`}JD'^a$ .]쉏wx& >gcE(^uPJ$Ẉ#*Ek'2LJz3/;[dp 'WbQMcⷳT꧱y'ő|wy$P%^4s˷%,Rd$(Y=@ie yۨɂuQ54 |W|AR$).#!)_<2-:D/5 U˂&跹yf&}Lѝt|dcW/N0eό\ ^Z ufnA03ݩVl엝搗30>}$&jYH{m Uyl C4QE*%ߗĻӚ0-`-'DP?,xj,- ri!o3vZH_'p[I|_a ۤKVjps}YssC0.Nd)9JPWu\-v&|2#6@9A@:.$QBm˞u*VD\S uyQ$; ˳<2w-uɏ=h~v~yR١GSYJ}6%\H -h\.Ә`)0hv$XѠBZBgZۥFLbjb6"{Ĵ3Xv7hSPA*}mײ:q[ch)9A<_ϗ$}|3Z 5-|phgT&Ujq/_|-%S?<4ᄀGV0zƿְAzqXHU?s>z>OL9ȶM^J6a9+eCm]]&2w2 S\CX™V Lm&0, hzNjI8kf:DaVaVa B{ɎyR>zfvTwݧpVc@cXmxTJ:bUue ˫)н45^3ni9dp Q ̕u)j +DJ9>ih[1Uyx$[=U;]68s+_B1ARdLQJj񔓕4Ò-L'Z^İjŁ4uS<H4O"%7FΜboNdz'"zTkQBN!-nҁ^T`8K%'8%KGOEI &TĹOĐlrO_{#^NɂQ9gm^]m*33qR;C a~XZ'N,ut.P3O2~X( Qq9h@86;t:[^b`*FulU(y!ifb x- T_,a@iÚ"}P3 ]Y/ BE,FBZ!'S! jˍ +- je;{`S O(ҟBk.yFj| ;Q%gKDG?yI¿` XAe }B|჎Q-< I )YhI0sf?4+Jâcbk=o 2PƮgznӮg"P_Jl `TG0If?Ue:Âwk[ K)' =AToCk`nU k+P=+#Nl9!g ~\Qɤn,y)jp+Do  (Gaj\,z}X&} wOWA \ [zlJ@E{+&3i˖P|d[>lbgj.~'ǿ$\uOhW DVh%Ellh4Jnd xTS]KgLp'XT3)!>` ԟaKE rX)`&%Z&N%OoEVE]źR6"PkE{B⽑G.E5]IK[ZC F6 3 yU:\K!^#ʐ׺iǛA~袔t= GF "5}"=~vI3Hq 4ݽa}>cݩ.Z\I֭SfيJzkT,}`̶gfր`8/fҭh:Ȫw(_d}$Kl&Mj$QL53;kB^}Ѹk;:7n 7z\kJP)9G­> \Jf9-fSaN{f̗]U3/v^gxzb>ž89{G&[AA6<aQ!foK"Kxff\5x'"+}P-Tқ*њ3+ʨ6f\tqfUT= <>7}`CtmJp.OuCo0Dǵ |aޖ+~|8+2B~2CPG?S[zUO/f"NZ44d\'qToV꯯B;K>P,:yKe~]}? Fs=H5IaCț/VP՜W\ A2dlT+M{u?v 4XBϬ;"YO h}5QXy"f*uNeMN?ƫΔ`82`06tƆ,{ Lyb2cawز8]@{XG~^%U')GVK}\YkBTf3P!jE*wV$Q0^ʳDK?aqSp©VWy£|}@uNTԦ?B 'Eˁ;"HάaԉvS8ϬSB̽TZhVInC|0X[ViJ k^*Gu&En5H'h • G1PT1 &V#PV./KdgvҒQԾe)ʉ0} n=%~n{3K1M84ؼ=}m޻y-?%z^ *G(>inPK 2®`a8if4ɺ~J?1dE-rLﲲӈnIqpUH&Oi E=L<11M7|'WFE8?t3ɨ>Z<=^)3^2byFPv'z4!UsALIpUpHbGI+Bfa,Z ve]x.T#nc>Ɉm-di]3f\6+ȦN 1Fr~) 8~[wx7N&禀.uBЗ#Bi+5kykiGNm<(lB[i^q~p`=f a Gd[,p<!&rG]4Oi^J)ѯhl*\%dE=8DbD ScժPgQ}&o kk $*,VnD锢a6i*0"Y%($ S?[\?޷qG5V|FP̿k0q8"6$fKq >\*ZvŷaӐYGLP1(ւ'QȏѣEt6iydQ vLY 9gdfiLah㴐gbW4L!&;=稳k,h Ӛu?+'=~~cň;h'1?~Ӧ*^ySL6qj;О{6ݪyxB(%f`# jlSie{&_ =6毄,vAB^2 ;g5hHT[&> mCPEq1Sܿu\H6 tEjTT K e^,H♃%J;|z1i KB]|gĜMS3M}4$qvz kE+[V9B ƧnЗۼMoHs/̺/')t,X3d!y{nn%'s5I/7.OIG):e ?Kԝ*:Gv{®u9MÃ4'$ex "?<_ppnYK,0Zn=7^d!$ɯGXeIdbyob'K[79xP[~}R1ڼ,Se¦sRЋU3{uN|"eowLDpɃq0 :C<|f:/h0ngUrIdɁ<@A|\mN5ZjN Tp\/"& ٷ>6HeP ڽ;]8{. :Ll'<2n0p}ŌƬ37A].fM#2wʭmo-DPQSyC!o1L[Cu]}d` L(SVN9  Nr% IW`dˠ/Qq*m 4ӑz8gC=BZhr hv8@:YqmJT Au}ȵl5 Ybv)NvM. qh;:ڳQL%~we`gl!v ULjɈ3=uDLdiyퟦ'(ېNbKxGy*ͧ|\qNYz4jTiPgspOX/;VI oT#V !kÀ˔m) v븙` / oZd| HE inU)j,yGQo>F5-nf^8d2@0|yG^ã}pOZ&V͋ܬj ?6D3prxGh92$PԒ΄л-Zd8}m7YXNDUkLQ]0w% yPIc Uܳ Ene!XuE0{qіuDr`;g{;0.ox; c'=ӃіT256Z'V')JlQ!1.Hi'!|W3֏ ѿ*YƂ(-4e}8RLp1{4QROj4VDD {e[^P9}H@:E?3Hc(ᓻmOZ3}U qJmFc4e!W9O vzqYx`Rh+b3/J~d89c"h% z~,㙒 <$1[ X\qԞ [8o Ywl?o<>q>\…F]︲> %i%tH?^{xCcyۢ|ݦ ε]SRԾ')km]8f /{ Ux,뗨3>y$KBy]d?Խ kp!q_1{#ƍUN_%O6.b@ sәͧk ܏'ܙQϭtO2.|M%O)6}%oJȁB/4Ձn #<8yVU}9U\zQ[ P%TcCa}\O) Xwr%tbWxޡG|Q4jmBO>~Ҟ6m%MGPjhLKL H=bpKe1먓ub+z;/!uX"]\hzcҝ< ~ w@ aV\<B)#YOWEpahݚY=H86C?,g jOɢLGRdz(u0@Uu5d,Q pM|B='kj2!"?[0Ȩj\oB\&`قkSO`)`1k 8֦_[2|mPr9en#~Uo HCIxg5TPa'vzX>[f `)MFd\A٬ndS~>8&<y;&v811el5p"m?/#}'ihyZQr -Idj^JO?@f>%GOlqEDKʁn0v+c%-n o{Z3Lё$GhEE qkCj6+5|Fuh|s7 r<- .'-fbNib @N[k>.:"rZ#~=kv`V8ȖPq4pġXXﹲfMl8XP~ fU*uZFpR{'\OB SLn]an)&6u__(Z7~ڋ"fFy=f8dƅ.1fTP[mNE O!"S/ 3Đx"rjqRSWeTGY{uJ"(|Blp2 ӁX`YS% =٤<46Dp1ZbI(u[8^M0pyMcj=̥V#]CBIa`o0`+ZEsm|`yMw4 \R99q5dk7 >$~ dP' z5DaD[zU6j__O;(@w81K'bBLa$mI4!f땋?ZVf6NF1&!}`&L:+d9RT |ٶWDu l$[mg Bڵ'HXll̢ƚ=I/Nrq8[cp) 3,y/)B&ezbŵ{#]@p737I{cɈXU'ݚGCp/Tl 11,7Vtg*Q^1B6ٺNLJB^ng}" TZx)`՝l-=RH$@6`+šHY`HũX]?ő# Z-C fʒmO 4E haNӿ9$i7y;r_TrhO  I:nպwAi^~=nT" ~F j cmaN ɒCk$Nd=dBPa4C޶CmcI?QqɀY^?/Wߜx~`k/ÕP|hґ`Lms5\BC߁cn֏ʬ#c-;2-j+ f㻼k]O5ʟ|M]IoР&XmQ*tțًfq?9KɕgTz;r)(*݁ 6E}(3F/g5WԃˡeEb`iIwFg9d9>d=(rfǩƲǩzIl[ౘw6#em ߑКALf6SŹ_ŶalnT;1%XSL> HHsB+5V7$\|?(3z.M61]0GpIT x-n^X j^|JdR,O41zKNdd? VŠsu/YZ;B+ \L(²៛ѐ /FzJ>8 =zJ^MOkʺ#ܓlX*[bX=# 7>?DP 55-H5RS)6]{4stx -ٖ%^Q.1"p k/4Ʌ#;/P'3! Ыf3ڊgUί+YiwraUkBpE;#hw^8(A y0E|/hˤF-DG3c`?M3Ug_v%FUcgdvɲ9l#r ԉ,ͩm(o/+TwE?>A_sHJ"&ߊN';@+,bX~!`ˢ8ǠPSAӋF35\h#RU*׈ch^k|u䞄ڡ_jI>&ضhcݮ lvd.#QrGm&_x{ﻈpa! Ey1~31訰ueͲqJ &9\xw<0zmcYtl{Ԩ}.F3EctYݕ{U뤋$]6Rn.UD- WK1$a} ,%G8h#3t.p$@Çd>)+Wlj9ַw)>^!ˀ@m9Js)8~4)9̉! |gX п=OWF8PZm#Vψƚ9KLY]: K:DG`KXNKjR;iDK5jp"ޟV`."i]#>!Bd:\ئ˳x=hTq*]ؑhRsqG5US?"Mge>P{yrf>pyHES f^6ݪ KO茰0G $Z$n$\j+(ХZʃpSғ/emDp50k=,Z>$bđ"1<τ4yiL+pVC>ldgM4_7ϗ*!epm 'ےD*$[pmF[6`  ŗ}L7j_^gJBo@> *2m?2[8Мă!qJB1׀)sz3)PcoC\8Ko  g$T |R&=i$_ *m]Q1k 6IYH01K4Ƙ<ۤdzwN{,zBo;Qk a"E v} RӉO^;KPENsT%c߄ Hv4i%Ju,Epp3p09@glZ6 uj`~ kR,@VJq/hÇU\x~ǯ"H*bV̈B͆ 8-dđeu\qD-!5J zܚ<έЛUS>P~sJRbiɷCCI-9N݄Um:e}ۛ MN '5 )^<2o&``p))+=HotDG"_:U:\n?yEp>t&YZ11u0Z"V5EĪ) Lq@NaB]O~J&z`^1DЂ^J)FkW| zYT,kEn qê;+]mM4.ʍpR,џdBx@[8`ǃ%4Y6+y"bY1POE`n9f,x'Qu忼L|w HFԒ/ns1׵*cM<ٯ!ٞ44_nZ0^.v]i܆˾yO~Шu)-Wi<Ġ>B7[Nя\2”MIYH߀/ 'DV2p C08AI.ƕxL+oβd:`b \S%7ޔF:bI$lYv=Ӽ_6:"m8t„lS\ d no$lXhd%3vdm`w%z, 5)?X'?!Q $%UPB*ȸ_Օx^Ñ7 ͕<\>Ӡ+55ߟj,{":`'zA @n9kt2yD\00.iC>N) ?KiotpRw(v2/xi ZJJpz@' $Bآ8%g)=R/k b[ʳRi-fA1[3#.$Dy^H;38ڊF?A`s|yWlj[3hPhA@(Gt:Kt4jgXedE yow!qvgη;H.dv=m)b8cXߊ)O<$`C=;/ML|GM > QbQAz' 28y&|4c_(#rB4:]A ҂>Ah]yjuh07?4 1 xY~ )߮S L|0JiM-rie <[> <8x&Tp3$|t\ ,h_jHpdBwCkU<;ԘTp bY Ɍ7NQVn!.-;_lYeh?מ%38`@xvޣj%03>od}j0ሴ VYǿ J"gnqbI%g'l17oO:X{WuGJAS"Jů#ޯBQcS[ZNz:)X17H<] Żzh@|A;ZߤŲg'&?UIJn~`I" W8wjvFcE@lv 땰\7dE J2P iC.њ;n"&|zYNLE }\/OEOנ-wh±r=Xv!_tK!ǾeXlWUߢrS Ah*H\\PngTX&,΢MFG{ Y$ovYb׆};LV/(ߟNoj1<8 3]*VLu@PlUw.ZZCtta =M-GAr{zF1#.+C>L$m5:QCJdv+d8  ^xnEf_b~s{ XH>=jP*[{ !t[x$ \=WCTyڨuH By򥔮"6@)PţT7X.n~]4o>!MZW$]x7RU<ˊ,;wYd Ԧ Gmio96ZJB4tUS%Fe.ϧLb/׹#8D͑ڬeUi(G:]un(+t _^r+$8ŨOQǿv!J-dݒA֤RҷOy;L B=*1S\+ȤlD_QE<WóKeQn iLvʲ]ٹ,v"2iZg|ϩ F3D0r޼;OscbQ0^O@/Poa#j/ @TQkwU![1`<$2w;Vgc^EmP5Fh8#/ D"bEޥ*=8кџG)B̆[ XHJ^J`H T?;"pH%̂cQBMh{uc3XŎ^ciIe㻽-ѓ'DYrm颕_fζb}nwÝ 7f:=?T!}LRS2WAZV̡lѷE |SUbmJ<[V:c?Ҳ|h`6l@J p`yI_"(%^b|\F(c0PpQV2 O589YR0 mŚS( (X62sVeX|QYzoaWuluM? aK۟]aD{% ڛ7 gR߆bmF;Hs1lwjQzk2Q^sOc/lX~7r}Bk-OwƷy[xm^bI;7؋DSnO}NKBOw0uO cIpzE2-;ɫ02I)_x-7?Wqh7v+Ixު~5go}*Y[c19,/ J@ؽgۭEB5rNB̓ p,bٮ"VcP69χHրj`G|YuXއ$Ϫ4kP3ΐsltY6M"3icz3NA1P}m(+cFr¡0U_gp/4uocFG j\yq񮖗Da'JC?w")E=[E4Z*QaKu>ц!ղ7l ;9&iط onb/ tc:O\sբ.,N3V䯰~ezד3DcLꙗUo8Xf4v{rhQ. G:rAn]DQO)0H{#}:Yt%̫Sڏ=JXGlA_|Uk2f_(3 1}1o㢣?0o H0V磗p8α pLxCGXP 5eUS[pqzV^{fwڛlaoΥme$CAT5ZSz/|5)YCe8ƈ*aq깔bWs!X\7+x idczDmo#gt>̣i[ݲ;c WlaXgɅAK{bDO7I_g^CC>X#ɮ п*zDK38h?GqGA2aF&ChSK[a>La@ֆSj)Ag8\" *o* )4 dQkoo~b\6Zh!1 b_S^!QL2?`wf(U'fؾթmᯂO?SLVgj:Ҕa48T.Cꚲu)Ha'ƭz2"A!3v6N嶗`gϮΦ? yiGQ$^G9Y#ADOaM^Ĉ)P-*P_xC3onѣ`RU!WVL&Ɗ_%a3+K?p;.8T_nNcGl(+1c9'cv 4Bc;D-C${Z@׭N?!<;W]a!3\bΟPeUSa61񹭧_yj>ߥhs=yG@UkW}Qgсzme~fЩdc" ܜ{| $rDί'ɂVѕ-uD wZt̍Qq,ч"j=w˸@E<*c'!.6p#NbO)f 'RrS\4$i\³uSk4iWG_mM/9%  N.w0s*pZ硬Q#G ֕Z{'o:x\q*˥ᥪ3,nqpZk  UaqCB/ Kj!Ỵ_& Fb@eNUQ)d'7$&M|Bx5Ȩy:^Ф ;cطi\+Yң.PܜpG~W\]Z(|%(ens`=ߺOf+"7ywn:7AK ǵCaoc_Ҿ/!uqkRk|\@Pcܬ.%/1k,5}ZFُ ћi}tBxzܙqd׺ׯ僷g#75ay#2s iX'@%(/rK^y#FcrX+`oOn0,OU.sac8FT iR9ʓ;6`Ń̵ *QQtw@{ܔ)aGYף?BlO<%j68Z/?\HZTx¡*6s d;1.X8=!Ԫu @,%?GuK/@}`v)-҅QϿ0,'G ӊ5H Bz|vjK6Ejޱ{>7)&|׬qDBQBhsbp؞NJaKglD3?+1yF\;&ANګ <S&[mZdfԠ6c;;FIwLVH%)Ik!"/"(:ږ `a^tot)Y"sSioA o̤X HA8/PJL/~eKC U;@{ _wu1"8:{}\:p:fu+6Ϻ nV;OE;-4 +(#&v]g> g7fJ\χUrL("Ք%UޤD)gĖƜE쩨N KݴS8Ip!DYm%ljUߢŰ; "xm႞S2 $Zc]v}{DmJXRS}?ߒݞvl29*m^eCTMCb!2z^}AX(P鵔=`mv5}-l05mCsgJQ[[mvHbsi E.cYsI9齨oj Ow DȠ{iwtM eЁn)ZW{pQش6:v%s8Ӯ[.UHQ5ǼqeQHHz!:ZAb0z;A@a>%C8xboX뺰h]gpdyVMÆH r:RP@g/GǙ_({ N łH@*2WT(?Ur ՙHBC t=nSS'AY#8WRXt<,eB:.}ȐWNRi,#xe+}Rh nk7Y:aԱvq{켭\0;+F'c* 2L} *jHQL/vgC8t(_xP6ŇMtUUSM*\U4K=yzmy#0])=ЕA~vT{txrOi,#bzj [XKb`Z9'½wi|6m:,g(?]=7o{)1@3} [xE8=䰰]D(։{FD6EP+0V=S 󽰮ł[`"JUg:J;[ I‘&S/rS2/G t95'?b6E+[i}!Ѭ$/ , @ʇlgItg1FN'W\9MZ_tSzjՔx.oD5Գ=쵏,s̨*G:Xo¿WgFqhGk`5v]/|8pv E\L9 SD֘2"SOs魰 Kq 1}1Uw{,jxc>,_3 s̥ϮjJ_YXkMۉ):<ɞDƴr^zR%uaEd#t~@ql9HcvJ f?М`$nh:Ių:H0Y(&0O7#d7B(g$qƇ-3fb]Co) u& vSGkwz^4a`{tִP1s^${BLJ9lZ~dZ+{B5ǣ<+ml3)MX3y m{8,#3ٳ #ӣGVd[h5gKѡ{ erBbr-yJ}QPr+%" uCgjSn$ޡ>?i:8 h*^]2 ( QA|NYó?w\6 uO?);EբĽG.rn%H@xzX_IRJUN :W[lFYZq| er-P͵_x[B▭[Ν>3'#X/8e?}ӴhqÓTvR|D-_yrM.Oˊ إ+}aJE,xUC|3˽@HxaԮc$y2zBR1* 453pG+\ԃ +2^[R5t[C'|a˵w{˴ w{`#6s킪bR9(=yF,˻*aZ!H]4v' +8rXYMY@Ueq@XZ-m&@pG^BʏFEJj)V(ZR3Ú`1{xpʋ`.hT4kZH:Z<k77Ukthx4nKzܷեos4$=nt0qyI&'LtWH_:d*T✭|` D Iz5[Sō2:;NRM W?;ē@lbVȍG8ΧLiP%P$)4KxX U$Z7I-D(\|8N&"@(`i5-ȕ*46̽BUy!T챴v+r 8hIl  4M&B ,P]P|W3o*n(A &ҁI4!/O Re,|%(ya۔##5.'$8;įPSf`N1tab;*6[cmR.!TA"J6M!g7t,-ؐ:D'.@@G"G>0N fRV득,˶9By;}K8R9Xfk١u?G@W.*R;Nk&_s{Y5 hʸK$JΖ ,"_ڒ;O=Ǩ K_jyPa\:0 \\x}#}nUgqy!FZ#w W+O@x_x1P۝nSY燊2xs[V8x3?AOyPyM@+8-h:8ݚve䑧`1@m,4,m9=ިsROFc .{$p.0hh%0mxϳqSRtG?d{xp|>D6dV{ړ ▹Rˬ0.qoi -F0zu9Jb*ƟC@-xz^k,@[rU81 䦳Mѹbr; {!/*Zzbh)Ł@q̻Xⶡ|)E=nªa]JlTɽrx}Xh4:a?F 0Z1 *τ?K<@ٛm?犑`2n1/m.S9B,KEy֓di§ž] L#nm=͋7OmyEV%hMh> )p|isDzjIΙ rEߧ4:@x+/ JT.`2T7Uz7gLpRrC]:7խ3I{hboD>iQ}H"{Dlw)aWNt ^wn]+@=JDՏ Ǽu i`v3w3֌v6x&Qږ(/Hq<%Jqm x@ ?.PNG̠1=]V0ML1u|R8SCΩO\I)5TN)qc{û33 O4|'z+l8 1 M`1$vΓ\8c84jIA[C)'~:+ۙxg=Fwo/A Ok8ashUaa6( ڿ>aI͌&7tVElβ#4HRO<NJ\`Tn[P͖L8̲qۀX6J U(èTj_YcY +}ivaZVZUI^d? U u!VSH^9|:d#ghjabl^ %DsX+2zfEtG1'UweDftF4#,8d -GX>:)]|;Ccua,y? vs It^-qiܮz"B6QM+#sgDF%,)'O]/}s% Bqq a&0X'{O[H+sqme\@F> h ]rm|GƬoN_ߘ K4l_PyG9i֐N"U;j>i'NH8UGq*CxzWd񢓵Dy#Nl rQMmc0z$:pμ G"k"a} ZYxT;?cWRdoVb((?DlYP~U%/!fk,pBT/)B B *Vz| BQ9eUL&e%BY%gcHxoS ط7Z h5k.7 ]+RQ^ wHd,h')(&Ȋ{(\.i| yTϮӑG RT4EC=1LlStu µQo& &Eq:`tO{m z_!8kڻ\в8?% /?4>UR|E~@<'U.Tn4t{Rl7]^~N>j+[wKG\gGG5FmZK2ĢhERfS F/ Mc?saG=iqSE|< sb|i0б6SZ5WeK 9?~hASu'uM6]'a4rVzpG{18LROT)H$zYCl.s,á 7s#׊ w:"RB8Ƽ =вn}#(t+M{ C>g\W H׀2yBVYrp!`>nDzam46C>%ӶуxE $;kfbuʼ& ]Ct&.K7$q.Zosnz8H$_V@{A#}7HBb9OOTEYԅ[t/#SEhDJAŐGO3>zh8Z%f\*rl)vWVWUGBg۞#pJ q:E:/evDÀ=LKKsO\< AA*` H}V+PI[5l>2д*8O1hGD Xt칯<]zUSx 2)U}+wYՙR<: T JVVh)5nhNm1OsS\JgF?)4YҵsvoM%<+ܰ山:.1l"ytVu.)c%@7x<մ" h/ÒZD @_&0VTp=S tQyZ50&p_qWRh!jDt+kjM(׹cO~Jq1Ů]ZD6OPQAIJ a,ߜwEÙHgw]퍎CIڽJFoyNoi`{, WTpq=T+k !'ʓ@ /ތ`?gJ8G(u V\ځDvj(5P~~Gc~!cCa?Jh&9;4)ت'Pyq"Q3Dbo!:T2a.fƨ˩W߳mK7LP_&ב8Gs_u):='#Du}5Y]aX^qy $h^PZ'0\W)穉R|Bv%P_P{66);f; A )4ƚJL{"Tt]oKlµUL siTM߫BaْEJYz*.kf e X.;U[bU4FCB[Y\KpI!IIKx-KVY+kZw4vڡZ/:vBdH[= !LHII"a Vy3/Q!7+ħ& CR_;`ӝX rf. O_z O룧ȸ̵œ9_07]X"Ѳetl?*ڙ88麀П\ξj(erqþlh!N*ʋӼ{|iq8(4D&ԔvY"~1zv?;($nY,=Qz|oWb.Ju]^J8?UC䊃à;i;6GqQEv e~tf}953];|>ߊC 8I\T9%>ҫ:FtWtݴa*c4]<_@wWɂ6>o͚ X3L߂_̭lEŠovYngϬ.<"該{5-*]hRY6m,hG$x,d~yt2q;LQ5֗c ǜ_7nӺ{I:;ː?,>kFTg1%IHLjM"rlS撠͖R9grd&_|*5ba Y \k %+D9aD'S0ۡha~ = WW{hv?NHX&ސ؞P,.n.=kpBP5?o)&ޭ8v<\W[QwG3u`hf|kj]jF 5\R #}^pcɇFO|)V{pXm9Ytq|j7"o0)3Hp19k!^x|mŴ6 LN>nԠxw" YNhPҪ/>-da3>f,Zx`,71@NB>W,^pKqBy0Œpځ&"1 LJcnlW eP$1(f\ӂ```1ἏCd _WV]ť 29M rh~?)aUf m"yq<A@e0ŒcN˕"ήytTgǔ=TPwX+R‡ m5!HT?!3V+%>d= rB ܓs; Jv/a6 !勹.JW(eV\Ġ"=8VnB 9k(  ָڿ |Qhe7\F{OQ22AKJ>ȼ`6Sݏi^Jn(|K7/o!*esR ^[Y_hԖފ'BV{RKF_EQ#$qe~1xN' -Ƈ&h|M-%CMc%9R̟G^!ZX{Qٽ挬ZN :t-@"P{Ӧqx7- K&q9+|]-P𢗠ͷkB3b?};-F\޴篧Bo"?;c H;flygdo%?/Q9HÞ Ӻ=[.*Z>+qMdps}x߻)lmնx>gLY$~8|HfR݃sxus_S#0HUc/cuٍte$,d4qSRTjIf;.maA $mm^y+9#"65fq~+brPVzꦩ,a_heTAW]Be-E\|Y=~֥HjΝbpƏXEoZ_%B[ݴr۞0w8.Aͩp"3DV'>u;KrR}ɱNM!-jsWUC<;=f^P $y>:atCAuˎy8X9  #G!-!YCR{uB=^D;= [bnkuq> }e{L߄!{md_9_$ cuhP;ّɯHIxtw8< 49:Ǩ@!2TRojp!ߛhQ]KM\O6>[cX"}0td )1KUjfj579ij_ z\N pVM`:vjI [j iUwjʳwMlZfd+•uy[5<( sԭ Dhi )ȻXB=[ 'ب4%B7.oi6~ ڄM6(&X,U|Fea2~ 8Zf+ǎRؽ'[ vw8a*)1,ޫBbXoExu~b(k $JggПAlCD$嘊k+l3-u~W湪 nu,-(p?3[bO?IHG%Ãq[K;3b4`Ru}[hL#=YPn:{]]9TG2 J48t9jT!_{0<4 wqMy0nLPő+\ܡ2=\o,?@DN|pm3jjDfC5Thw`Mϲ{0EOrQ >-xBփ 7~AV[6R}E[ ŗG'o~E ^.+WWAggB ʼhatBca'5Dv1 lXQ"Rz"&ˋoXj#qKґoL)H_`H'8`'jXDJ&F'oʂ==1p3%G/V~^yVO>Ҍ"&!)5^QiL(q/#Zǧ짃]ǫck-滋GWf4_5$,̈́9Zʮj<B:SU|"H[ 0M9Lu! ~Cw`YtPWpj|}ͬ}4֋P3AǙYrT#恜^!rQ465㡀~IQ>%rD<2д?XxI|^NsBR!n&{_-, 2tV}T5T "b+d-H#Ȑ/KRHCK`GQp=P1}ˢ#W+ﵒ(@ A6^0/sȞx{dro(g9sǢfe}/%]+けھAibYt1C AVؾڧӌd7: Mdi8"ڶ4IҁeՉU4 "Fm]U?1jʵaϘOJ#J VK@=0dg{3n5͢>Y9C ZԓsahKtΒwm@c6Rb\kx5o7B O>+|eUqZ*Ή.O/#l7^v>tNW8M/nFaO:hՠ-Uhqlj@wsiA=zN<| l+O?4vU^/p4I 7~IF'x~00"`|V~2lmyS64 &wPn-}m3JoHͣ) I띢dxiFfκ@,mg_W{H}ZIAЅ+z)&{F[(9 7KxL, >NZwȌ7ҁ)%Mve}޼9'"eSOc>ոP`=8ֶu(R(,KI+'E߃=ro?E9QuVV G/ 9uTJ[/ vv|Rw0(p Q+nV:SڢX+F;@MҊ]C^ 1G_V{- ] Ћ(%f;ďBPQ+lWSpt *A+F݉jwEBrʜ̰U(Ew7QtΪ[}cpXFH鈫4(>7B0wUj.Qы#/ljS:p(籡qj,1oFH@K9# AV!։c5+įfmoMnք>30t<3%P}e3OTxy $o3ev2&a a_K; 'm̒En jG^kjζE Tߜ,eM\ץ,sb>Gc~bFzWNm*۳mq_EM:yGM=!zOmY} %N|gQ|,+ab}.I]@'d d@҆LJZө##b&P%xWu4I"!fv#n3Sr\U0V>9lLvC#LIb<#V&Dk~|J;gI5,W{BTWq^p>|>ۄN $Jݺ+qlmATt iz%!o胗QNDhjoˉ^sɐdpW.! 56)7fߴ5 fD2gr!=H\Fy͗׋^()uP.g"08lNTo8 9*KG\'SZ7YN Zi%%Ip=X(,бQjwh"͍a;jtfz^|2r6`F]M凂`:8՞dKɷńy傥[=%Ptsѿ.F 3 WspS+ \7$Z  Ka )På<gVV{k'/R9\W aGntLx7)h~$w?V" 9m HzBn _B"(q9S5aK{g%3j]B/^uI Zz<}C~!hIu7jCs`s%I D sY,Dcmn° ~2\D\9XGY gy|[_2i ZMIrP[@m>N2^Q^H;FY+? ~$nɕLpG DD3Ɂv#VX0:)}h?\Q*tqXW¥gCۋΠoz+8wLPeYpSJf_ W"jER9#k8Mݰ`@  .>Qa ${N'o7!tr rN.^}f|a_wZկYsl:wȜѶCo2:_N-,&tOQ\ OߩXzt6%yѸ!Pvک`%u?f;ԖRn}=_>Y"æQ81a93] OguxD,&f9BvoR"׀n-R:!K&f@k);_˔cY[IPrfJ|'Psˠ1,FreT'HN8H^D B<@]2*@MkeGGY3K.%ԝ36a$qp!;FACk}0㇖k!>K'Ry;r! $-4N%ov_,-1;P=a+ ]9wȾonZ'0ȚZ'./~cy,d V]l|Zy*K% HR 6.N^@<GLF>و 8*K7ƋrͰ]ub{WI#Û_`F'ֲFҶ!mDt5PN_NE"3.iV~Pme@a.rs5v|>zE&QφJ&Wmqv-JS>62 x)LGWEDi2,#I%i W]YvLJr-a΢#xCNfb^p 8-i[MNk* ~[}̱+6̈.uq,c{Ka;__8r,<)p\SDl7U[ [1,3Ȃ2c0z禟skQ+m2 Zm/ezΤl?&W_sfI <Ϧ x|/,9D1- aYMJ| Ix#KQA mpq (*XybJ|(yh{FJi+Ǖ@Ex)\˙y'r9}&AΦn+I θN*Q(mg(vvzg斯̔,7;~iAo!{Z\3NSaqWڧXd#SZsH`Ld'@]>Yb8ȶTK%y2d.\vm`#c*y;"3 dqoyVfL~oُcRբ[r<^&'-5z4(p,UӴ "w%!s׎vX#=| s9īĒG`S?އ4CD Z? I]XS7pzߍmeFz;Wi[l:q0Om1Ev|r "sby.($|{Y<#ޣkJD`JJb?IT <߂{PYٜ-L A҅9R&2(T8@F9 I^")aNSݐ: 6m`+ V3E0$M{9c T\[>7|.n\UNg,NfiljF_,Y-¤@$gWvhǣސ!3f9`avCqB+ ](Эvvի ]{v~{,>N4:E"xwk-oSQ`t'p($ucM VD}\Nr\YDT5MbDH:(IHk1r]xhCω^ҖC.mV7UiH0>!X A*">??J͸bPۻ#1[Bȝ}*?;c$xt wK7kFP돸3Q/`wu[?4,:OE} N DdxlնJ/ zPH}Iw7- %|}ݵdzj>^T)U8:y6RJ[ԗjij4F=Ot<ǔDnA۠1XhQ$I!cǓ K?Wm}c0LSz񴫵3N-37.4(bj.&2ߘ~[_$1SP?j4IK@?zlg_wS&fN:ȕVg>VX@WXnpihiX^v/:"~ @8$X +!ڍ'.p1Y~a܆2-iZujxC폝7Ib#iBMM 4z' Ƅ lorAj*Xrn[dސT:Ga}BV}m5IPj᧠ ɹ?=5ѵ>By`&\">crb|eCfc]E,yKyptX>RbGvЦ0,6 ѪR#k$ ;2lg0dP@Ҝze kMFXHNNf60xK5oD.kjx ?n%%u/^]Bsm{9*\6$۪=F=u ôDh)eFEj\{xlvӆG̉^5:vg̝ \WphktDL~l3lmÍFʲ|IK!,304zuΪ59Tuҏ^J GH 4s#2϶w2ӵsV5vNsx s ɖ0U:M3#&YOJ?zu7 ^ Z1 eW׮?f|'%TgQ?glA ?QzS1Iiԟm큆1o@TK[*7p{<i5gǥa>Zq`lՊsTYr`YWͭbBF0اB{S[e!Ȕ65VH{bB0p 'MSΛp|}}]G%eDp:6^ oHLS:44C5U|V LFTB^Azc}3ߏ'-˧찊EB'JUfW&}*R dHN ގ<ˀ&hDe_ f_f1K,ĮXA{r DV0$>H˜_ 43`N aQA}xvuٲ2̌Ӡ҇E /H⸲Z(=|JdnIo+JM5!' 5cUmC3Iި7aSAP!(8{<* wNtw2n\xž<71"OkCܶlGlraqhx Y4CÂ+B9!NCrڇ3œ&~ףPV8sSxRo_x)ޛ#ͫH /a6-L } `r[P1TZǵ}8{Q -z$R1Wp-_ArKZ4j't>e(&wA$=n7Ag 3)v%LNja·w@JU<"b8|0T3 *B]UF#:ͽg[ځ;3g?s^>:+{f[4yM_'ΆLDN_=@23qB树6o=<؞Mh7iʃ^2i#4D*5OpsfsIOqTJ58o0oqQ_,,p:N(5TJj:zkk$k8Ŷ9Unx#郳]߫iP~V`74<ŽP(el;SegCkiRw5q㌍u} ΐȦ W >F4`D|y[f[W3SDS׮^hztMg M3"B"1qF$GYsx5{f& ]VҟSo.F6P|u*,.% ?R%'!'d^)_-;v.9lQ3"hͪi6Ԭׂ.4 tS>E'9ȣN-Hĉc;]>B,dʁBgp&Rmjw|=mpiEޢxeV`zje$ {`E-PA Y|L/&-i5 ͽ1?VZ3d落& jȣGZՙ=Zvs,C%HnI4{7D倈8'jq#יHEbFB.{5\w4qGΎ K-I `o0h_G)?rHWqþ90t:}%q!7g&oiIZh:`ob4v ҃?ʻ9N:R/ {k)G˳); yre,7 LI ;hS>@>~&& HZƂ^ oQ_qTRcDv#ĸ8;ri 2uqЋu`|x}e5Pɇ| Ak"@ C+ItjhPYBSEx쓍Asw2^7/n웆aE.2K13^4\U[zU@/.CYAۺ?##U'#/cK~4Ƃʾ: alEɔ.Ҋ¯[o$;gfu.e,CEXy%'UVqMYcF:ہ~whJ< I~T`Fl0̤g%s83ڔEe\ w`$ %zC?MJ9CU,'Z>HmrZ*,w8.;#w י'%yz`@}.#d@5B^;ؠGd8#ME*QD+/ ê?HN)K 9B8q\F(ÿP4$o?*" (:lW6O)CoBYOHi+o8qiؕ*6ߞ08` c޼2G6gBȖڷTuN o"R؝YecORV9!4_.qw)E%U/ >z}b~Z< qoXYymGTB75ΐ-?~d+GWV>kiѮ?Wq[x*I6y 19+P#眎' )\okaHʇ0),XFqw M={ 2 aAoĂgB D`K{d\cS*js9\ Ȩpö$n;af‰[H.䥕~VfMJ?3\")/-.̴#@¯-xM)OC!{# &LZr`$ަ,`7ǡ %$W4};KD^$vTm 7z~Ď"5us'Qya; Ղ~\wRpLꢦ*3-Ԙ ?.5(kmACۡzu'R90*Og/XՊAl@kF2h~Sցy9j ~W:`F] 4 :6|tTC~DC?` I^1yh )5x-템7g afIPicvt0W!u+[{RZ޵~q 3 vTp3+pPD/BOhF`7!^O04pFLд% @۫z5o?:J|6 ^$G9),%hW?U\^9K4L42x0*b1moI.rsxEL0JVDNi"͚ d62׌l˔T?%xj|fw8Uz R, 7/9MiP.3 juNNWQ''. zAZX4ho&k峀Ya<;W ӱTOW8k-*uܾj2-jrŬmAK@ut6J6SM#I?9& { hJ~ #L@Ӥ0ˎ xbNaVv6ˊB Kue_%$z-gňVb3;`%/i+vqa| uA->Ř$e&ێ~IvNlG,5_ X*}YߴqҚx ͍@Tf Ԍ-wUQ.oɹdq'`S⍒'x+뚎n8{M9<$1ola) UN[PERu` ݖ3g>:ټ%:VI7b.e}^N$]pٟ s=n6Y9{ E%(OºG~)5 xIh?,fx߉Mq|%&(ɩ+ظ[-qJ&~d{bf|!\mmQ2fk?]SsL#VYޢ_vـ$Fxg6z'hԍx= 5KI]'{ `Iw 3Up!܃O}ҀnTűSem0y5@yJ*3Ao+!UL t߃OK@7JV Qi9FmY.ʩS͉Akgι;RRʴ?hUт 53b2O\~]F-AA=l'*tBДkwCH7A1 JpPIR%]" "|;vvzg$Jz>'ևO\pE8 S݀ +l{f0A} >;(gmi Zj߷(:$T F%+U"|ie Q[a%V'`RZkTE5ͽ'zD<-a@e;Fӎ:#`&psOCXMXH7^K}UTҒRpUgy,ќ>lZ6`1NU~-f:Tʞ-汎ձ:)u סGh5%Q}S']' 1-26=B*Vekj5LG0+u"pyʰV ]Pd# #u&U5=am0|k$p%3ޝU SJ(QQ!Xg Yzv;'Q]9K2sBɧ̣{(V'z%VtGrVwkU8K'n>>.= 'p Ftx W)L8"} [z۲KԱٹ6" 0zE?R/wues#LYF1cW}߿::]Vl;N8@^͜`l>?'ZUE;avW-O~Bphs yK6)ŷ[̝ݒ% +g뇕\yF[7,*à*hأ,o oENYz2!J,RJ!ِw= ?s 34(zd'o AW[(;ޡ[SꙟnfG̮#iZ.gS&|21 &jwY8c*3Msp~KzY Ul10.dڟcBS/|y ΰxqk)HL_Nuo.LN7YqݔB%YvZv(rRP9I&}.gdOA Tw4uɷOO8zL~=ZfS,ޟOj?A?vG 05GBK=D/ܱs!%_8v8AP݅Hqss5CnHTRll8#;O::+!FqRbC3NOAvkn,9qQ^XA-m[ r1(%AUM=VW^&0>U;x2%g.+\wXҥOؼ{LROc\)^$R a.a-aԖx(>3EV 4 w~^R.qc(0WdYwK+[Rvfŋcudv5A1 \y`2s5k=A 3Cs9дE/h1'x xt0~e9qpŞ*0x@e-/oQ@d=}&}̢2 'h's<{c|(ض;R شj>_X ,]zΣg98!f[5]pj>Q; ' X %xf喹;oQR\4*E˘|?m*:FJf"0(;(׷ƹ=$ B!;o~x Kpj߃B~i8Ruͻ[(@RYSDE . UZN(@ĈfhT7]k-=mflyYBwGRͿ>I$ 1`}̴zlF'YTmx2..}-֞n`;5A&7L|-of6?BkguU=4-J-GL|h-0[F )8; C9X+;jiQi Ҿȥr%7.Ǚp9(![|Ig1"rńCB(y0|~E2i`)@ 7f$Cd"" u*F]öy[Z'e>N[{8n =-&%cLxG!uA5^]"eD['8x(//R .,v|CK۞KBrQUjhT 60CCoWxlUw &|W(>_w8vKK7nT_ dֿ4{&Ҕ0/>ƽ'r+]3t ["SNiA}#Jy7GtP!ŠW.o\o3(TG9Ke2;)ގP]7-E|\(_`T1 ɴ]꾩NbM a q6[?c%`wO̥-5 ǫَK얖+BJ^NVv̾8B_cƀϊjۃe Y'=2&+S+O FO#z#|:l)$&@97sq_M==MC0֡VF CbtF(r~.#Č}h~}۵J22ldLhwqxd!4ظ95C޶`II8y`\;ejU}'[$;V&'2Z{0rkpCgF܋g?0tΓs3`-:Sk0`S;ql$mhW(@ :;8`R SfJr(^ ǘH6#Uw6J'jQΰaine:il41Fl '@N_`(ca2M`Ӥ 0 .[HD?q1س:%8)ᓅ譬|U#` ہP g-#ӫP46иdՇߧYg.NS& FZif[2~5ZAi7Qی8G{@pCȋҭ(KJ V f\VY0J@^T(4 =ABbJse4UOR H]\+(.>Fʽz: U0Prx{ 8' a 5~0vK>?Z0j,X$PPe9N\WbvVLj1]eï0LJ݋HQ8#\ە jI%x~I. Q +2P_otq;@ ͸u։"t<%%rh=^b7Yj'| Td@.9>h%Fȁ+zj(s+aoykf&O*b% JnȕS JJ5t_M.T;ߠTk>Yn$jdI fls_+]K "YitbÔYտo - pbS/'Јrl8DK/p :|T/ ݼ0|tFZ%#w EܞT}"|,A~ K55Lj9'!#jA5:gc]- clEa%2!*-;sfW1ScAw7=5nZ@tFdmA?ӌǴ kQ魰r! GrQh&;LO,eعapК{f+XFʉ>B kifj᰷⪯=vMmN/JIc雹ӢI %iv$/%8bJ=;lZ ]`86 \u".,'D:4Kt{,0'+3_+v%jK̜; WVGj;)TV﴾Y 1 _O>"#d߸|'or̀30*އ' f^FuA cE w[XIIic)=$YYWPeXn'DtXí+! y2{N-nK6 fkJ'uVȧae] :}E[Ѻ]Dܯ`6 q"-HKk؜׽i#}MmX᭤7$2Wq"+IU8M"լ;M .Ʈ]t8/]69H}.Yu-1Rdrz)}"I5* Y+;amLݎ7>n"l-ϊH{$Qr MhKXF&! ',f.`c+Be]OH SٳD^%vœ9P?!h./3D(APA X{C%A:ė%jVlj/0D4H8[(*Ye@wkbb?c}IS M,RY{%.(g#~vUw xO)w p xZrIRԻ~14uӤvd.bmm4o[NX-.왽~i9)C$lT9xԿJ`Z蠿)ጉ/fsnINc+ʽÌX]ՈdY")릅H/Ί6NO즁B)h-keqo%?ObDt[7]VI}QV]xqr+]~NGΦ cTkU#k,Hs$ W,Hdj= "g:>k?Fy:/,Z^8j^ 0zF3]tAAO' Զ#7|SMRl\22+*q[tfqQbne(t?x$@MOG3 G-[8Fy/Om3ŀ(nB+R1뱎Wg,(j<Q9a/%y+MJALf;^Lbcwv.<=}$Ϟ&54]۴ÂQ1P@XBpji>q"V]y-l4qԵm=rhE 8b".߂͛\lb0S#?p$A>$)C=Fn$Yٴ"I$WnjZx*ÃbTn%Smb9"Tk-|ļ!=C{.p8m|jSp\3Ҋ߲x3cafT:g …4|[,xiaN\u+1yYB%$+1g$,Յqm No$Ư7JKhSRd 6scCk_su2b- kL>TG3Ty3aG;J(eq$fzL5g+cVU^;8+oIQT/Xg9*F/cX ͈ȭ;!lWar 8吠xǘija ocN_ GUv+"S;>"״ox:bݖ~bY [5AQc#ɿɼis \L("UEf4.\Sxv?|Ca8v/3qC_6M(S/SQ$/aQSWZ&I[{Z_/t쵏FOui0mrsb0n*{*L06ދס2zh.L;_Z%qRd"|,8 ޿ƣ^&Iz[j@(V "2,c6+͠Kڱa (-Wm<2cg>q+~Rd~61`|i˰ǖJ`zh<(bogul 4L1XNTj9%h8w N):4Ctf]<*ؗ__ZM7HVv>-%%ۏ@9p,#B+}Lw>Gz3f]tB4}(<>`ҹ f4:nkki'B(tN&\2yxH?-)1 zOܨ UHu6]z)-e9cwvhE T7Kp>Szd`wAdzCwz#F96ef@N,"M(%XW-$aեJH\# C>Xز".Kk*k m! %Ċyso{ !" VrLFn׿T\g+u>/I,6H;;J NlnuMJ{Br"cq^'! Ma?qxR^ݸu ? R, x<C>KuњKmL%/3K|l#lm Did~P_#eB:L"Sl k~ɯӒiDW3 ʐѪVX@!rO{-z;ֵasjU).zVVC@;v2x/.Ex\gVF 7p@ ^l%u4Yxagz_pf)'t%ÖGHi+UWU 9% f+E+yN"c2Zg4X s$JF]rnՉ4yͲզǤMW$/+](wy+ӖJLX`-ro#lE+Qk96uZ~QeWlKM) >M٧#@bsS,:eP4כH&=? ؑ>y. Elzƙ4_Tқv\Gzv׎pUxpz;c$36z_ U8 GYsk:5n~2|ȲY bt9dO).W8̌hKRwHG8SaңHI(TŮ  n~lpuniImwW:M(E-+}G}Οȸ"GƼuI1l؀ڟn.[!MR2|ءq^W. * aXltܭqHgIM[&ǣ药V+ɥI*?q&8W<0[␩ q_eDZhy YәGۤ%K\O%Xu^Z_~N=KV`0_eW落Qщm1:UjKy!üe94GqB\$Rv=ro+vu$ ! &>ܘ-c'Mɏ'+;f&y]C`^`.PL6X<.vvtPXjX]v`|7%8Sҥir(O&Gf fd;, {\}ZqkC0Q, *Ω걻2*sum!f2vN;| fceccNza[hm8E=&nh31Lxxt[Wt$FkmbZJ_Jm-v [UկGwM}{u)%cyjU=/ҷHk1qq>mAZӂqS#>xɝKj9Wx@u:ccJQoc% qLKxTV Xؐ(] 4顨o9V_hz{M(syqb+kCYY %DžOtG)# Ŷ#7jGD0gmf˗ )u@'S<Չuf"~x^tA -9TPOr{W/OԄD%X$` m/piUaiCVI$|122W ȲڶD1}.;ZqXա:HTѴ9$hSs M*s 0V+ EndgSW y3480#ɹ@+ԽaIL@kP?<{˭ u!KxP,>%vxQT FFY|[iDo˜'VĐ9dP(tjB6ؐCE>!ԥ$}21-X7br5G2w?]B40 㔬 qJIgZh1&%d.v_ou0U1PDd"%Ix(|WmDwەΡ'D1bS1 S4IU8!L1p;.J@E}p؈,P5kv'P[\蜏.1! lTb9 Z21;P2޶y 3 nx"Ojײyݻ1 e-b=st-,43X (%kIXv&|͔Qʏ}`ǝ k^jL&S<^7WLyJ;4s=gp3lBTsA㾧]ysǁ//A$`E,1R*Cc(`j#J^5T=[#LT[O,8 E΋l+:! (CWJH7,1 mRtG- tQ_o,/ =12^UgMVmӘϘ؀kr#o2:䩂Y#ǛdU }] b^4rjQ ݈k(P$oPEOƔZw=z3|Hup !J^ T F{2w#}.Ȍ}e&K8&b V}̜Ix?z1:~\--R[= Ţ1^t͈"e;rpۢ.+bD{W9^7޵28? jY;bݯb`vA1Y3I Մ%"& HlnARz~vip`{3aWABav$t5k1-7Nd3۪_b(`e J68+Yښ-SIb:.S,IMSҫ" y,87CqUWHld T{ Ugr0( ;^f|d /x5CE,]{Mm {tjim%+YcjOԒYTS2m4.agj, H94esENwz?H]7YuТzTԩ'>ӏ ,j}bF5%{8. #.δ jL:X6{5 &Za3#DT*Z7 3qwZTH%>C9)< ?\ۻ(4cBnw->=@ppҧW8ǝ;[ea}&COʪw {Im]pm=>_1W'}Z s3 bY9 ¾r ]+'$ vGiǴT(g}G, mve~c/+#$L$?TWIhA;g7u"V :ƏcU\]1f];%7Eg8x#_}Iӈ+08iD)%JFM̧Hv%ܳN:;CȾJ :r'|֮hֵ'ݞn.V#~<}{jzEk5G8:p&~* n-H82_7b@?/kѣ簲TEχغ Fg5BT;j]_kOg;` !1CM۴Xkj[9M3h{G6,OF4*, vevy0ySiRrFg[{?Wqe=ʉx8+ݙ8 +*ʡ~` U?6]r(϶҂{lVCeF\s2zm^) Cޖ5M]U->[GV&Vc/jïx`_i{CD9G1ߎ!~#x׹7 JD"eX97$?z}Nb"u/n=S,Xg6WDp<]TK#J&\QՁӓMpEs&Tۜc#dVGA&۰1a #(q7Lqp)HDH՜LUE_/ZP\wuxuzշsL}حsw ɻV2)Ty-= >cRScP+Hotu(bؼ&"I”.8Sy wj8ǰc|2$dvxS5Em0]L$n"ə[S+wDɝJטSЌ/L,X<!U"EV *T2f C/,4eԎNMGPs#јLJ0mb Λ;&#Hcስ<]5560&^ٲz|W{C*_Xm,ުR#A@mKK2P:d}ٻbFYfŔNXmv"I%di{+҃~qWȞXrӸ]x)me+w gձ\d9}96\my-{~+2E2DTgpAmh$'amθ"%ӣbx05BĴ,k庘n4C5rqZJ*XmM<ί,V q; &Gɀ6Ԩƻ^Lpn/ƍ R"Q=s=< W505}"PjO6bv:PtPP)ߌ{Һ$4vOcǞHDW˵:< u2k&t:M9i̠DXjsuX/y~YO'AhPEp$ӽDh @Gݏ y'R]?o$?+DqrU.'00yn)e9(#Mb.5.ļɄ8 7snU.Vꬶ^@l?Ǡ~$H.iknn*#JڮBy >]״,cpCk|*gY{bb ∫#{V"pRyYErH@`4R;`ivg\#]&AkDP 1Πz]Я]~@*jm]ĥIsF*yt:EKR*D;W}MLTRD<Ѡhm  #39` yݴc-uoܥZo).w4x%`"4; #=dK|7u~P''s2o7ٶ)czBӶ6_<AH,䄟HʄYlBK8VA>\F/Jٜz< [b[ZV3f6)XER$Bf|*o4|t7(sZ7+\QJ%#"֍gͷ35ktQyd I,6'O'Xcg%#LNh%˾q78?'ڛ:5\Mi'1y4? /.ic@Q yqouD=u^T9<#I!CI.>%B:8¾%%-͍NFJ=iaOkr {6k,Pl^R޽p+C9[2^,ͤع?x{_$xs[:]wZ_ |:+-Iy+A!?H:Q;JIŌ/A 70f1,vR֨9\'€!օ1Y2Vp]"Y%ݠ I,wz>Gs.E44B{/lA]Y16ґbMBj>KI]ƑUbхɻ:2^$r!Iחş巈&T!Df<<CqE b8]S#`ndHsU?1z:? gtq0&w700+ J p@8/|'.*V?iw5C?Սsnl-;؈s4Y 6#$Ęfqe3 ;ikfg>!]rQ*SKA(}Hm_~[&Ϸj Z(sD8ћ$k//jrA12T0Qg[_3"-M+cLq2M;3_i> +*O]6Q) ,8Mѭ 5i5,ٰoOvd" npaلs;R= xvҘt͑j9w|utsG^%D҃BvG B~&{|klcRkc֖r}ؾpNuv]hl sMn%] kޛc|_Xfݒ&3ZsJ^n`ÍInPX +čVqI`ZLӶrx$; ~7hvV9uL&u$ꉆK,f"yOﮋ%+brICoY@Tv:ѳ+ǒ8$!<`Ȕ{JT>ftkhi )uHʿx)\i2 pY"ح~7 [JD|W%S(頋gQWf\6-$~9smd+8Rò/ueبaɝ'J|4h]-04Z ;g%.8beJK$w_v^#*lB1un2-z)c >Q!C ^QT`[|O4WM ᪶vm`ܾ w^V鵠( zݗ&DVߴ:X0 Ӟ ʘي .2V }1T[["\ v5M|3ӽpvCa*9l̩[+&f 6\Ibp#(Z#K 1w!Fۗ_jfuT4k;"֮x ;\ j8Bٿ77M˛Gh +g~Xݐ`dn3=WXOyoI=Xp [^]t1QO$+p{n HUZѢx>a4@Q8^X4;iBD l20OC0U}X-78E< ׂL _^nd$c$~Nj];$ISg ,=(K R=D# fʘ #𙫜ov4n(wHS-vcv @N„ Mm$|0ĩ2X_UoVۖ?^sOMEl\X*'7P?Z] A:ܗɹr!lLjڭ;Gļ>y5!o`e--|ɚ]#6Xcڼp%ym9!-.[)8D-|-P=;L'BoNH@Q͌",X7 M,^la+d`^Mg_0 pB^X*/@&T~k!NP谑՘u,}JCl,9foZHc`ʀt*B;1<n/ qbYDƲ%] *A,ri@>+}gc\e$c<;pi aB\rmẩV +{=Ej{qo.@jcRb@! 7MC! Ek*-#AV%ceE&Q[WutLp`YR\>.V%íŒc'tՕ7ŠIC)گfL4f*C@-xl3n,7Iɶf $WY3-`0іC^h~RxF.kO6ޟOi SX\,`ߤB3SIDbu:E?qQNҶ!?!Z5LHOBFFܴnQk$I5*{Uj e#W76vq wݺU!EIKƢ1zװT1xqbYb`%|=|VǴ(A>`ĀL $"dY+- 6:3Q=V`8 VR}{o>#9b8dv[FmRhѰtX2kN4dj(l1fdςNϰcY3Xl$۔M^SF70$7){UT2Gm:pƘ־qMqϊgXTBz̪nOK^#l*uih!wuVLoJ2 Kbq65y&5V [`Tɐ J[7m7U In؛2:MaS00:Y)BVl\Qy+R3:i# E=| ;WoOtΕܗ쐘^~6/L0a/UԐhC `YV%#4X"Eքeܟ&JEeՎXA 'V$[ï9|:_11S@@M;a2f!6rhv> '݅ѕ uXdfw~ŭX8pMaÃ&7;+ 1%!|Y!*9G2bFNF{^Ig I+Jv>6.RB鐖&17ge4鿞KmBA-?C0S1#H/aqY}|oD,B!' 9Aa9ߊ0@mT or֩`]XXEVb ҉gr>)lkA}*o:}D{T DJB'Y Eg\c'qޗTBEK %T*yUݏ ~ͫ;nXX%ۓ>ZUM Uaf-`4@SPIK3>Jөɋos1>1=ue~I>AJ#NFSZi;0Q[itvaXyL$kXtF-5Ú*$:VӞ!v٫gqTrZ>u&]U46ӷZo[OEr?% O`ZIB7A+^kW#F\1EQG=R INo#._dZ߫D1kt&LuE#VT I(P 8l?Ph\`P6NȣHn,t Ƚ\D.!p0Zݦw!sW\8%=@ܹOyTS)isB Ŵ/G`be8olE!g]*X|͸ӰdT9*xw_`Y* HTi׶.'u)}?zQK ʢu&\KdOy4Nzڥƽ* \zM?xbO1!lSOP݅xg_Ʒ[?rk2}IZS R,\'26 !lqo n MR&`hNKl#_rEkm:yU~OmF\L ؤոN@i5&/fcMNKj'FaE Da|mLFwbZ=8WV_8t{4g5K&(2am_'`zF 6l$No(>HO+brL~<ǟZn5֙,H!"ٴSQI>{c|vǸ X#`&>R\ϭ ,bHRCcl 9ڣ(pT߰%kf[hh9PKb8 + z܌dJ30€/UcbQ ;4f[,^_lOK. "g-b<#AF  pi4hoh7).GfXv>:\9S0 |y '>uxc"I4ƽSD 5 `B$&~;[c>ί[tV7$̛+LLr{lO*if̞ G9zInRfD8v laK=Vܒ-:JV\b֤"#Xd)ξpO,(ǟ6z줎|/ASLq+rHeE;@3>ɍg6 "yQ8Q \oA2I}Y+\fzp#[b# 'pT-O+*3 0>ͷ?Ѓ) M . S2ޢof*PbY-©~ÚBK,f$NF:Zٯt)U7xsW%aoС K&*.ڍ˲õ`K 4HkTO۠xS;e9GH*ކܬfK&j̜(C"1!Y p@2p<lmweR9?mk* 0ܮ&9f>#kzr-uW?ᦞ_3Я/fDwg%BC tCۇ6gl}YL:W0=ȸ'0 M$\R-H \xVe[C(&F q>& 3t2@ױ>NqM d%J[n-q\1ZZz2%%rGn1"u:4`w,oD?S&N݄Y LEԝ#S'qCtz]OtQp @* V \{H Aۨ_{&NHkQ5QpR~ j]fcPMsMvŤjk-u1N{+f憎H 0X J93X8gַ|.>nܕ5'jbH'}&1ThYʙI!WǑ#: k=3h R7gXK@8𢄀3 \XDt qLu&F礠P&J~;17X0CNg ^3}l5w:ףdM=q6"<;\ Ǝ!KgeVibtB[ZYy8>p(81&c+#LBW0ԊSiZ@qmm`>뀒2]uaWe`tvpM͜=7PT8+]5Om{?(sxwMhy -0on5*v;n_޹pv& [5-: 1?tS^cﱔn3_ 7ݬK7Lu~eձ~Z~svpڳnڧ5qKd&lzQaJc)qtK [} '~AR bQ J)d+xR+~:*ZV{`  R.qY2OXoE&U%H7>ieG@tDdp[<) @?1!1d]$@zPY[ $NGߧ몍Ap4ڑ@۳} DK&f^ RuN;^^/6WFO8!tIJa!Y$LxN-<-nqR_!(0"*n*ƈGxNbIe@9׋s}Y{SI&PVRQ3E3gG+-')=5\`=u9EJ㦉7 /3H_d|6Y]lkv\sKU*@˄{I(&;[ ωN-1ZO.&V -m+cXqw$L${Ȯ|N@'dx?FrwnE )\{Wq[<دǢ4T.ln%mx%P2$WC46T!sVԦO荊'PboM~/Ї5I6b*G_{4: dȴU0QT1BK,0vۗ$3Zi;!1{kSϧ jp+65CK| [ &Kӫ7#L4S[8m.2bcIl&w|Ks4wߠqӥ ȴ~@Bl'G/ Mz[j ʙz!AEaثt`5sP<(`Ղv 8%[3H+E"8$,E"vv"M "Rpҭ*Ж#sܗݶr伖>_})v~ko&$=%\חN)=6V7t'96Za}ϜZHabOP(++jPb՗bZK+Yf.6Hb/$YVPi[\[J"U3GW(~ʣD"l،EeV%W{քam]we;$h&tAВעد <^,; d1hX廜Xx^! /~MART]|*XT0 ECDSYci nŔᖲ#F:dGw+XƇ(slw,imE&)VB`S/8tif)<4)a`s&$ 4 J+kcd\]wDd\ *ҺntHG{;`ʞo.W+\'}?i|;'p·;z\İ> Fq8*tgA*A5SuI/2!$l2=z%_^SHf'G T0 ~*3\lQKKI|e!޲yqAiiHW2]K[˟}*)A墳U$v3˄&WTٱ_Xհx-J|I@xg| q:!%x|Dvp-2U$gD3].ȄT͘?Ͻf +)0#CCS 8t{gлэK}!/'P$Hn F8#>vͳ/ϑPS.'f/O]ltFcnvM=ayOi[F/ N>4V,KצnweicYm%8ZB%Lr14#$2TvntEt`9ayS<5.כ`bAi# 7 3@Z} l3(!d1i 8r%zxY|jIJjyxlo9YpIDЪw8^1lr2s *oU+J$w& \J}V!s[8ˈVO;z:4oEfZq @u@hr,TQMؔm*lK |-Qf93/'?B v}\'BUCZZvnnjVdADJOpd]q,JY]`W}Gfw#q͞sy@ wM~=Ą&gY7#舷=1 `[6fn YpL Ո[Jb diߡ:Ш8e&z7B˔H䰒$D^͌ 8][%Y6;OgqxG!l1F(M/M ữ38V ~ynX~˽p>I"3dŘ/.s${s ,s\,'ksIٷ/CIhy;6sڴtT;h8@/803EټeU/Y8HlsIjHA/ (U<@{), jjÄw{?P9k(]P\Qq؎rIwVnuXkL R!yl̶?T*9=!]sȧҮqD%-Ր-Up#_#UMCWRY&BvS7$h)hؗ?$>U* = v^AS3G 'P=K;c&Lf_4=7B_:"2pxOpiwtsJ?Zk2pWOvÁ{$^\TOƽe˥kζZ. $@~3I}Uz'˘O085} #6A ^~.;[Xsd(cۭ&G*zr `Hh Ki&vPBH8$A2#z@PfMWȓH@8x 2G%?.H)'bNm]9.!ƞ"7<у.<+ۥVZشwDЙ|6L)ޢUj~წG7my yCZ}\hHӘhp̀ >\,\|;RL"tib~@EငJ-S kzvMnrMJ 'fF>qQ-x6DZILoF6M? bLN/og<$n<2=0eO7礈]]ƐKʚ-q!I<3!45PiE&N(詳 x& p%]DJ2MqY=؁D--pYxCGn"TOX@g2/֙yo;2whs:(l(եjV010&d>:+D[`V/ʹAcLo_˫AdzWd O'tջs0nͣ13/A@Kj7u^ln,JVjHwyWj(XX#^vЕ߫݃ KZ@N9bf~[S%nIHw}~/ƒURt˺ @y*1~b6- V8^+Wrgʏ9is'_D \l]{L"R sĀ.j`?Y3܂ l-%r-g2ϕ[9G`Uͣ; 81$MK ~yQ*N*ԝMKGW@2 |K<'[Y+76#yR Z߮= ƭm(oщ{??hѮy W!3Q'-[PwT_=ƺ>mp f/B~?rP\mӂ@!`x˖=PEȽzƺ/}ZA 5U ~gMe/9"bK6 O.{ aYM3i vw9)\-p˚eg8fK _T2_lz*kiZdɂR-\ڵU|:Pht,0I5{=jn3[Hk2aODh=Q A v`c`U$\吔XruίrG?f|:VȎC;*cOtN?8N{,`a=vqpzz6>aRH̏odH ~JQ: BρwW\})j<[ˌ~/>FiI\=U:;w4tSV2G hDgP0JXRp BnkmxmDnM>'J'7I ZH[ Aˇωf&nM}rhwʐq}2e5:4c#mA *H@w(k'rw8p^q `|8H"} N}{e,Nn4WrI [3HYgTQs b]Œ&"nϨAy>_mc[)O)-+ 9p Mf D:.RLߡ}O2Cyg3XdM\9v|I75>EoT4G5#^MkĶ[ȗ LGZ:ˎ;Qjݪ3uQ}nub`GZZE65n{pmx@v7U @\"/w,tc0a:3}J߰iY>^yې[890ht9VE_\bʢi׼Խ-{!GDƽq cY6/Xƀruħ$G aD<]hGKIϝf/Zw8?c7Hw lp+b C؉g*rg2ss"won4!yϟ4;E# {K! ~RIr>5!dc^69ӂbލ-%Ds$cy}en؃+ع^*OR@dܠ`p3f%ZtCPF22W)O}56hl;pݳHXyǼ~F/k7L9o[tX31a_FF4#׹5cKjvJ:VOYO,x=CiV+`q h^?M}Vm 2i֑տB`Ձx-`7.J̗܎g6< by#>gD$dT&rȳ7;JQ]T.'p8F򷹚U-;,qu-z&+6"=6 kf3בL>կ:z{P+/m;ל4:GM~E!QzOWt7^{,])9U(:~Q88:.;\Nd9'qN^8 |`ؽʫW5h7۫+ҒNSһXdHM=DWp H󴥳bH;^һ.+Q4snchۛl.uvZdg*a ( tD&{vmzUn^).Eė7. SCz"(?oby=1ԌJ.3b#&rKa2 up/0>UtgE{{£>@I~l5KL)y*>Qw'.TC4EL ㋷_EK܄o'IT)+-)GSfO,bXRd\ea`ehQEr's ?TCf/ Q5s5ݢʝyn3t~db2MPwa!O*- \xڳ[%y^*P;=K[8qa-u:d!/@1i+AסUC L6^|ϹquI۽j=^v(n%|0zęfsWeZ,[Aj iA;s1>ŭ3|Zx :Uot>(ԤKvf˝-o֒z0hƛp ۧ`]3[l%+#m "-EMKQ^dZ1Y }$q2[1{P`?*M_v .AWd-Ǡ P~̩d/%'UY!PUe@55x2GwhAJl2O |B/%O,g 8cKyxOh<;46l:p]TM`ܛK+CpA( ER  |1@rGMwQ]~]Ӑw(*K.ph̝_3_FHN05߫>ko]R 0@,!2%Cl^mvy5+,/>6XJ6:`qw)'F:y8p:Q@;VQd`4₩_m %_0Lӕ3O@lLx ,D9JUaSᡎseHqD(ӪQ0ER=}VwVd7֘Y~tK2٩מ`vw@>⽉2[LWcGE:E[1F$@Qӭ"L{u39#֏kk 6aa2%6)HѮcI,`4AaMXm?$lH/'k{Ʌ~EW_[.>4G<Hx :?I0Jmrc8ڶY˯Gz9+;Q_1wG$m.}'2{*npviYmC򚣭S-;j].nd;/Rg_Z0&3ۃ)HbcHy3 v<&  'oGGn4~ig6v0õi걧e0oEZ]G&T8>w')bY" .P2|&N("k/+[_k}36nt2obm_0t-d?I{2M^ gG-S'M԰=@6Es2̦;A23hcvto9]!:Cb NHA#·ᐩݻk9< HK! $_1 ퟨ&jd+Ҋ07˗ΉcbhOBYQi .SnWuB/8)cw$|eq]҂ѥ!` +e+wyB$/)Q|"bFU4 R*"3ԃ8mTTAoIMrt.PuU(&Vkw%bSI!^]EK*# ?"{5xaA77Ԋ…>(`dگ9tm6"C!dܶ_(4}SWH=V$JЪ'wtVcӂOMjE9߄|jȺ_%Uu3,Ă1Un_`,Զ331eˁM+JV`o4p?HQ%o`z4&4HL<*A!a­bOc{o?# nV0B"B^[%ɾqSo-xWHM:dpD<ɪQh6ly1,&PWm;D]n2`yͲ.cیn0Pw$lLGF:a(C8o*a (@ 1YyY7 J$A@4F?3VU&zFCF03GCQxA=#?ѰnƜaK@oٛ"g~H7ӑsƷF@1Gxq=z{R؁]6ly%*k5Pg~j?;IS.Dv^)f^"OELwlg)-vǣwk >Sg8e\U4ѮO/%Yt\EuG[F0ZuPIK }564/S{3y}x 6y" l^ztFç9m {ЎPO4wt!}{t@s /ea n\[.˕$# &.!RPX4{D9${Mylss#=)zMA#1'B|ݤ fזwZ;a;)PM6,MGYt}C!(H_X'sWStR 7$5epI6O>]S$ӆ#[ʳTE掮 ѪsjA~]A*򌂺8ⷰ}"!Nk24pa煲$4z\dcwY-bca oLKw7"ƗJf# (|Q~ZЌ>?KS?ȭp@GHbeiB[.Pp /df~B D:^3p5: 4Ӣ9C>o}{67hҳ \U4+RwL~GO8[L|˿e-,F-įRSxP'CC \ڎuFh܇K_J4ZXif` 1m{/؟0"(ksڦIV%1MvgRd=/z"l <mSZ0Ku+?&B;Yz3d /"dSr( VtؐaX); =%H'h l_5P]"#Xv\*~ :]<yONTS/FnAD0Uhq+d35]]7 9m}b*2'j/V!&ҁ~@AV|>=$XDO;<r)c5ZPO5w.`FibSW09s_X`!WC؍a0^w37jf3>TX[9(BG Dgن4'׭JX4 6YMm1 `{|~Y𭪱v#gLh*^ݣUK'"za)3OFGO ̀K$n04M;Wz*|̖Pb1ޞ^kj&Ġ_+#70.$v2Y?-lQL2pُI=ăF2Vn=l n:ҷ&,ʢg'rh@PSk5e_?""$|3y=\Ct]J4 `{Vy`*E `{tNg|50@0S ,԰fQOKzu>S"_O~"()6Ǩީqh8fT R"`_zq5bY Ly͒W6r]pa@!YVw i[ܬU~xn>֦R"ίxsV4Cr[̡ 2Tfط: *0(= 1e,5*_uop ۗyTodAvҤ)nuQ[8ɺ~|/^4bU\JrH[L4s+B=E]`!Ɛκ/#un]. MSq^IVT$"v3scqÓUM]9@4Ѭ3YD!Q@Blv;c~tz%ٛ v3RaI=iI-ٹha`€Yh|{9/0ZNԺv&Dxw/ ٷ0n!J6%?Ͱ7-+a_:H/ 4]uQ| #BWS,G{Ԩi31 ڭyt2 r( I 'X$BdMHJE=[<%c碹gL7ҌQ@&=hSkS7pW;Vwc4op:Y7MN]yV+&: \*ad"27]گ\:e]V%s Q}?KzIڏ7ts!iQ9:BM6o@,qɘ21 *|xR#kN7 =X[и!}I1rӋ/W" *Mgթuo݀TXYA{l %}˵&T 85$HC㢘 @d1ΆgOo텞V„$þuDóT[qqUF|u*mȚB{gOxZJkM9;8{خ"lU`߹5aخ`G#'MYP m).F(-G)"cEI%vUb~\w`!)0ȵ\#)͂2bL®Vt G* ;%r5fȞBg(=)Q|Rr5G)_=uYK5YeOn=0b!%(xDTkl b8"XhvJ`#ٴI#1LQ;V} 3ef 9gŸyjS˗5x()`!M;H8Gg< A&!3ϕQŐ~|Y`1Ubbw&z"H,J0TMLm~MpHO_=Hx¿/3o"˸Ex6A¯)(V+8~Kl9|xƑB+) QYu?ogx^+IAڶt*7')e5Q@ԧ hb2ieX]4ZL;~JOm$S|,愤Sي '>)RQu(d1߳==ĦE5cJ8@ n .-E3b GYlXPlpθfHAWH(Ḳi%rS~EŇvZc}<֘0Q)#!ey4h&ϭ4uqU5B`SEb "5Ǥ %_V.Ъ&=FFNqM:Ik #є>:+7l DJ/H1À冃!$A"@eP$,)μ$h_G\&R!= 0#uH%CG鸰Y߳RS>L Z#^]r{8}{+3G$9Z1;(vz<0YZh4[*KY6F@g>FHW= NOƑ/ Ϋ%#^_}] ,)|q,T@x]Bh`bd%?& z:>D˴D "3F# [GvF)G 48V['{^qHiJ7&8;4 _HK^&[BYz %QR%Rxdg:6 `d[Cyc٫s-Xnw 9k{.sȁekʟps *466T (g2~ިmJ0?g%$@ܕrLbPF m`T(cQ2$3 덙fZKgn.:# %* >m;ѡh=XODG-#Seis+܌VMCzGQNa؃/9VyΏCtTqi%ҬyL(F7"ih)f[fb2Pu&tXH;m xA")BuuamM+8ߤqnKCs- /uDfS6T+ \Xgi9I0V!4ኗۭOգ98J,$vp_EcFGfvx@wn]Z¸m%SZU^ {\Z0 b^7aw;-9\w fЙEXJ&}y>G"Pf.}=USY:I+22o03Iد*WeUÞjxOɵplT/.گh_Y==d'b`TcmE,W]ٝzOٓr`-8tr@JA$"w4k< (Hlu\ X%կN"߁ 3uw-[e̽C+ګpc(rV"ۓZ2!mJgcEj.0Z0u* (˰DjܢEqT0E\(Fy'GʼngH+;$x;ZqWE.h4l /Lř4*sr ^ArCóB.C4#Aڷ.Ynn®QsCvG2뚡d y=X.;+9AK#)vQ",G{yhfPXTYGrw3#?`YQHr,2UՈD<#bva aڠ}cAP?ڵΡ\u[g̑~3(q\gF,t%=dwzlOzQEU}ĺaryU]*NTZ!IWRI@yC$8V-T߸}SU8eK@Cn7'CYnγV nȳ͕9AܭK%ҹ 'v@)geiX nծ}m\49x\CTx"M:-qیRD(Y&CjydΆj|rWGt9a#|s/ oGl*-|@[aݡE7 2֙K53`oOyC^Џ]_ Iɕo&Ȍ#hfCJb|3ds; Pju)I .І<k^C;M 9]$4Gζgc;(A_W?fwrWYi<ᅈ9,ZBx=yUDZZ1n5[kA*FKӛU+̢PLAZ *Ըbd)jQ78t mV*U>w#c"; yn?Ԓg/*}-,2[x Dn|41LY^iQs|" `PCG'넞a0fptq.:EMj`xS N"P4ܓq!7T DIy\#NG͎4WEAцPT 6_`j$j^=PφZ:8`C"rjFH?WMϘ~"p  fh4qƛh dP l6˹Th!).V)J`cf ފZ T0}`EedJdyZ!<[W)Mɦw-l9: xSkfmZv2F耋 GuFsj.y:%o+*fHDAt@q?3'Rc5͈~ D+ڔuk qa%}7CqBE/1A:`*tkhyS魨NXQ<9C%q8_)~$όnMHdETm%ũ:FV!qql]A;Ps`GO{1YʇɖEfh-ZpTD}hTJBܑi4|<g}$@.$r$h|$ꮚzR`,Ooe/,a&4R/09mʰc4wjVd 4qmv"KelDpA 4#`d8}m6“4w RmfL:RC8˫!F%bV΢UXYW`LNZ;I)UҰV7 4(Ws_G@__bbW &ʓy4l1iUv9'z^K^t7~_v"Z ٓH_5|Lj^xl0A!m0ba.ʇyM,a0ר(;7֟r #E{ c]J Bۺ_#* \@; TUzB!ː?F;I%Eie=Er ^oؚp#Yxу JO1"΅!;2ؐeT߰uRE:LniaՐDoL͘AX#`P`uKT'J|bN]a憍O-v#vJ0c v[+:R38 :kC?>"C)\fF.#}$xZôː+ĝ,oL>3}w,c0;Tژ߹e~,, v?ItTe6`"/9&wfKo+̒mN:e!Pzii 7o"e/ORyfAk_$ i o\]=R8tB9Xp8٪&{ hz}G 2'*¥%|8[*#/&C{Ewo Ɔʭ,!8 7H<0wL\H>x髖@ra)wNUU=`D2]9E/PIQSGotM³wl8B D{YEj.ۂL/^I®TdSXQ-u%G7`KE=?FA:5~:$ޗk nuZwLFX˧C{ITF?c~c ܊p5ӷN<:xne55 JR >iLh9|.bKiJ:i" "'yV~e+KIq6A"?|3ϷF;i3c9~p_yX1-Gj~~}EЎ$T ]}0\o^/븻:P+FL@ +`S~PڍEMG^#yjnky޸O"w y䓉y#ôc3,2꼂x]M7V7WD̀f fOɅe㤄v^azj~բ ~EQљ T]+hZ>eV^|"n,۷[ّhAd+o'l$`ՔmT5kf@f?CnVbSbHrb )Km!;$N,KֱvE'$d<˰3UOLGavɣ^.nI,ӇOjުZ";OuNDIͽ}H {oo 3p[N6-BWz8򨟀h Tmτ.PqJ9hnsSM.۫%/D@SAV rs%+2Ow69XLI?%-t;V ت h?U+"RIuF'VBo yΏsH423A~OfsJ齃[xJxrfnt-dR?nXKt0L%3t % W00h+EvhDy)҇Y!"!uBMڕ*u7>%|9JnBAeo3!-ޚ> S^: 6[إYS&ꢎ+UJ(sVQaN6G |CKFa}K="jS#VVDw NΚqM LMTi>gl }ja 93NbF`Y9 ,๗ǯv"<>0d􁑣·'rywwiP8~fkz"[D.fbAv煏I V@x84Orc+`U+6~w9 .Yqn=+ 8{4k4E$:v5Q$=nTs`ǡfE\` o)tStEqL{nwu$H mVYJѥU&yV-]pI|r=OʎoY ޞ+ȫG10U2tZSvMjf&n@}ŐI<dgW8l%Tyb\؞x }$ 5<8tߣ5tmw>i怲q^bDfc%ܵ5Flh>P XCTAt>Tkd9{zJ9Ӝs;}*ʪ=󽤺e:HD#(K@ؓg ge˟E56!s$#[W(9ϣ>^j%BapTcX,A3H5}95?Z&;d(+ .GyD(HUQ8_$ѠH]&\˳Q/哿0jS8h) hDp+wZ);?bm䩬= ? J?I'fu9b+~ Ƥ"%4Zs"`\S%91 ml*H -* 4cF"mg,pV=*T+l9O%oLd*;X*]5 GOSNnjn}K}-q?ycS '6Eo;27HȊcVbƂƶ.-D@:D2H36q(C$2Xf/G/j.3Ǔ!׹6sFh^'+75ozZwSVb~Țqdm ەF(Iz 4XGS87\Ц[E0TkhR 9NiE3`4Τ! }!84]*mŧ&Oؒ?iXF'`GDwoftCr_?qLbx E79!=-Y2ALSZ/LmAYQ =]Kiuvf5<;:}ά,/JޛhkEˈڑ c Äb!~J:,҈Ugg" ET]D2Y-ul&fD'p`2Ԗ= 6Zb]=qRK?g]i7@>YlˠK<;UZAW}ifD=Y!PjC(0fA`#+ۓ-W '_<Ï+:VwE6} B-FH}=Gx\?X~ &>ۿʗrD'iݜu-"V€ZJ_|HCoV"ONugu|iL--8.'n+*(>C88t&* s-(ML説ָgn;= !n/ק=imVᅭi;úZ&T,`WjgEH 8zh/dK_aʌb`(Ѝd[6X[mI U?H:B^v5o@'[sFA]Udr[TCoe.ެdŌ n5bi WM9J-F{"zڇqB Mq<+! wŹ'UM}.*>ܫ Fd_*>xB2ua e~ 0B3t"(jRdrua*)R3ʭ['y&-G^UIpT7#>*o!]xNZpM@?,_Sxb2Un\jVDr[ؚ+jƛOm6 @pݣUBnD B$B+j1z]}+DS=_2U*qgzZMؐ.Vny~'jy.Y;T/3mPS +f`DMNIvbq 1f?@ 49*V((eXdfqRl 0Y% )(Ͻ ؁ :7=hτPf` U%"N(3{+O%! wK0EI$gQ3Q[VfiZT+M=6]uGɊ yz_Z:bkFfHĺ.*mo*6ž~;'lX``YڐHD e`.Vn7r{ms>q{hDұ܅ \~&fq6c:tLO86uymܨ汿 2J۬UI%_ j1PSaԆ h36~ 2{쏠I]uh_2j9=mDa3݃]WѼ`@lP=A΋G”~ $ݢxl [ PD!}q|Ց>PT![|x&E#=!`mj,szİ9i{JHBBO(F RSO7>(K=׿J^L*l'$ D/DLb 6~0ronZƣ\h+ vQ I" kޱ IkSUz E@L4bTSyAh#>@[(@oSf:?] BNoF(W_Oee=jcVB:H7{h&'Jy^75$T( /]6(>PƔJ.%@Ov{0a5+=( sRKq>_aFWHbR.3 OS#.S5=Q٦hd |ImNo:h؆cr" Xׁ,mEH5p=˓DC4GۖԃgC>`䞃[4;d F@jOUJ&rڿ%EC?wuZ6H)q{ ׄY d't=R4\yy "P(v!~{{S` Xn8OH J;hUR61Ξ>mA eZ齞"GQ}cCX6F%'Ğ=jxЅ$,6Ix #KG"'X:%f8C+=pV7)*?؃!ׇ.6#;ug7D"1j}[z,& Goj*IMVI,C'요(‘KwRwqL Sll|V㛲hvt$KIxAz`A-db} L=YM¾ :K0ni-H9iNWT2lqchommYRp){q[XhF5{0bHUy1I9 &T tgZw[i3QUOxkCZzȬEa7 6 uW[kcv^;Y<|U/m96Cml8o TK "W77bW+Ƃh`A:d4δ$7 г`FeeQ"fU'` gԛO-&dBCjeS? !2 1!>4>C ަp]EqHZ0%Яd}!]VȌ,kb֐V %|^H4x4{n.M90y36B ?Q,;}4qd-Za\T[{{7 :Ɍ$/7ҵ8L&!9vp߹!V!]: {$[&F+8"81I/}@ Vh_:}UB5hw50DM_FnHiށzh2vRR65<;s?<Q7垴.-BHpB )f/gA1\}ct7p{`e/oT P6`F,l1)%b].j6 ^S*~4R7tl(XhmdˀUyCg;O0ǹc:PDZb&#&3H qp ܐ`F]̑!"DI5ѺnDjV8LIO,%I!*+UgU}\R_[k/OG΅ث;:1_29JHM !5ӂh/8.Ef4[FoJd޳8|X`֚ABCMgmX"źs֘`,FйQP*kslo&I#ÐLB&U:={v¨$%DYZϿu; P" 2<0/Ԭ^M;ʽpXY1|# *+xPV$YѾi$L&hެ#bH+vRJ=+~[ Nϒވ/D݃`Sd@ɎLt)7/?ȭ]AοhܟZ58=BG!SdA 1&FP(x0l2K8+>{2S^rRa9(?ơR6Aw*?B;CӂRRG1U5,L+uU$f[_!σ mJa9Ղa#k[W͜I[#BM9~x_f,HGjq{?b'0p_IY߶^>~m8S2r.׵IXbb_kGU5 n6Nجyz+A+)k.Z[ l;x('tbK<\Yu'C՜!;<ۢku(h^#~cry_SloWƓ/KH.iT7&~FŲ.3Eyw-5(Op3 fQڻųrt?1Y]FfӢo% -TQ`0M:Pq;R榦ȡXWY1_4 V\=5Vq_6?zI@J?= q5pb [_8N &CBM"|w55K~X~VCiV 5adn!}ׂ`%:uxk 6Ћ.w# Hţip^t1+v  8uKue2(rE} Y)D{-N5ePf~o*4C6V?*=3[}DS(X1b; ޫ׵%R7F1RQsP9v_=ΆW׆ѻf5c߃us-Bb{xɸd'I22DKflM -i֒+l-z&Gw *7[Y/Al̐v1}YXOVrmF5v5d£2sR5l T.r\ր m+Јg:`cNJ(ijQԾ U}+N)e*go@aJ`+KU^78=w"ivD8!/[xobdv_&j&k h|u}":z]ަҒƠd Sd{>f~IMMDIM(a^"T[;d|t,!Ɂ! ǶʙB#c6_rܧ8= aV5$xaCʓ{(JB}&_!,1Oi wld\'6;&6k22-?Nㄖ[#ߖJcwܼz?Ypo~(kG* SNJ8b~ѹyāQݧӤuc >.?,Xi+u@lܛ OrL&\ݐì7cۚn$9Ln/'f_~D$T49-NyA`Mt׺6E6[*O4 >v^q(ijVe2DL`w.δ释K5meFQ( :jY(ZF~n!蟪ˋ;HL :Db=Uܬ{L@NZz>_V^B4؁\>dC%aR]꽉1 hMt*tT\ra;6'.5hz` us<4+TQr /CR}_mZ`]Jx=|ҳ`~r*̻t8`W`G7kBvJSbjy9nwHɦ+O ݳiZq &dXTn XyրrU?rs{}+JAbn7ȾOtFYձ汒Cվ,g2.h]:t̍|8rNf,?`<+t1s~_/]77eP~>})vq֬7{C[k6647DʨVa<7Ot- IfV>~0-5{9Η$G7H+v|@Y&S}fPDUs(}pv+$ɬ F$Xtb| K_H۷dkׂs$y Nh*=pQc:Պl+aG".6;a`ݭ˭X_bvh ͸%źc]YX}KcC >qXu(V:).zw"_|}SM/b]+-TaCxa_=/f2)n=Lߩd "ŘZi!О. B\ɪ6FwElZEۙD[_"{` n i x;z>B1F 5$߈d\D#nhff87xD2XU}7@]tIW"ơEK he=J 4ƥ&0 ʝ!s@@ ]MvĮ{̡c`Bh-ć=ņ*@<(s/'/(9+f_笫-ғ4dMZ4@0&h]tH/O=~U躞$׻CG۵TCj|8o9l2|Q<3zrwSG 4&5},QFYQmt)wmZVF2u4(!`5uwLB %SFB}J ajX7Z;\g"}Q3akIJ 0dHƈ0EISDqhe] bPȖʨG^Zy7?~{n)2Ko]{=x'ľΜN\#ŤN JE_7z~)aiZtd+̓@H /r3%Z[zo8P lnl; Ŀ\PњGʬ VM|ڭ frm[i'M床ZR$;%9r8v*gTit/yCXjsٲ(҉dO9 NDKkQFXbt,b"J6K*60뀲v&[`Pֳ| D ka,,ݍ*=] ?pD"i?mϛBpB4BtФt#od@[>~Z{(dd0}k4A7?WޯxhGOG[ujx8nƤ~&nn]ڧxD7~i4yPeAa2iNlY6RAT}|3TgpSޓ N]rdzOf&JRYdž(6Li!8,$ec|n,+foxrc9(AiQ9Ba; gd8hf}'P^&d?hmwD~]@Ł M+~۱ 5E]=)Gw^HE9\ɩ3VU{`O>TE(̮=SrzYS, `Lm}55ui Hcj|:ng@GP~s^F3ˉOX:#6C^s-V| E( 8[ a7_b0<}T8l܅AU$`JRoe,Zm(yGڟcF*}:m?0>ʖyə(Rt%ᵜ٣03ßGfq1ɹH;4:rC e!tוvg8\AbX3в4\q2feK?- AJ'f{Ǽ-Ti n\! `論$xv Pw*c'U&yQ"Ex/֢#‹h+mtɘmo4BcG,UY[q"Kïa1EbMyF6;x; ~ SQ,98Dvjbה9G|S){#{:+%ŹDu(`vosI~Ҁ$܆\(mwH)YCPNOIQ5ya?Dxn: =}W;skkF']{!_6ʊ:D59g$\oqE7ES g9tԁg})Ļ5<ceRﴒ5[Ohb7nSl!|׊BM)^WZVEn2N3Qy57Ơ;NjXװ2h D_-UވTz:b]p$`Oʵk/ yr+D||@R_mڙ ,M`Zfw>d.^T ѓ`I!h"&n2}Z]:seL ={&($'1vKR.EV\M3~DCWJϾ]=%Pq(#? /•ɋ*dG"Ѫ0LPqg:,xH hNJBHb/I~66܀H캺A>7a;K2== Kƪw93q>33l{,\O,/ $jO^j췐S= ,lZhjk)$[yQc^fD:V]im(1 !Ӛ;[۴R9 i ٷm颺-Jylt<=l>+\F@h ig}%<0 #!O|+x><صFRs %D> zSGv@<;%q6>L+.`Ԙ2lRmHE;څHSa`\xAu ǿcPp09Kb76AՉ9( ֚ ]cȬϓ>s1ѮF&o(&V(7v¾H nQ:a1UCѹuuRkIRT}!SL60HfW #CKar޹/Xsn7ڨ5\mKPZ!΁9b+= ʹbMm</옸?!ՠdV22\<@2bcVYC3 ?&Ioj;#dޝeyM % 7Ͷ/gv7+L爰0)Dܑh =z0x}\sK/hw${4r"Uƶ";)$Yf0@sZN: l>L"Y8\P Vfp$)2wSo~#! >k͠pTZeAҙ8-H/lf+ލ9}ᆴmHIǚb#oKWcn!/\='k/ӿi(>+Hr<% րv"oc<ǘWH \~ 븉xjW˹8,R0lLvG "!XAm{K$Jb8u0d%Ü* bv.邋; TbBR"[bO{h.˓*WSNꠣg8tE"b\+J} , vQP^}炻pp[rCLj7x\ “8pWTNLJ@' [|JLm{ Tw{Ù m#(q@OL0MD`D:',; eL𾀺1WtGjF,ٟ{75CCOPeUsp %BH쳤H%—Q^8$uju!T^d i/E%$i5a d`@%^XU (,fa^ ȏB|?I -u ! YxYE XA=@klr^ xr%/:ҤcVj-~wm9/ђo˳ioF79Ud{͚D"%}G~XZ z*kk؆L Rڛr1ͧ+ƞT9ō}nęd&zEiJX y^]d-ĺVo*[ԹsARdaC"yR^S*M;ۏ4C-Pp߃O)?}NfM֐UO3{ꐰ#O3jW4)Dm,4]-ʣ<3c+5aQNq+۩6(PJڂGf|3Rl- )s0I 2wHmP!zr112Ha51ԟ;~RI943tPK>)-ՉV@ɬ7ę>|Q2>PK)d}imS{3_Sќ-b[&[ӐIg':(#].b7_uKjGD>Dxc-"qg1hRl)A~!_6WZz^Uyv-;dnW3J)R*L6* K45$1pAfø; @q궑ۥXl- *d>&d=rDAsGpRnCo [Wti{I> 16KƇМEӯLj3r?X&A q8o.mF3U/.yɨZ-"0)Ph3/:iZCeUP5g6Ђ7)q ,#F6VS}azNmW^)N$̦w|}g\(2nbXYc ZATo][^b'4Q3,‚4BI[A&!Ci_>G Du&"g&n' >H) N >`(Ogf?.Nܠbu" vfKi^8)I(7UTˀp?ٞ|ƭ䈀KZ'YUVvqZLa.*"ߝ,¸*g7l_zR1hؒwaH|,I֘9*xY47QW ;C *ԔҶ1_P +ѮO=& PkӜ N4\4"Y$ T֫}3SQ|yGvvqfd"Jq _#Q7RҷmaD8B4IWH}48Miq :KҳZ 80)`Γ/ g%evt_+8GCed-vJ񮡞]Pg-&@8]fr?!wF^`!U"oM2g)evj'Sֳu/E*_ @f#@BJV_yh@zgUq]t1AqP6͠l7P[K1߅rg*RhT7կwheG*-i$ŽC r 8 8|B " 6(Q[\ .|"-rqpS+w!I{;7]  W6ԭpЫ/z"Ol^XE$3ђ%@;2$BbJ֍ۧDEc;;z{<g=)sU%C C?.+~+8E<z'3шhWw ؝LˑoܙxA3C/ ZDA,\ZUsM&&Ÿ9ڡͲg> oDA++J 4`5 p66dpOqmɂi^:V;od_W&0{ u~j JKtΪJ]΍4Xj'-{ҾkH۝=Y|L;YF#u ͚X&~Fw B%UH 9]˷MWO9xc,.R,Mc:b =[&_=(3q'1Y|ޙY)'XͤA٫5-T#b PXm'4c]~ qQ!{#lk63?OB]SqfP@aʵ_n+6_!/js3g`, .Յ:|x]ZG_.Y$f&p]<-ǒMhn;!=)E(ȇ.:䷜|?= ra;M~!,ۆX6Oa'+̢T 52.AyD;`b WursҎ(>) ɭ*BʳFWCseT4Io5p䆳:hǙD%hAvʏX bDz\3rxQyԃEswWt"3K&+8Fx-bVbH_)>F#er?=IJ Kg3XC-( v]+qn%%c [. >tDEٓT-mK&Po VIQ?p̤eb nXK zwQhk"55| 3J׹c\Χ m/Ey%TTݿX -܃^[13_5!@5Ӷuܚ'.G+r &EMW,yȌEd_hS]eQCGU݂3t~KV*$= ȔƪALqrG#ŝOPs>q@ B`v5|Y\x6; !̜x:zWY4?Jsdqe# !ZB@Da,hn"SjCXH )8b'0Q5 ڿD L>RX![=Ò5Ozg?G׻߾q?"EB9)?DR< CZGpe~LÁ ?#.n&yLp[<0FJeS{T #Oľ&1o2 ذDAR ?JHncGа篨]GXĂJ=F]~2'*;~<'p +-s⬞U;< zIIqͤ(1#A;(!ƫb/(n-;WԃG /} Ov^cR8/|rpD$vpdFbMxZ +gLM"&40aOߥ䔃*!ks@f0m,\B$I0^T`LQUs${q-Ϸ&ca5$ ,D= ' }vE[9B{?o^NuMjk[-Y <ƈn0tJbf#2soZA- ~z٧+@k4zVٳ6̇ş Db" lo`R^hϖwV>Q^M4I,Iɍˑ2kA J 4GK~gM/ /a)5e,1-[, cxf6e%hդef~>Q4_˵9dfw BK)dr 3 Rj'@H|ix "Pm(]a+rZVfjQGT 0L7wQ.R_PGUL *YP~4&iW%}>P~=د}h4OV?rw\SoScB?K޺Yq\p4X,M"!x4 4t,gHpLA8`B^W4@j3E$630'( 6}{bWZ4E4nNWkN2FHL`N#Us?n׹ $j7kiìZ<9\G膠$$ߣArQB)g TY);9C_1wnX)g  3DTb0 l&܎dCA9zR@iM؛R@a΁xPIaNu;`RڍC U<&V~/%*8/wt_LSwk L JGQ˨ ۈtj m*<y%1uR-|$Vx)Db+D]~k5ֺpkSkp g:;6 忔Q1\# aHg/|@n#)s$r[M 5gj y撯ny.$unE3t:fnՖ]Q]EaS&(qw{s_b{ڈDqb{7yD?{gD+ 1³΅lYC?|ω2EqkuQJpDbU\b:]Gw큤VǁAą:"u閎E n':x@R|Mp ٰh )fW+T]1HpX z=-a>⎔x"M2r E_yQo6W-sNyb?D\Oٶ,;7I%awX҄,d9Iwvwk%ܚ)0*vH}8\[?y#R}3"q.&.c>+hQmvg{1eطP):ʣ],?$B]Dd`qR]c!|sUc?\ qӖC2<0KI #m:Ct6٣!m?ooK9]KtM&$Ϊf5u̍~ߘ!/-jU?jL2Adh6:+SIiT fy]ȚЂmǎ3뀥f@{GK|OODkTO-zGmW2gq9`cYަH _|g?Zn&;9:$I=%s@x2-a@[3/͝)Y@ΟfPxAicSy[[Wlខq0FT9}iH%3H03Zc@,u o]jf% giJ؏&002Id%:yR=4[cs)q_1d%CMݲؒ{!&BV(_靈d>yR-[o?t2ܰ~]]f\,[#$7z9SE{bwXvm)~vϏyu ^k,vpH25 =f9cNumCI:#"@!hz㦫9&|5VD{r[/Fm.EC$e9UV[׬p2IQtmX  x 5p*PrWB )pNR:/:?#N|X+mTiTخ{M}P(^N樄.2!]E` ׫DV/|hrR#Q.GO5d}B$roA"Ƽ٣&Y~ J_\W.zrEBge¸93@"9 MV6a<kZw<.aUf0h~\pˌ IFפ-I δZIRj|K[Ϣ*&-/8DmYc5SXFL9R_џ4vIR~ (:ψ䇹:T~H9D]irEA,Բ75nF2Fs{ҺOBK̡LpJLi7NKvDM;|"wNQ}237ҙ9̱|Pjd3~CmcÍԪڂa}EJfw9SU:)1ņ5,'I"rSLT&&̐^TsAz`6.2-nB7+aYHUXWSC4+ZNޓ^ՖΞ 2ܔGS)4YI[~^ޤ=Jpkg(ovGriFz{Dt&8GUǧoD3Po~\%)b[ݼ~?yZH[DW_2՘`rYTei̝%P@h|sOŒUل=W ܞVޜFdQc$Bүu8`$GXrz#谳 ?8! OH!b"_n|r͸ηR2"-@^:p1@#> S~o N`n5$UgpI,gAn_u0tނ v* ^,1vv" NZ?jM!{k-h_^t# /cje n̐1uAY楜+ U}zvz9;Eۡ/݊U/Pl:b kzsó0˭0&>QU; -0Ѩ %ߟfR:'b"L!_A~p<;O͹eYg NG 8ƹߙ_BF 5Vd/7E97cl壪FIXQ :/5qd5>1"_lUQR^ULxb 9 ܰdm!v + `Lu]h65)G0`qgoyAi'Fp"hR q~Q`KeNR7ϐ8$f'X<*`8VӒ%:xs=qBVdm9n5WW!D𗉇0]u:DvQ aW;kgO-7`Hnp+_nW,bC'c9_ۖ|ZhsTXpȻ0/A7y[J ux [Ƴt+vtIĞ^sIh*CUj)!aL3C_ `p\: :wZ5¨~HKx <<(pY R!>an"c~. |E2Fv)jœVƱD}$)*Rq5#ȫrLD,xοG77_Dv\Aǘ~W LW+.Wzzaj V(Ǧq,"nolTt“"@L=@nR*!4tޙxG~.N%z{%Q!I5E9XDD[ujN-Y?xIȽz[6Rrc cכKA>zM!}X,?_9|.TE NV#WS&{|:5`M?Sp}B䮫ŹU? l(IǧjhX (u, K!oX߈bب{m f۞6'f]'fj} Q<*u! Wӽ᫗*_T tQm؇++&fQ貺Hn!=M34iR/{sYs5A%kѰX>v ;EJ]JMQnH^GxfS3pxv]{Լ4OZPVXа*?[ B8JoUnH o0<85!%FWpYᵙ"}.pKŪ"ATCүQU$@aP)js/K+RgeO\ZͲ=i } >~t§ruH]+2|_L hDnWY`:V0[HުFxVCgVT.S*7S_ؒڞj/*!N%.MO/Y8RxN;LҬO0ۗdW"<߰rtuT,0[(&B>O` IumGXde9#qQصA9Ps;e++MUy= Mm';ܼm u{j Klfϴ*)U@Y0LT*El$yO^joSGWa2Ֆ ҅ǷUtPhmZ3)) ܇UAY&#D ?Wd-fCXp$Z&6Zo}EV=c}),Z-*?JZ ۽qPkmYܗx'*"W}'j)ųd= ظQ8a7m};;WLYhh^&5Iws YJR!ץ1&{"81@+DxHeYA5ϣN6v4[c7}3r`52U=c椊rw7K13>jfLMJ(!t{'Y?!<]l灣ݷ21XrBJ&]|ˉ j m7{b6ìCr d7)βyQ!]AB0Bq>(R,/승uo`AѵUFcYw<8ngf OI1oڽ0NtF@ >xFy얖OW<;L_+vVT ֕i݌d`eZqnI[_ϲ-Ȍj"5!lΓ>M/L<=}N0w.92PNR@.~}qZ<|0pWo58۠|84iB=1 P +GˎW`}όڹk8'< J8Zŕ>S )7 :_nfZ75u )=s$a0N3j1b<0k(xS,O! ۀ>Fm;OOaU#EBSPjlsVɺw5 M*1*rSn!:aJ~3u֍{̓ 4K4f[* ݀'yY^H}lm^/d jI|+:~ٽ,}ڠHD킶jlK$ATWq30f Z%LE\\%qVXuG]]4A:0P1 )iKTyd6 nw=h7IP1NǗtrx[,gr 3OՓƲs12 oq mwO w٩o'IMrE1LM^|5a.vuBQ|OݗKZޗ`l nMӋ9zέlBpV(/3cύE$מ+$ t;2d(ZtKܚ ! ҕw{#N.aIHMYHS_`Ѳ;LE'n^Nf"u#y=2X T ,Xڂ2P蜝iow?JuMbĠ2[y˘bOq k6K HZ}-ʣr )灌DATn*xWқ9j=9aaSqRAKܜ-Ȩ)W%+|H}; * т)>vrbA>%M2@#)'Ƚ,-?֑"Pvbyżng蘽;#Zim% r7[f.5S U-˼T1h@ /H$1(}4ry]rDY#>o+):@oóZG>_|'J/jLEȍAh&mw5Y?]܅Dw_a:IK;']ܾRR=tJpʠl?ϻӧ@}|shv.⪪V~~b#pMpd I,.&GՊ{0vHzo=Ǐ`#A}seIȯ/sՂU|Lё?v %IZ+i\7}AV^N,~ '~ok<X?Y LJ= ZPn*9E̒zAHFU[8jec 38~nŐi.g |PF_yxhdAKA2J="l &yu1TVP\Z7 T,_Z:I漌v&γlkk~VI,K))]Vq߷T0N!&zr1%J͟+|Dy[*ͤC8GHٗ a %Īv3_#"law-A(LD+? :kN HAᔄ'enqJ;ȒSlE5#Y˶{waV3JH( L~ R[ZgZy)I 4dc-1U 3g񩇌x=U jȊP ԪfY{jQ,w08]w9 %2OX^ pi9g;b)d7'lBBL`[92xXVCnFyд=+-gW".gj;Ԃ۳2+7I+;HكYlMOVK>'~SuE8<nx.0ȑ;#VFvԼGD:3s=!IEąe,BBz\Dr+ ?1k? G$Yʈ;ѯ$fv奎Iݯ8$Ypbu 9j& ?&1jxF=k$Qps 5\dKcuAu1vW`p*]^{" Ay7əs Pl@zh,Pe 4Z)mȺ%Oԁw2OƂK]LfSʅ`Es-9kZ^_Q'Dbf)Hs+Ɇ'B$|jI2h3/ D#N}r#udgCF3q+7UOj+[+83#^rTLG/Zbƽ(]Ayuy5KՌe, QVHguK&+fn%9ˣp *0;eSdr+QqtxTy2uy܇"FaT:K>C>ue{ }uLC4_˲pw$駣t+xŢ>bᾬ||<"s"/Z[!_x(.b}C^ؐ yJY|\ԧ( ߉\9w?klIſ-g~ȩ ZKv/'؎AYVsq19ߐrXLvmtm\Uw0' #(8[댺%('X$GL:PO=́7XnѪ)L(dϏ^1mGqxꝌf4m܃QlW ٥)-?W/+R}<~@axz&"> ~ wFVBiͭeҼ6$/@C޽&N_:,!718سRSϚ'VG&PMp1 8c꽪"D{f_B#LF*Ҧ[Ŕ>ePr[U/[ۤߤBV.sR9ؼTo+^,K%n2⢸:+ǜ/&O&5WOWMcϝd}gꅞ/ɷ+(d^f 74rhCt4촴Pܳ"R, fδr2 ~*gp_QgޙYOJzOc-hzd{wmQ@%f(ni|^%9B S$wT2X1d)-#rEB{\裳RnW;M&oTU&4t[ bKѰ?v3 Lـ\ŋEF AgjSI^Ъz<6`z-LenM;  QViIM|1Ԯaj'pH P'|^ QJCik]bUMA}*' "ސ*nhf@XN&x~ 5LEβx@W +j`F=kdp(#L6ZO kG|z[ǀc̰Nm6sz#N f6 A}EFAkpAnD-Bru6 ?n20hUOj_AɃc 5!JWЂ*q`Ofn;:1mg>Jyq\EvHs]բ'8 A[1'/lp7f6,MËV-h\y9w:u )B%%T7֣qU#w!ZI4h}&7! ?.6ԃ*-_uPI“yJWnF֌~a 2 !ga|W`a#}7UƬ X7>"GOxc=6í?a)g,~U ,瓠q5EPOVa[%R N ׾5 }2g}qdΣ ChfU@$za3ٹCMB-,!(ǖ%L 5L `wZ^~]md04X #9a"m9m.sTnkԧ_S8Cs"yivxEP1 \ ;[BlSFlES"qOL[|K. ^mCWfZT,KξSÝV55SJI.(F?hArco ( 5hPþ"kD 9 ƒ>6 ۬l$K7S4>7 t=,yhv>Z#%X}F;viʚëޤJs%$i( Lg Z<մȦUJ9_!r#lHk8>BYNLc*%Qɝ@zRZe! S`*_-C-?+tCX|SO(~Xi$黹 udW6a Dq]'*"GD|ә};Y=j8F&aV9:?y=hCFBZGw¨nKI,{ZAKnlEmu.grN={("GAHى]W&wj2pjh #\ Bputr]/=ezrcGyW:}廒5+w lj%uXe-ɫZNkqTlAsbrZG[+! ^a@E qE)@{s\=A|_rz]Q~صQ|x{,RNh@#'UDl\q^hQGHص"Op2ܝ E7>dYe.64Io&#N;8<ژMM. ƪ( e>m|%F P[,r* DҬ)G?=Dq=>Ե}6n͘AZK lޜvSf&*4*!1 ˩Q!niJgw(fL}]o~1g\q$)~N_ōE*q޺ ُB|Nllru^L҉Çmq~9H~H)ӆ"|^h%7 &=RS8!rLHIxCSM>~n )جr%Ҹ4pSc@Ur$+fQ~Nwt* y'=.9 L ؠ`AF *_?Ls,uv~? )0NRtGnm&$`:$);d&Ig*d ڞ~WY@ltaEKpWݙ ^cھnyg?mYrܡwrP!U~ܙ 7h}S][jtNLFʜxm:&ys+$=ŋQ8n$8_-+l,۟0x& Lv2"?aƒXno 0.7J4?9'[~N3v4WSBZ&3OƮZW =j {rVPe 7|` HN7q8r I;m Ȱ8+|;dև:b<:cQ|wgZ39f$Kh'uSW__^)FZRiv;?$W%)oڋqDk'?ANW{Ř8o)\3H ȯs,n>;Y8,[& MMʢ־65*/F!**X޼Ʃ ƻۛ<֖}Tl?d *Of B+Q4Z^ PT(\I3C {ck'sA!7ST°y=K:@ ' L6 jKޖCt?އLݸE*`^h0zAN~*F$ֻ ;lW{pþw ]{pgN 쌀L>{d/䄘d} CIWt_%q}MpFs_jyFhQBV&u06šYyS0Np$CTTj?`]_-lQ)$ + EbUben$[n;/9ݕl$+PbDCU:W樦(qށLu"Me:l8CcWU9__{, նI~n6ж/m|y$ܨ9sEڬ&.sUWbp?6s{nS%{~c$CZw@VoW!Y+8#fX,~u}⡻柁*f! )!ݡ)\(;$udr'z ;/SԜj"CM䟣=+Rd+@B#[Ow/f>}Y#JXjLPe3a_L3%f8Xce#nPb&ɷ:DAS*`%V\Ѩ$HWBg׽/[>ۚ_$~<] 4ÌLV d Fꞃ#xҀA?_-5q 2 ٿ|aYK wR)+ŭAvVHkDH^0޾r4\?$P&τ 4hkA)7-R WX*@6N6XoNgǧ@ҢSK!Ug!I/kqD5 ]x:Bsux2!1".A%E;vbZRBW >LM€<^䥰Bx3TyyʓO)qM4`;:z\IZ]!gKJV,Zge[L/%E;m>+h鹣M4x%g2MN>rlwg5uw)0k~>Qu 37i[uc(_[w˒H/K̄6'cU8'1<ܢMe˥<9Dz;wUJqSdqsGi6-W bxc^eJ"Ң@ML'81 ˠfHoG鰖AZ緵 Fx1Ŧ;.$&FkZR-C Qq= 27랕' k3q2׽ fx jm-Nj(繑m/T`zQ+/bx"bq)K'kY71\͟|UOZKp a .>yn4,3+`_%Nbd^_ڱ ˜ >@V3ac>,3=&'g"!ܛY]+ ?X&+pq9?k )dR4TE5k b_`/a`,"hlF!+K"h/Y&CΤ>$LYi\)~>ܬiIF80bW[V)ء?a`+(l7io&_? IP%2SvUq_"lA%PPLnb57H=*[.fSf율& D }m|7TKFW1pP_'kƬrrʴ`TSrbbg8Sޑ܍ta8ZpءaH/{4]LT4K;V;k[h "j%ʽ|+C5n!7@^O΋R/DJn88)KzX/?ݺ8UKQ-SXi53x`z V<Exa{/Y;}@ӫ wU.nd*F^,-{5KL!YfjsCUmӟjTפX%{Z,6 "Ję-"^mMiU/9plIDfh״F}(2p#le\C\R6tEݱ8q6ڱ5ъ=D0@ޤ  x3~kZ޳İYV" nCיּ!?Qڛ,`Vz(,z%j4~TU'r]'~ 4KzLۧ?lBZNc1Ky-T=U8hYA8ΒDܺPM=TEe7?V/%b?tD8ht>ݿ+WUo*h?0 ںX>y&n#JG +;a U8ZcN1^;c@D$hUsw|Db $ZPʌkW M5LEIvYW7|cT hPJM;S޼M/d*YtW|\pwBe4Mo^^;R_pr[-Uc+x]DۭA;k_͎.Bۡ VơPam"6.&>{Qmn}@#nJ b!p,9F`W^S I%/UkU~.KpҌ~} :+~+=MfcޫljV <8Dq7SeGEG8TֿMD"ǠYsFldX9ϨpVz1V ؂Ş#5$[!A!WγCY!<=2s5堒F I':[K@mA #)'\DYC[(*} w|0HWgP$y9dma<ߥ~|σu"ʚsx6a]6ҹ]=Ky:K\FR6dOg C8lz-pª`Peglq|E U,8 '2-D} T,)`}j]oöoXt긍D7d&nTa BXgMsH zܠO)5S wI n;b*+ `eYtnkv༘2iG6j}2WEt ܆-d~G): &? ͔!m,,XU=L Q[r#Ys\P?@a/1e>%{ ڜ;rѶwy:ۓFdzL\Y:/*3aUIt>}Ngxՠhi ,tUt_J/x`izKGv/y8ՖB2),o6>+qҏPXfTbNSmg#owA\S H ɬCz-p5Yb~H00hP'WۚbX{Q"Ni ṁ:!Drvw0,̞r7"*k\!0}D>Azң>2:(B|KUp'B*X|a3AH5V@}PN^P&咀ԸF*-Y2MrY/5SXLt .ht_C6'Fg- фP.A#F,$G)BQh2p\WA,iEE,@KvTjXbBZP oAy),8q:LYz>1{{wSoqFWR46FĩdqBgBA:xr5]<|LW'u{UE B"Eu.KwN9[.WidF5=`2@8cDuY`TyKx [2HL 6-=z25O2Qk҂jN>@j)4 h6oDlV!g62' ΤHW$:}|);:21|&ۼsH̯;{N?:b.vǵ$;GH<{g0|jJ^:/FSa}pd=(T_֜Fg-`=no-APQŻö "1RDCl$z :I9O>G;5пZɻyjˇd6 \*DG?[ikЉ"RUx0-sFW[l]ͻ [4@aQUr(/_iFY/l=f6ׁOQNz^. q T~wNGxE/^MbNOLK&I?c)Jz^= w䵹!FwruM c:C,%iЍktH҂j:E jch$_Uz=+/icIDۛ@E֧S!fYp_+&y7bqNiLG]vE6վ\LX;1RfL&=1^/}F]a/ xvU=*R]B[Te3VARv"CV jӣ&|WOR,t_nZ'M][Ucjy@_CdԈQC/x558OzVvEo`[kYOW0giXľf)KU=?jE-ҡܸL@\;)v,9ȾX}|0b`;`4g+iGB+9 JIțC(6q!E@Vt+wN5%h "sO|(ugP ]*" pqNPzbu kdU[y'͜Β+})rvZ&*O`sFy-`yMza )*<,r}Iź|aqiTr"Cu4\.JfL ,jB`'X@!P,ҽbjTn=A f;W\ U=[57ڀPƠ(8X`G[Z&_Ccc0?!P¡k"KwUq]rn[nϽwFylj(e5W,uG^goϛP Nu [״(WHh& ^l}2|)ouB|VLV-JI)$k/}k(&0TQӈRXB۫%} Cq偁_ְҡLȄqJoB~=7'Q*y ZN15MK㱓gyLR @CsIo5|VC.jN_VE* ݷ.tЕ;\uy(:n JN˩l%u29]yBPO%3w,w᠒"^Y+"[Kqa!6Chִ3A1PNE݈0l\-pO`r.}w3lU~[ѩgEMnAS\J( J5`ϩ/Q^U*.?X(얛./EH !>tcQ@@n{a2&^W,|EVsYק =b+l{=$HלMbDיo${Em(w/X]Rw>צ.zʐkiX HnjtoQh [%_0|"1i۸_9~} ^䠀TYԻ~z$6 vnr:PYA@Zg+Wb f)/&}eO5H[ʕQcKIfgF¸!ؽ$EFegDezٗ}R[RtmF:sTžŁVVD. 3}1 hZ:dU;K/_r;۳[{y5/`T{74WƊ X,['Rhg{]s8NF؃6 )o0oFosdM(\wY]c0KnȨ `J-MsrU,$8ಷGNM9;6Aqӫt`Gh8~9ja3cEQeiUo:`΅tkEA|oauR.u4By*|_86݋i66-!uk0(Ӻ:NOFȵ"=҉6i63lhC&'q1RRk/UrG^*;#v%o \=XTۧ.1W&j(o(Ct1] Fd );`|}Ojki'dT?kMD0"Ѭ Z 8zOV& Pi`s+pwId/gCBL@Q ߛꯇ7?q-H%DNM(a|XFLT 铃QQL1qBbwЂqp R*^ՓQ/% dцhT׏NT?s[ ^C?5{Ěq$ay4?$ۦu_bԨJ#PV^3bX f*fjrW~E:F fX"xe!7譬9Z_4pxW[l_^^HhƍX&p>D>!SxbtWŏa< a jt׋C馭;jC9Ta&=_=fdۣmv^sc;Ob6@F5G+ԪN-f%B!>>WfmU}% R;UIRFϊB;8ەjΡ/?s~Lig/TXI撎/{; )JoP]$ƃt3΅[7Qu+\f7GT袟 snqg#B|l5 ѠMYYDt4H驉'Zg> K^%!0Q3Nd }ʊnAʓAbakƳAtAJÐHaHn)BC,hTc2 % }~)kL߇S7w yCΞF_з>dm>m^$?ĒL-+~ۄ\ ,װW*gFsfN^*/|J af WـR-=jcyZ&zdӬ ! vVUGyٳ^猡k&{_*hØ+Lm[^98{Kg@2a7\VwlBdΆnCk4s7F~e`NyMID&Liy 5; h[C,60{{zkTY+!?@MQ^_ŅX8kq_xaB8?A{ÖFLAjdYطMh7vV ]j9+8#vpDe؃}@> sCnTV+ 6ТC"gHs, 1FؠFLeI`q*t7VْQ%!+ɥ^oWߙYP!D{] s+^Y˺ dÛ.ml9Dĕ3 Rӑ55|4*;y* )s竘 YRV2U+Ked.<]09BI*O(a .*KtuV@iWȰ݅Yt>ΎK$/Av\L )ₖȺw0lxg`{Q~~Z2xTǗd]ˤE-D{-F᧧~C-J!ˎ%fRC$1%X~a> 1F20T\ť0R#SfGƚ&s۠'y?>7}ಇJn[@H[b3- V #;PkhFXʖimj-Po!`q;~)vClaIc!NǶ۠(k%m@M[)XO'ÞC~Hb:8SZGky@GjCCڥGk;`#DVtAȿN.բ6jєkUd!}èަ{9yK[PvZ!IrϛN4YnL۟N5H XPH5̞8)sSJy /";ss?`CJ%{j_T[kc%][ wr/ʉ$Ƕ˯zNE:Ќ\1OE1Y1R *t w*[V׆0ɟ83uOyv/`;``LԽxb(zuYBt"e*x"ƒI_s5Λ rA"]<귃;Zr{cA7Q~Xp[A|a:꺃W%_W[ eP䏘,y'4k r/k(z;֟'$ |(s- y'xrlUvM# pA?O$+!| ȡ Zx^7 $@&i `HS9(r$ӻhQY$,#{6QJj7n"AJz&g&qkm8% /P@h6hkoYIFb%'(_;M\H'9-Va 'KG>2̸?N%d]/p+xeq./3e}xM? C{=XcetEA=S9<˜wxKGU<9ɋ"sbT2 ͅ\  $j׸$k~]\tų 9aB0Pn &uLע8^JzV ,)K DOBA؄1X 2 FuFh tb1kZœ2W}csy^GE\%4Hˆ5, !io6- U/Z]2n8=|zOH^Z srsJed &Nκ$5Ju1lco aP+gEde8Yo7xh ڎ28n;ܩeGDY^a MQshLo<|ɲGFY2AZ(Y 6A5F' aiwxV=ɗˉ׷MNi郛z:xxmhב{s8ISC *1G_G+;~I5G.P<= !/X23S򹠕ѭJaؚu/2'cm>)ΠsUԵ'DnDEi1'u$ǷR dMkt0"Ιw;  ` k!JaXbAie+灒;$u4_ u{Eک JF=` p34)1;p32j`GD,x讛)[^Ky@aZ|"Þ국Ud$"#mSxP|!⢥mm|T좟ERz^W5vC;u{b^`:7JLv@ڰr?M5  7NC.N\bKjePv "SSAW[eH;2.P)@9?@MW"hM LmvX-6k<:GCJ]1i\Zݛ}6Dk<"W B&"O=,!P'P h_8Fݐi(!筓coe<W>?9IVZkU@LVHGf_K]#$ڎ1c{h_K.SmHU? 9K7e@a?4ئ쪂츂:M烓‰\;HJ_Y3h CԚV_N子}hGv6L5\zZ\Ŵٝq,­7+vil *uE{R)u3XN&,]kNËA_"{y` jpXܻ_̭& "pOB"&| ,8o'=Ho"rx֐&N/fGNn GI/O@D>,;GaJ5܋A>׶yQaȟ tNd[nČ>E,cg엛&!/ƊjIXF%-v-Q2,$RɅ{JK㔆Z{»m/Wܙ-z3o 4q%15g5z&_I' \4oI-׊=l1V+ M]w)ș70M_zNu^Nn53s7F9ox˰U:dj$bHKӀ4-Z;9@$^Y7'JʯhSĒY+HtIg[cqAG\*SW٪-3L[q,?>75f/壔0f+ e.lYeoWJ%0gM^J D:!kqj3Gx x#Ě:L Xhy{=̔}&M"?Ì4+* eN0%;%E`+cIs!9 ;d尿4Pρ%῭~&9]` "E(fgcs 2R!yBNf\l'J|*^{Ȧc̪K*KK)zf[a(B3gI:÷mJNiyb[ITj|gɩRWMryZFY-Lq"p6gv!/*KUt  D|ڧ2rvg0+5ǕKO%kK }ZĀ3GkQWwl 鳝$t 3-y*}:eJQ0mpRѯ z7CG;RIm{4n(cpTo5[=rK!s;9s5+&̥({gYsOj6]BR/j\i'p.vP&#}_*F猕lJUxj.W-݋Z DHy;ʄgy<7j` C@ˉK郌*O O!5>R`k[SXm0>ǯyTUhr^ĤPP 0up8L`'R' -غhF[e)5Hv:h@e>֏z/ZEwg ^wll&5ʄ'{e(gE;oy1+EMrv^]| TK-Z&L1ӡGD =j8"b)tMjWu( Wlj[*1+y/Tdi#|r _&GrS`z\ Z6X.ϑ$?'w?GYB~бJK^!brifljuD+EJ UŊb*<7\hř[cuTkhў0x0弗wi)NgA Gu,iɾ}Vdz zOӥ&8A;UO K~$ uMƬ l6VF,X[D+[~-Bl]*a/ITh\y\.?Л-XT= ̨(ٹ>BTRLm^Iq4cP\?AzA\61Zb(ʪ%J>Yvp׾:j?zftJY@zy벧Le*jKdد5K-ds?Pа&ngtfʛ5X<> [ ٹW Rn4`FʄR'Yz/gA9/p+@m鷨se͂D /SCc {mPu+&7q*:#*͘*XjUm:iWT{peRrj.*b$M;/{qmTL|~7KW دlsj2Lo]v&tnX'I dq0'n\̿~LBʷNfy[}aVd smޥ&DGyb{;TKH+x̋dxg%OܦǐY`%͛ncWC|B-KW ;\{W$n>D.غq}ԑa[ON?-mk3@Ж(v myE+Z7|~&–P/HZ~X{S|6e|h?ROr<{:$#S;^]|-323,+sve> IʰɆo50ᮆ_teJz ׃FGQUrEaǙ=vJW?gu7c گ؄ %:-qtcLy8wz@+kƋ*e*Q(ء{11SD=>j!g#QSl9L{1vn ? m5t[Gk-h xe^-82kSu)֛OJP()-pPk 9BCcQ J!- i} dcq׻WG{Swq F#ܑ< _G_%k7̶pgyQ\KEN'=~ 9"Qߩa8s_(^%T}Wh܃Y дnǺ{.#? SU{P[OLӒ19"FQTe-F&jq`$FvtŀjZ7)cn#xR+-i=0ltb&V.rm:b_+0Gs+;h:m)';+qj5g^ >άT9a4Ɔ 5>tZVlϺ8a9D:(5$*B`sXw__j)Ť +Wb xnD1FJDFN6y~HzHX~*v )btl'MV :BsJ ju4{pJ]m0TᾰK*F,d RۖH6`#,j5(Bh?8&Z0f\  eRX=\Bs`/&AmΝi<"9ẍ L;څ2P}-66p.(hp9=|;x[O*fI\8g!Zdt9æ_ 83BU&C&z*;sd(_LFGyVܘ :Ætq0Gp%=ZIF .j4Շy|%'^WRUpa_ qCo)IFD^g{Mׄr40FAtݎesdn0uInp-"\鉖q`'REy't.L8AS EQ:+HihEڳi%xw%V9&jnV4nfk"G!$D pP z|h͊?6x#Ot%6P ^ѮSuT"r7JgPZ)61@6mdi˶~|~(Wm{5z# N[:3X3̓$qgkp7 s&gD5q BRVV SUq Jy*,6A/D\HY. 'Wb;Y6 d\(s>lCyY'xBgbdft.c'H| GPGzoR$7IW`*DTYa^3KH` ?-fSQ ?M>UHc]Gs\yN82 jLȔ)3]vm,D4쇐 XC=maʺo&?w3irs/ʕVa9nz7;GzP#$MY@s"Ʉק֮[epݧp/Pm2˒y-=퓂RnF R["5æw-v #+MPΡk[?wյ-!QKtۧQ}3gN˙bc\8FFlXqXw:6W{hS]F 6`˃ЩīJ$(WZcSo.44=vAmYOsL.`p+k}AJ)Qi l_{4@h#Ȁu}׍MpLGWB@>(#RN~^zTtx׹oޗ+,KJ lBEE*\%=+ۻ\5wEÕrfqb yKKtT{13RaN:pQ G$jhBѩDI]f%vb[Yj̙QZ<`r=\軦0gE㶩j0ZEfMR~[?t47;j'OZo$ T89d*̵~ Ov ک'4JvgE^=s8#a^ÃqK?A<*php5Zcdؑd'O7gM٩@QG If"]:-:-IMqv/aꃣ  i&>@C 9C8ewrz>)[$v΅zԝOii5Ϡ}! Xjrk? p=Ӹ0 $jg SL L,8-k.[pltE~&3#PFr,dMDm}N]O!1"4po|7=b@=.bN $+MHp{(_ҡxM8Ƒ>堩]]휊P+jMSuie#H f jmws.l͎MO;L90wIrm&l4Y4,:1:좴k=,A'c'#֜e|Xʑ6JR zoÌ޸T+bԶg'Hrg@3wrOߓC_B(Tczf#UcOue#[1t t43wq|`~UmW.[YvBSC5‚[U}BTh]hk<(-X]DŧFNepr ڔlMRh'0mӠ`EfW"U咁;E8sd4ÒN ov] euknN+=D -zx!W"`r,IMɋF1YX]&_hxRE,0 K%c^yX{Ws#Y^ ^г9-+FSWv뎺^dh`}<Wes,5}lg.^U}ic]ġwl*_PjyݠX;oJ} YǛ_ }w޴&WQ(,4dF1ꚫFW3$faִȏ=o 27905P QX'~afJV,/y\o ={]VT _T`1t9Eil*5bTG3|꾡ZO<#,Ew+{_EMC-kẓCE"O5'" PvnK}J"-&_L/Y2_B&Onw|>Srh@ bՍUIgH)Mr;?5\2"p]!5#2jԥ. lqFH‡)+ȖV+7!-$վ-{9e-iKݬ>{4 5@HkɾRx'78Cut<װrgþY]E/t3>D OL^ᦲblrH͘_qtu $z<3[=dz&98:?Њm(BJkBqSiYVMK6Ţ7<,17I$hv:ؔ`ڟIQx3#6jqFR~&7`d^o=i y$i(ϰ@4R!R vJw( I'K>-;)(-ZMB|靨…/)XX4F1 BY1 3nΔ-FSٛ,%Vs`cOEp'\!kDQMZUJ{Mz)\,udKmɴCq KKm>[Ded{@5Tr5rf\Q{+^>fNruBqtݥȶO:(QDf34TNI|E^Eְn<w9(d8˹Zs-=3fw/L0`˲$t+\]^o7u(+y%( i| +$[9SHF/5/( |'eHDš]{7 "caEd ԢߦÂf@HHu+@TRZI(;=ΩiT~$1iBM KXvD_5P:U{+ =v \g"[`L$)6F0 z^y@>2kB?7L %4׷A@7͟jo(h 1(8Wez4#t4p8ԥk1ն\K^w‘5wmX)(l>>]8u6YLs<( 0mk5[9놴5"1n t}\IR冥2/83@<sk_5G' %~DںsÒ 8n[=rcyEqn:s{:¿EB|!MլԚQA.焔ʠ$w&: ̽;D^תM)<>Z|y ?$)1bXvcYy|r֮(N5s1rcC` aLָɗ2"%~e?*=V[? t)|CWBw|k:.էRR4+`#z.]Ne!ټ vɏ0KzP t.$/rCΚĭr;ik:v~P8q^Xm<?:#ǤOz#z>8RuA$}1X)7Dй@_f0(AKwi1qx`q"^ vUlcBP<t9 ;eRYF,Yſr% L6/^dVbKTZ̎}44:5o1 UZm"l63;S KQf nqxM-ߕuyv|LМx>9-RǂGR:5IMRXi'gt W">ƨ'7A=%iu޵<\VMCO<"3]F<0_NLC0ZJ4?ngٓKeh-Qz*&kפ/ [xdpG;l͙嚵ZɮDSlԞuv`}?% +j"%vEQ5G$'I\x|[ĩ>Cf\"Fm]<E_"L4%DEfȰP%${`34a9ǗNq=lkgT1o\?hu-/ %x&Êc)9uREmΕL3<YZxT*of#x!0n[_\r']DZ'>G6f 2 38=2Mv-](&Ō-{\)k 36d]SHž$%5t_lxD)Y^Է169zZ\B5a&H'MUyQp5Gh/֜w^lhrp'};] mb5yWޠ)#}مdK_oYXrOu ӬP"5#_@_jSO=@*ȏ ťTҢbUdNf0a.a5Bb q*4?LOMV#"n.USѐ!`^r>Yhғib:}8k[BQE]zSE>grTX' S;!k.(fz I=y۳LjeORCiνP;w?V1d"oa9Pa<2,K,z0 >E.ِ]N/B;0Vorī֙$?hHG0#]+;[5ɭ8+ NxNoGx2dm-.B 4U &Eń5 VxX=baʒI+=#]qyKsyBk6?d,q@C!jq7X#¾ @࢓A G#ސ,k8|#o!\Aki2>VIZkG/+g3w^8qq%k\9C0PN{na#F22Y 3Uȷφa(f>P@,h.Ujmbʈ?XwnE(2S@aI 5ڏX(rdOGښ,Kd\Ei<]t?k,p߲@z\)m/59^4{tK aTPK?cKi0}d )V\`xJH'_HP15]Sf7<c(؊ӆ<=&?'y"\u TBng|Sh 2CA~qwnf5ݠ{"mK@ _ Nd0Gأn9ӕ&}MM^oq>>DB7K6-j>,-B"p.n[xްW8'q}W^Jˏ}}n,@m5:{8[04刮P)ө-A_dj$H*l^W;MU=SW@[t^ڵN@Cة%Y=qz@Fx(3]sHQ$=.7ssNZ݆kܫ[V 9+$eHs` ƒ0黄5@Y(!9ݛg䯓 wC{&)Ŏy/eS\Ŕ ށMM0KI3 iOoE_4F4 M4=4)P kJEd_~( 1(E[Q_m\5Cicɒ:AEʆ>jt1OVFަ)|$?݁؝'9Ժf6^dL /D$[~T?ޱ;xΡ8zi~trT0юk+1ūiW U#s&BY3"}Cp55iR~YfKگpΦ~27<Y8ͣÖy>!CR[Ju TMLr%}8jЎ "5?Apm2e8 G׈ӹ ]jk.]>=ɕ#Cj8Y9,CI灨^'ܵXB^8³0nmcұk18 Is-h$' Wbވh=/ 3<.!_N|t M}X ͳZFK1 i>?'U.=(Thi7NZlZ#mҲ3QeEI9?S]lI|"}v8rP5<&k0%u4E_9S{Jec+i@^Ա.̎`ZӶSAj ×n͉%4DqHOYhgLyBsaX`h v6YGF*Y{OUM=˱PS[JrJ}D0",La-iRrEC<% g]`߯;14^0rIk>o0 W`-=Zڬ.1;N~3ZB!H rzͲ*Gl;;*NkD@]Ke.xc s†3an^ Ĥy4H2cr>gaAEY8^US J?N ,ȄEPnûu󩐲p&=vp<& t_VmBNӭ߷F{JIeW#8LXpK7ZǍٖPG yuQX-/m߁k"8 g *0MLw4 8~Q-?c_B'v"NsxuyAdFPa3_SB<-; g\sfb;>{d>RBb LRGc1Ѯ-k Qaؙ|@jRL6#cp*FQdm/2żU(bbe!"e Z1;NUЁ !e`j3ΧO֔@06qңh 7Ƹ52kOkJ6yU.UXP[Z݈.41+Wߔ3]vya Tg pƳ^'c"w096۱H.Ι&g9!3Q Q} sqC[Io' 0! a9;J0=>zEB|= 6bYDB)UłYE]B1]87`;tdiZ&ص.h\-?t+ ~K UޙunvtaMDiC80 lzqPϕe(7=gBnK(_z&5a%2Vr#K)wv5;< FH3@OWH9B,:1ƌe)4'McWљ߻NCbA%1=s\e"jW)񎕈JF'VnaK? 2R}BjOٷ07\1 k=VXsPUڹ/ᎻdʞqVH_coc)dn&|z#y3q@WY[*nQF)D =EV.5^kJ^ł5X%Qz[T{RTPyeњ=#T"Xk ; gOىߕʈJ2#0_kuQᩉ1]+?h}Eq ѿ[Ӣ,M6hIlA;F|Q4vAW2;Z~׉z߅>KE Ѣ,(0]44H"]n0EO3V\w@$LմAý-YM@r%+mlp;mc ٴgH`*&79 ÑsbWߧvTԅ/M$*Z=tҮD,QKA &(g]~{.#sgHs{[K5rw7.`b.\jbtX-,J#䔊OmM t%1C9~Cd^euJac-F{;NW]7>dn>2>q!W\65J-#.7 aES"\45#9H1̀:͵t큵k@Jo%^rd(8 }"&x)E bZlO(K%+V QhekH/LT7uhHT6<¼0Iybu9{1넁yj5_H_XS {7'6cf,+6|\)"ncډB)㹕Gm2RZ42Le5&'ΫTm!{\]>pwY% W^#}MVoY"7UM[v*ոu{_"zaTHSu a5vU@\ҴN#F m0 0#| )VtUyKL8:1YAV#/:ZIHUՊWꎛ;<58鳅^dW7~1zq3pƽZT5()DYq25i5Kg,/TOWn;R9aM}Rz]H,P[1]&u` (}^}^G[15{EvR'tݷ{^kBQ׿[6BI:DwJp՛ "+_q:t*Iab6 lH#A".f", ՛:>d.CXz-5\QfE22zD: ;[î"M_!7n^WsA*{ ?zT# ]yKU5%6=) s1xx #+y(ք@MWqp, LɐHӈ3̃֕*|m0k%Iڲ\% ,NEm- }}(XNqN7Jنv3JlJCN?.n9am8A_.d E8*NȅqZnXl3)4VY"C[p"N5y^(dwj=s.+5dG.<){ZnY< . afC__%cwuZ9[\C;,eTAS6.$\ vCέ2 71W_EM} $39r8q%IA+F,r~6aXF{DA"vpD12-'C$Ѣ { d[{[N;mΤ:1x6@uR%@n5@ Gz4cN1.lN}%LOaD~1ť:͐©sS^ŤxXۅDcWv(ؙklG= Ύq}37}P[sԂ |g,Es\ ٿNx6~X*UUԻsbBGka;pGPق<@?S/2Q cIX{ wZ%Y%+r*g>V4VR:rLN.{A-3Ï)zdzʷ]{1J(`@ ln&NMFN؊r X\Zf o]Ŏ[ĸI8 @茪4E$6+ -X6Ďx-}FujIF?@9Ss] O.өpVap5 .1h1{}us5bsЦdY<DCS2%4,%$d1'Zx+g)ۀkZ,\K%KC6QZk . &I{TeuIEw^#~S1V2)nmmdՋHxQҴ@}, \`4cDi3 bY\ԃJ6Jo{Hf !̊9)~]؉:ε*4f7ٳT8VdD51(46%DHإb9Z0"L1[o6 w<=s9kU([1-cG][z}_Iwu@ћ_-(C:H%ˎK* RTckE8з/[0Ҷhdz?y6W5LKdԕsVKw+ <~DT`Q4ǭٌƁmNxmz o1ݹIs;4ZWPs/9rs4vr5fAYfQA}SMN :@ʯEs!#c}dnMUbWAYc-a@7*k8aB0,uzGZѫ昡 ,:}gF\S2zex^5MQ;_ep_̅ViFDn7EZ$";* Iq+2ǯր",ʊ.?1 #_J*T_~i ] -4>a\fOu*e7Y+?x>{CNk憅n'ZJA_~͂tTz7N!O{;b[HQC8 =ɮLE!B^+fqoCl@AD~/!X:T"1:|?ybib~fT :c ]d-0= <_S; _[x7-|+߈yXlË0G%[y]SEЦ֯ XBJ *%xEigji#ݘ͚^RO>" @?0))PFajwyӄWC4BHXRYHYʛ³8`X<6^!gfD u~aJRo5 zQajsA3$qXp7ڞ"t.8̂;Mo&;jn&O9ŦH -4AвPc3{< *Ps*CNY~c3shYa*(Vٝ< cײUb?,1z -3"R-}twQbL ,YO\x.fvAaO\~#ItYROtR`vʤ!B 5 ]nPU':ō?%,I3&XG \eZ{IFBDž,3)dlV)70x74P"b5MDh1 ~GπlbC5d1\X=lW+e/ ,+N%WaE#[OCVnSr׾$/1ѲIFp \WhR˔I$o7ٸ`7XE(M|$G|VNeuqKƝY/E_ LO7{WsJ >  gvfi ;5 o IxM\uvAߍ_=,j-{9G{6D,4GiW :2}ʁ%-_bܹHz;/\כ>^|s +c.|;LTGh1̞&gh}FCͷ>?Fv ;%{Di0y5Ƞ\'xYڳ |ϸ wMΊFy7+C|sA~rΜtXC[j0.-c݊>(=!P`8"ڳvl' #3ߏ C{4R++?(>b7V}5C[ }z4T ='57_w`3u gNULYqشP\ĺP~^pdx ^ [9Ko<*`vW:*+v!-B1wJ' hj Vj)ٙf7;/S9QL$[|Y'$x(} ;ϻG{4ѿRy^ri5`S~U YNY3F(-W sjq1b+gP r.UpC1Uz똃VL/rQ{SiT UߵSZ\4QtCY`ug=}pC{ %1 o Wf9f nPIJ;VeܘÚ̀iט>w1~Ώ_p悈}Nm)$/zfy)ϴדU !fI fqG?bp :zbH[d3`2hd<@sw ͩ*L]MdT.zQnX{{ yvяxD7q!Y'E(h60{sNY}k0;1 0ed*ϥմ;x_m.I<KnVH2lH|t)mc`يAl {&{ sf2| n ]@%}7ӵ:) VWL9'IIXoƧɺ\T֝lXy.RXa6-ii1W x X2iwsz3r1vIO8o =[m`*Ty5+L| L lEHX:~: iAoGw'Q2KsfnQNfyIi[lCRŞQ VYSdsR֋+rMte3%Ted_-QMSYq0 bOʞr]|28`F;8ousW~e>uy04+*3*N2k-Å41Cot#H1֥N4`u ǂE%;/X>}gİoAj<蔌ssA@5FY!JEEu]ȱMt\+hV58~| ,w;B)933=.vrT~Gݻ}.q_u_1t\6R{ lqӣNTpI U۱]I` ;"爱#K+jR%*OիNnb17 mVf(5RPgg=L* .%^ؐdJcV[M*,pP \AzόO, k6l旓%|Un{ \]M`UDH e,bBZ{d V{>5 5l:%oߘeG2 d 4 &&$K4d׭FDq`* 6%5w@gGZRU5EJV&.iE( PuDܕNO&EEK@lU1֣H;ѡv+{k*|@ߐj:u6Q2nPg$2/ǒmDPK,l ϧ8iZhPQ0|SQa h~8~)-?VrgW|јܜcAREZ68YcjmC28e^N&nȉ-ן?&v Wy9icLh<P1JiB+x C_GkU ݼ$!l҃G ,&A3Dzvbe;SP YC.f4 D^]se׎:l@)LڧH8}2<zVQF)%0ؙU 3Ѓ0%g`v'|EX|!v$X&S<$P֏5uCS}…+e^D?mM[6ƺfсsXhknF};˳avB fJ{}EEc0ғ@wȺ$L]\AL >\}|,#C:>J)avj%ɴHsiV3a01DYo.j`YJ!> ZVcTt@{t6WQ6TɁO*Wٽ~ 8bToNf3_0{q%t Vi ^Y3)b\:RszAZ oTbU,Vn-J2Dc):[֜j&MMYQܑɕ^=:0/]^"\VFSLUy v|\zksh) 4Lrr(v)?%9d振5D%Vz4e&bFgSǻR }&@u3Zʁ!9Th+)wM;䧞͚Fo? ɡ ] ü$R?- xƝa@ݐ 83f _ZL ҳLAl蹋_d3h9O8B~F:pVsm EFC4]&e=fA?M:tF{v&z1Vw\ woIG7'd^uDZo5e@g@!}I4(-+AΜOM: +Ot;0KR2kt$}ߞg"!d3&dF嗆yV[8V3hx&57YhT8Ɯx"e1щPGjP>bx^'y/*f8V˔5Pz6}VbJ|]$'?uppNk%29@<©c~K+U}'fbK#*gޮrv<,̮Hgg`BտK_ZZ逆,I4s.ҨDU';d__#qUh5~W#~1qi^'{c

(3ra}y/z]`@kO@>yP}A ^FPs.bJʧwU;ԇoغ1 4 jӮIp0U_13K^xi0([<3󺑲An;\~OQKGzktH䖦d<ԙ*RCDG&C#M`-UwWIUY( 2`/ ծN|H '/z+ntorH OCj|Nӯh!R-_(7Od=$Ox"GػeTpL|3?MƝcUݢ> h5I:tuK漷sV};0W) e%gFڱ'(}gNnr"(*[sGXy_W_̌SZKXB{DQНͶ r?8zS3m rle ly>Z4ͳ d HU3ϖtGPW`BƭQ !KyI! ן g?tw3g䚷S/X:B$җPq\E~|ƣ7KWBꇬsKAEV%m7]ymxHyҿbrs\\уYW~~Q&%ǒ;Hfcb?pa0%NJ~q*7)e j"!D'R OI_cq=fЎTDbLH"ڤƼ ?A|s *❉o9ͲnݛVvgTl!2G$pV+ٮ8Ĝm33_ÒB GQ@;r0 thˀ@ȉyfn6;D- j C L2ħR4&@2o"7`8JTQ9z.f,O:VS@twL-pEHrsA[[[4^0He7v ycz(Aʚy6[mT2n+W#ga.&Tg+N ǣcqpD62j&$%ߑ=e ]a=Z]].>w; JXqp%韩>B@tz`[,@f; RV@7vv_@1m H?.Ngi>0 ;OÍqȸ)U0o+"wx{,O@T5?Ya¯K ]¾b4 wlUH[>uZQ\y8kҎI TqemeL6߮wMSɓU_ߩ&=JNˆ<_ėD톳䣺UL&Lt&DsFh Hq6]@U*Eυ`/ǣð\{% ԡ0!}rWdi,C.iљ -x#s3{KLf-3x|+JgP40Kw(ªAJ|!0/)@,̾Y*?1ylQn*eֵJsХͧ6ᥚs+!y3@dsaIZ(O8}TDR޶{¢KTl5֟LȋڠL75qy(y].XN'nE&aS_7|Ts]sHЅ]# 0G CYnPv9\"RBҬoSepywKwy`0TvPУZnaX~TŤIAaL"5JSAě5\}m SFm,aĺCX.j(p}hDB* ko23@~opgԤM61ĈIlaZgaj̋7<>gfM@vQ X)!(w#LД8:4<;E3 c!,6XqL]4)G`U*_ggoLJP}[Kr'H e/gh Bm_~V$G)Wxh3گz-Sϋ MXol"VqW*YH1ҩEpSJlUޫѓX[6HR!8M!\R @+E L?Z?rCVg ^HFL;W0P TP!`n+<N{0,5iI618ZRy9s o]RsA,wm 'k\G<,)SͪΣh)΂/Y'E o`U|AbAB^Vfo h o5ۯ. ~ 91?Bv&)mRgKrGsG m^#QYsq&ICMGe@N=1dp&n5.2@8D,?-F \ q*Xf@$'|~krMl4n[p̩xO|73Z] Ʋ+ ZϛPme"'*򼚾SdtQHD@Hyq\]2`t]k\%"\CV⻘,dc _pqo-#Fvi :mHQR8)rFFREJd!Ye "F'eW5z|>Ҫ^S_{ o ͷ? 2r-*|ل0Sy}[v#0eMXƘ\ƀEQ#T{"OnݠPgIbn=k@췮DFiA}t=tKک}nZgkMz ƙc}Y0\|ϾYvDV /JCChZԢY 6\ϭ*K{̢˝Qm*WArOnKE(1 $ M@2nPU!-x8ew ŝPg%@I^b F$9ܢfQ'*i]y@ۻO=鷨К+C. $澨Sϻg[On+.Ą+þ[+"o?єE K5DyTKdH 򀙮( *m ,4QҴ} #(PHf#9A$C?m9Bld?CXuO*6;>vs iR$&o"\\HDćR;]>ɯ[D uL9wE1ſuWÀXM&yĨRu6d9"1+,f,&Y,9:bk867L~ҭ3Phԗm@;UǗ5y϶0z蓼bvWEm;Qm~ c #fgKJ=*ɞj `s<ך`2\v0gk[LIԏyWP.iXIApE0v6veCG9pw9:Y)[k8]xxT&ׯW?dfƓ*Pcrweb!sݑp.? ,y|2=Q5&g)4tKn9/;J~GHN|_ Y㾚7gG!IuoZ|' cr;i S;b>F:oA{1[jaS|<"@;WqkvCL#IKOK5UȓzA`%=CːnM2Z{Igv708`Ki: p پ\:aJMЎ-!B]f4kL:-n5&% ,9zU1?~:):P83cJNן*EmKLٔ16@PmRr@_=R2/皰8Nw`ᄅoH](bhG*#Zxwkf V$ hj6OXf{aΘ B#3!(T7ʈdsmF3#05N0A`UGJ!C ޛ)\\1b2YO񵘒Qm5eQ5Eа@xk0Hckij͋7)*xS\%&/($[&H] ˄0ֳ[5X!Bl%D:[t`盳G7MTf: r)*;p_RɕD-h_ނcĖ'K$-J*%T%sW> j|W;0PEvEv3u 5J"n3_]i.$$kje6d"^% `E,GH9=Fa}mKpr:A U_YIzp3~bw5~+FJ ]e_!n4_>UoB? Ա1.=e4@O`[@w;u$RŁ澰m\ɃWSc9Gܰ/??V")[<Z\{?~Ж4Z`=ImapMU!gۋt~v]` J|iX(1ZeZhGpmjג#NR'8-BTxyw)zWǵ %;YO"D2SS>9 r31okyH,D9tB@c i X<^ȸ>Tr;@Q 4 z[G@^c1R1X|qN;^]\i[RkDVmK-0 \$Й^)CwOڠB sDTy[ʯt1 .>͡%Y%ZC0ՃLWlw&Xӹ"J$ˊiL|Ϭ雄Lߝd~7:S;L2@וk 2;W8P^ò -9CN34o%RH —*۝kj&TwKq$EM-r^*7#fP&Ԅ m9Nۓ9d5L%qM9S/ nא G~جIlH3rG+wwzC+a!\ٺ9sb-/BlM!RxO&a-cmx.*qs;le+Z=連G4#FH270DE.=&3 AC~TpL7CNo<}!nX0LiɌ-KS…Ug2_JO4r9kiZ zrO040+7 x[x̴|*fK$yi8FeUjhJ~i(: ‘sp> ia&P?I?g Qn# кB)Ms[&sI*rc0[G.XzeR'lGÒߐk ww,W.87wӏ436ԵP}O8K ' (1 [ |6'~[G+^f11taZӍ~t@$T:<NtU}1"!Ȟ.ܧIvYx/߂Vd1)0c7gRЫUX&2dɻ`|µ @XE+[;ƻ ve-Ssd šGihU'zqS4+A7>1'm>bl9"/OlYfϒ"9mYeګPSB}M3) 2ɯwԜ,2_#p-ͫ.!17=o7;dleFH5ȫ"3XhfNЈoW5S2 U%sYv8J}`Ȣ,lsKWcڅItB^|u ]aTG3+bpk}BL'IFF nceč7-Z Y!1%8H+N',9A*8CI ^"*h皎_o|ӌ\Rᦛe3` Gz/I3VX^PMN!9_N_ \s 6-> n3rJ(N)y,b d+SvyV+lVS!h\)M#hiC9K/\HrV[Ä[J'[izQc8 ::zb>.~JF,?bg[dk mٽeq=AMVeqSV92Q= fjN'A iDZuޣcDj,h >ߞ._Sl^GL>6^ ;D-)/xn[0CN048*`rV/R;﷍܍W ˈD%VԷ{piao;JPHm~kPby-.MϧfwbذsUeka8ڟ#/?`=.Pkty^UCjU}T8(w3yP17.i+:Gp#5[&,WgvA{1106CA P8=8j&@y ?Î[iPGpJT:  dpU%c夆H2 0M&SF*ۍ.^()) Iغ=!YNۋɷ3iLǞWU_eڴd}*ʋdY+%iᄐƙ\\ p86YU-(U'&-CG^$Pf p$N`˒9ID M\_avK26ϸ?A-:4R?H3b*H cn[B#?h{+4?(Q*LE*'k^&p\m_Ԧys !7*!JEƂ5@G9Y^Bw U3jAKSYW-{fth[ia8o[z( : E!$d4yu5Zk146@10A#W(i`OGVČ®c̩ 04 |E1=T3?ܾ-m NtkAB [tQ쨩\2~+1QxEakĕWV9(wSFIVPG0Nye#Y],>KZ81ٓ{l|(i+A͆AQ:bmɢ$h>eKaH*}SzT? :L};QIoqa~usf&`ʶЖ5 Yj,F~F|~St<=lm4t_h_f< wYx W02E T^2ٞ[Z;PlI@jCt k`QWhx4R95 𷖍N7B!{AtΉ&"_}63}Ǽk0?n(,5ڮq1MU)#ىB[[IZ-Ms1F݁|ƋRŞ{зRFxM.dy.ro+55K6ꋡX|L([2~ Xzb2.rȗ z)hRR{ o o,S ^NMȲ*GNb"C'8PK%  X=%y)'YV{KLp;a@;}=7 x[;^dE yVUU/;j^sg.L$hE6zUV,y+"=2Ie b^ɦa%>d LWǝ_hjr&OinR]eKb'g%V<5F~ 𾡌AVIqRRjA/O! ƹ{MV{?EiNSMGq5p[O)=vl-I;i6$,~U'=ODAm \A`҂z?`o%[7qߥ IG]>X^^إC_uo+ݙ*ױ!؆7)ݲx8CXD[~O'T-7#-fiF@/;oT%Ek12-Uf`<z\p/ ᔧ`Pl@Jx6=;X'!'- .dK%^fc;שF<܍28"44hS4A~53?X ;A=yoj-A ~YWaiyyn%+M^d]-,l 6.qښT?[XL*`@O10OLՁER7]KF%RVOaF۸]ASVr>co1zMwwgY4W`^U\A節Ɍ]ܥsoc`1u2"z;7DNrːbFޙe.VKIthD):xWE۹A8N 5Fss[lґ7GOCY~7gdr.sqBSTofܘ=b^޶.bzLܪfi~kX; _;!{Ά*ka~ZT'ȗ]~5~ITCN|g"94QVb2RsJY.5ڂ}^&τv~kiT܇b@|ZG24&~^ƬPLF4ngE$r:|m]QN^T02yhs7D09i2Ǣ=0Ƅd*7Gh[-nZ PN{`AuW`ZkvsCvF!m~PBF .;D k(%WYVB:?. 7O6/6T +KDM¦>me50wl~]l=k-}6WÙ /wM6tQ[S_4FcĽ S& uH.JeB!]V0 *nQ^O}ɱ*Tf''&=41ʡF69ݠl9uΦCI₁f0PtÂa> ޲>oѾlE}j^gB4O-cPd5X9#Z7D5KN?Uq6OVyՀc^R0g&Q)0o+DہYҷP@%0)WY{w!\PTx+ed,'c]ٝІx-q,{@ъMXib|0u^ĀH?]"% u.c)| Si,?5.-C_rrg);<`םxQ=r@̰̉nTvTq`$4_ƾf;K^TRHJxY:h5[ѽӅis($e@)qR̹vW  h3 \»|L;t GZ7'KuPX:C 4Y\ vꖽY|AE`y 5EuՇl u; s\$z:oJNS5TE |/fn5xL6y$`^m䦰t^S̓ux*QwKґB}[wQ: ge5sDt 7b c#{t @\ ?j~jY;l.ΙM˟,ek8^e~6- 6$}^koͬ x[x̪ Mqȑ2fܧKav+};O;F pJ9|f"PejUW \|q>j]ヤ[PuS+N RI.ƇOYqա_SP9d=?%$)Q+&bzMViGşFþqoS RSJH~Ƞ)ny+ZIEp-h]Kg Iսx~PXpɄ :1Ovg=KޚZ)2Moq:U'2 +Ŋ|=4] g [%Gt @9Md!)g?Ɣ).3t'fv$Rh;+' h޵ wZ 2J;zȧ'?N8Ui hyu+q1 =yQZ^z$ֈm1R W};Ŷ!O HpI<ÝiR;:6їC& .kkٍxf^;8oƶ5)M+{Xx.j0`¡lI8y:a4OfMaݳa͜j;R6|?*0Qk:TȖx\I-<4L?׍*Q ,2F}:G\YӾlܡ mA4%Tצz߄X+Pz3>a*n);>u)("sTc" n;4.m)^P5v.UHuIaW|! p4(NAϸ9c9ЬLc4޼͐ԓ9F&ݼa6R9_smr#NpvM {q91l^N?"fUi_.%8CgqgVl k w,Det,GD!MFQTLW(Sǀ^W=B7F7淢y@Z+ˆB(lxѵqW+"iRDTVW"6#I ^OF4~d~ez߭1W 1E t}fR,W}ڱ6Sδ[1Hl':MvύRf{Kt~<1Ҵ`dMS.sE` ko1$]Xլ$ 3δWlܾ3*#pIk3=L,yļZqCs5;wHcb 8Gi\*u ޹4 Msz)<䅏=hLΪz7ш[Cm1$Nv|KY Sd'G]._Ba/C. _ȲܹEg'[G^]ӡKXlūt EYw$ԁ ".JZ ];"FM5KSO#02ʾ eÔMGrATM(CCg !cܚQ6w E[s@$mۑh+<<](ؾab+ (; ђ7DSW|AȐeHO8 |&NM#]bSpPa; .L !Z<RZe P_Nan4@|ѥJ2D1П;xp:W¬IַwOo<Dsj? AfF:hʻs)mDrsǬ>/3Ed?V c`[)7TV}Zpz?+SOH5l%b[)[b`S^כ]!B$3u%ԟ < WMFlPOK!37unاnQca`v0TZZFϫZzʖ8>;J4AAA.+QԻ\*_1΢^b}2IC41 k;|BaYQ8Yi1N9#D@"S9|ʊGy^K&ZGAC4^gHpSb3P AkYP*.9^ytׄF"G33AܑT)Ipĉd[L9u;w t]fmW^*.g&,XF.usmȇB!펴e,]c(,r9Sl?TxɢnS Eu^:Z.fR4"ʦ/V>FruQZ:kGyD,/o/U@ƩzRM׻{|duvlPmdti>ZWmsc(H2 ]#Qd|.<`?Dy]45?ᮻgP]uAM4N&Ac^;B Ωq@S%>]8W6>Mp{ջ`mZ$ōf+Oܶh#ʏ3nΟ=ՉKvi_@ĻnIշk!W[)^@ߗ(kqR";])Z"?f% FELD#R. qw$˙3l("0ʈN 㹇]ӊo꜕WvI|}-9)jE&†z*kXsΐ~:p~-i=3RFݾu~cY+q#K?^~oD*fC -Îh0l`X'6NR?Z?vd@X`wpˊ9{n8h6LWxO*4y>)3(?-/l%4VHJ!p,q2qG-Sn?JYJ1ݷ(2C2ҧ,jhT< Iӷa]ݟ E/v#/ϷĈeE9qUx tXe}gö ' (l&4>sFwn '辶枽9}gEf|`Xptss/ERÔ.f=:(ۓ£ 5 NCcXI@?ZaCNt? t,R6*Qwr.M8;ԩ[JRpMȚ:. [>TrUz1:aC lEu䜑iLf}[cB8ej@H{5|f(dѢ~g52$Sy%?MV(aZvM8`1]E/ZM1D6mfnF:z M$01;霰Uɿ^uo^BxqX, 1WNAep*'.[c9ǐO@e6Cd H>U?.txKY z6&na)jz9Y X{a(oahyj%..ov\BimYpzكl:JV7-O\$e; AB6i Cu;|G@=K+ǜT$ OZ#0ʋdr=X$$2kk:4a7:cRH^ʽFa4~we ӵ\cj=u4[!w (N{A 5Gj7gfjhZD 㲅HM u(/;zK[">d} |qhلr0N=0 E|rr|9^ FXk5٬; &(#aӹBoI\] 'yb?nγCL+3BH)->*ꕹJIX#ζ!`=e‹ފ§ gFPS.i4ը5Aj7wqK|0XO@H5ntb8[CNFa?rHS( d)\:͡ QB͒WbLt!h$_=v+sEk_hYa?lMQvj~dfͶHw=@G\OGm"P@#|&ȏ'yy2BQ3,  fC(;%v7jS% Z8Y5#-v2?!:/Y6 v:I[0~mqLD'Ԙ;,.IqruT H.=—mjv!G=LDFU^|_6tČZb6Ʀ8 gb`-_]#ݹ\(0q؞|x'@NA>^n(_'٥^ڜU]<.."琟O?ʐ Q!2`hDR~>-{s-4]G+[Ɋc7+G 0RIVq<ˡhq0;w%[i ~99tDxYO #v%D0m־1H0~}U cUukEK! xsxneҎ_n9bS}'HL0}M!th@7e|zWdfѡY^[ [?=eLnzv 5z|?s@A"⟟itadamO _Q2֦t+{k$-|Ìmď㊍7+&eU >R%k k>;~kVfD괍gWTZ@{)c8MN."9|֦pϭɀ2T1׻y;Ds)M*wqi2t@3kX<83aҁr3PɘF.s7>_jyK\d>+7'4HooeǻOFѥIv }DCp2A5 4Wa } f]޺AZ=D$)Iѻz m'NX }`CM`R>8"o^g(jQ^ڎY^z86Ŵd NHeӓvP [@p<}Us[m(>y[Yaz_ aNǬ\otzd[ՂW98v_p4ICuo\UBDbɇ9+B;9]M@fEOQYd,NoPw΄[JÌaf w#&:&YI4B}9I;HajzF<WlJ-E%R49ktd@zHݥ4QY}]l\1MDFR'5'ަaދ942^q!xSԲv{ÂA-Df!D6#u ZU6[$R&mUaqwyEȰR1#GXF>U۾Ѻԃ֘H.2R'iIa}Y^4 B*hfݷ17b+k=ʦ J1xYP2Q7 T]@*;t#`Y:T[S#PLEvң 0ߥbHx}N'΅/ӑ;%ț\ Ո ;&6\XAydG0D'; ~dδP7*mRUAMJEv;:.Ek5(b0'K%Lf/4pT+dĂ#k"uqD&zmcqMMVjp}[j{78怘`~iO k= <bjF]Tp82m""Ju=|W1zv/9n*P F `Ju/΅obR!2Y0芊jB4my/y) wm.#R--/aB!pH;NPXmF`tH[A$1Q䢆}|h̨9yɘ$[Z^[[ÐEy_A\NM`i%ʫr K_t~K/(i(ߛ*1bf"KŐoѿV\ȰB򎏦؞e h'{A;ƨD@R_S?K(+ Xo1C*04PJ>C.R܊Plj1::fOpOF[$f/e~bs;OƠ̭ZgdK-y\GA!-R?E]N. 1?"~=# ș34J̱m&_ FUUܮ*;k/3H:,`2t;`1/bL KoiN}lsXוּ,̤F;u?Bna_ Sɧ ZA.Ѫf2c2HԄE~ ʣF\r_& 8T8smO{YR2Okz:xFIA ̧(4}v;đ tnX=v~]e侕s #ywB^:lbN\8ԁ75Ѱ60Q󊬬)p٭U(Zܯ}*z"^hЧ\7+gl!ǐsZww3> LWU\Hh}w(8MM-:WK{m#HZA3K̭-lQ_xkx{ .E-M? K8􅌀 eDu hx+.LRlwo,vJ9CFs|27/F˥BM1e+" EB~6~q"`fFGFr]3د2c!6&[c In[z"ɬ*CvnjMeJe 3q)*pWEA\[,ȽqUVGfxHsW{i])< }u(qYveVG h6K?Xo& Ҽu#sDCxLqm#GEm WMeQ[e/B9V+dUTs"4 ~p{ Ru ,|۰$#GOYw<4`!_Ns* wO0U3t9ڛ{nA = Zqw߷Gټ#!]U!-waNdvԅ2דڼ\V91z/o|5XW#a%Ec` De 'O􇮆`vY䟐84͋ J,v֏ٖz&GLEQͱ 5 H/ 3eOkѦvN 5GO)C{ V$Ʀ6d9bkA0iM=™| U:N2tbJw3xb'(>n_Іdh"Ffmez~u[Q6 3xuDo#Ħ.V!ۮWѠæӕ#??Zr{l\t&,&cڄ aNG'uZܣ4bۂrS{úh 5GQ#M0Whn0ىYv8+EzVó4{#CN=o/~+́ʂpǞ+,^Qtg"]c!YĘ 6mH$oH]i_A/~4?V/)YA1X^F_ $ĵϋΆ]"KJ{BcVݷx'!<9E!.YWOe}t(}xv[zFfo~83 lWL3u.ׯ3Y"[޶[OpAU3$^,DW[lT 'wr.xgD|!)UI񡛿c!y}hr\kӖN'}263OWʡ̵}=%|%͗M&iѴtb;ػye3=Qk Y9 r>(E F?EB"*ſ͜cҎM󷏣"¸H*%Ly>]s\k/߮z9oKmXcdDZ۸aT0K>}?I* ,,9 O4qGˡz)MW^3 ײZ5'}jm}1&V'jg)\5/dn± `ŋl Hu,#FHsb Xq_GKUlV_e$fc*q9a a% xOP ثA,#6Z;xD5|lmCf꫏9%Lw$&T;Q]a7@~h 0÷QUB*^N5{~'_@'A0+j&FRo&cUa 'N/ dO̎GAsZ=DK`?Fc`ݾ&hx $^F:zʿ:w@ӻFj#mo5u)u9*T%M CG0*ajJK1vbH^l å:G6W_2(`m5~<73Ă8tr3s>E'Ouj8mVwMR,n OvPϱ~!4KS'uԟpK*{x8!oq̏.uߺKl0<>{䪉<[.O8|"2S[ZҐ1"Y($92q:MN7: v$ߥ͇>5 A~@ӣk `\kp|RjIzWf]M suT% {7 9R@ V8 9¸XĥN ϣ A'~e)DRY 7E$Cĥ J 2Cڅp ſ.;ކo8o`KTf1K #w0*;%:;(CTND1q1lSPxHUE'Q#e]g 7 U 詍{I/,:\pq]+5lA'8~!1ʪ+V*2R7Kl,ɵQD5Tʼ=g+ Ai""E2غ^ъ9F1C|4u hea+ LpQe0F6[E!k5ͫijxMýU@(F0M>4E_Yn͟ks=^۔1:SzuJ>]X.!GK]/ch0q*҉Qsi6&ȑb3!SPA'!At-%Pt٧j2]I+N=>m|zɴ.\F$;趖LǮV<԰*1θ .@`_;ժ|+TL0e6jy>:) 2 Ej0On=x;yM؜lgi7ucK[Ƽ/YX΍MˮhxzmtT -<<#֎U};*3ӯGʑ]̨p4JQ^1A;^GO ;*0?(s Fw 'ߣcY; -seknnKȑD {H|F7,=IҶv<[Fͨ(WRYIɯUzۣgⶑ9V;gUg rpݎ՝K}Hfe:X߉QӪr^'dN 7U1#4;="!!ǘXU w}\{thQaA\Cd8gv#V&x‰agZhR.ӐJ0Q$X1Cx.˱l@"b\*\u*_`Unns Q~/g҅WYj=c(QT⑺8t*8PlgVR0.7wNKI8=::sr(UKF*tMsAҒ {ctpL#u=3<fa϶kS9Tdm;| xI*HM/Os{}u.jИrNͶ`p&9e"qc0V2553 k x9t"]bʥL:Pq8vfr83_CE.C4ǚOuO&koA$,wlW2.TKQ8rrSXedh2g@S {S}v:3+uk/qGŦ*jvps%9/z%t2_CLv.ENW~A'EgPwi $@EZ_|:a+.,nT ,mG~ُ9B+ ay0Zu9X\@Cy ct<k_,80 bNH>݉v+پ}Y~wLsҜڟ^ G)`#d=]Pq\>o>B_ x,w|]%Etds]0^Qا9y G}y#.*.p\:1_pYd9?AJZ_ iq*pkQON7]V:?!,]f@vcNr{FUOHR?kMq{3٢[wi R'Ȭ+ H qP=O6"zX_x)5 lTSF3F3 (X$f;߹D99肱oAt_eY~cd7.۵AO_YXpX 7fi[{-P]B*$+/5f(Z񑑊3|֋%''Sa]Qspt\EcHCSmizogj3v,t􁨻Z͇@UqhH A"V $y*q"╌H q- cAli=:WTiA==ڠ+JONQ&%ym3V%pFSEF#\$~fH1/qL߹372边BW &-.UĨ n4=TLoZI #䠬xU3=vA/4\3>Q)Yυd};=@.' Ʀ4(/~ оo(M[7$1L;MLbck,Yv$\&h[yX706$:Ԯo䓀JGAk (.zI'ᦱO +p3dbff:1c"vcCHch 6?Q5_{&./U(ux~G㭅"D3$UjPE#9 T{S1}Y/uط練l5Dn )ɼꭗV1[jo-p?"I-͢cg^+=[O wjL$aȑ`fOPunQy<$9Vvt8LL3eVP\ Uؘ2c pΥqurHy 8u^455Fdc GTx<]6ܵ]yE7( 8mWm[G|>ATI]:cLpH39f-MnUIca,WS| Xq u,n*|'ut9 &/*DP& պꜯe*@i3ʷ|| 7{|j1Bq 혻j>XS7ԯ1T<)-K&FT9d~vˈe9Lq\M=En(A~O] Jȳ*&! oz岦6c C㍃S cȇogrpZYVNvԱek 6;O4il$]vM&<bhX873FҤ\&|mR_#Y2IJ%>%/@B;. G4d"t-6͋x%B`''HxC y`*}ߒ2y ;N[%i?.Y"-O0}{^5W_b qd MA~7=@=x .\xj͇ͽ)S)G|8H`1o.|4C_d]nLŮʦ]i#;Y ([c@}ᓉK>xC]{~YmVNes5i0,oaÚ0!BTJ_'MSuML府1N؋_jxkf_ <7Gc$lvDHgb뮘3cRfX3ޅvG̯m6isbUliTF.|zf oX[A"<5cX:dvjWɒ0bt&H|w6ꗞg)3<8UeҲAG,eC? Zgwhqۇ^j^?YZT{=9p['.Y/ZjggrfR޿r̤~E(2a?d yk0 ",eYvs+;(ⴏ6|Bx(^(BS VwJ1!d;E@X-pI0_;WxO۬d4݊}H<ͯoV0$_!qASm~7 n6Yk*$E;>÷Im3-̢C9F$,<ˑ=]q 壑7U>+0i>KI6Y!o ?kw -4 3+៧A.j-9Ǟ*mI =)(=gda1[LaV MW2T&w,SɲnYQ-w'SK,D%C4uQ @f \ X3ש/#hXsbPZʈ#tKR/dMƅ o,vAWi xEYU)-cƼCbO{ ԋ؈N $M*;AD8 a$ORf5T"ёv{kպv2}k2cspw$L &+"pH]WLl ^pMg͏{>R}a G"\jz FD4cF!в=/)=%vr}(NϠ>ٞ*ǃm&͋J^otD#}ۿ[\%;*q6<Ǒ#(z`]ucܜ:fCL-gM9/Ӆڽ 죒֩ C`O~6;j9ZE&wK^:QLrg+!B}j/ͯR!U w8|X]T(u↜ ۩kYP5{N;Lrz jt̠y;w$2"`7Jf1s,(8$346wZҞh l\ms*O-;B :RU&Wvd[pv *ޞsUR[.&P@c PգPj6"5c4I.du0P jY-Uê2Av($Z _6\]vAg:4h$|V]PT8]C)uz7JysVr˗_@Oqc8טSimZr8$hBSf3KĬo!Cl}aۻB*Huu18^QLgq {c5Qad=y?1\esb-!N, \}R홃r[aITc!1ԏ_QeQy$JZ `usHޤi9b~2p~ [9ԱWp $LAqq](S= |Hh(LuYFxZj\t ^`]F:^HzQ6u˿!`vTIoM)I,wzo1}(4\A&((Qڕ2T%Vy|\mjVAƟ>hCn 3@8II&+_opq7e۞]<mKz|j4 9)7;K"IW (+:GpS.w2L+yTaX}`OH;5!kx}Ho\>HT~cwcx^N)I;Dx$T'a~ʣ o홰3Nw}RLz؈Um#"U_MNd<#Jяe8 @L@cN rJScbDT8Oԯ!Ɏ 42|TM`P:,>wzkX®m%{.NNeQɴ/fjChU pȎÌMbÃ;_(8vNbk6zb\Ikk(:ga\K^eq6Y2l 1Y\=@Q{֥B!XQZ |)j([/+fI~g7qҹ6T~ tL)KBk49W`(AC 5[M<"3c% &,+iy/+K(N*p5ie4bi׮Gh#p)jL-$I;k%Z%=v3]h:5: =PϠ@k-T:V{.ގwE:!oP\v=ކ_i*_U"HZOŚY[KqɈ(>,FJ92WrצXSK5 |@ٱ~6UA%yhϜ OLz``gLHt"u)ӲoK:+",xi+BP|KLU}4pmZ̓-a~>ME*Ǔk XT[[VްZksbl/Q d*(4:t?L L*Kj!lՂ ڔIf?]аu gW] l b6"D*5 x2U'*P"NfRbjeK)mc(>+V[4rj auI,OS)/B~2)g5QCb5n cWZǚg:zlFzDO)¾W}M]'vXmot[/!! ڨ_7t0 sP `kux[> , 8X|+0[c'.KkT7q(/:;/*d(TqW9? $^/M!-4xbH^pݖ!*Σ8[;= 2ǖ \9?r5*$eK?vhj:cp<$z=xםVWkkI% /a K&J s7.R:.ܽ&RIGqj߂Fu=${d3p `}Cw @rzQ$:EjB'r=( fOf|X< 1K t .JyTPirD:@Br^coWf0ͪYYQg!WJ&a/A6nYdڻUcy aCyunxqf4.\GqȔ7=fQ%ʡtT+00]q>KJ_ =iЌM0"bN>g, μHqLȄRIWe($lkgܹ`i=܉^% c[6W <Q Y]I Tl1_Q6n#qq%Ad`me:KTQ$I-#X &ΐK k覯^`&T<ՋiQ3Zy$4¥GP!NoL@G<,IQ0#C>''}h?!Do ]NdLiZ+MKe&QA+2tP*ԻM>Zt\ɝC"}Or/MR"43?4#<*IHNҝb, DM6y-/Hد Jh2MBʗ3Iu"exTzC5'* P˾^|'7 %@U#Rޠ=rO|ύ|.S9:ӗ1Ar}_r^r8*q& (&[k]CFBugp&K F{0~:,&o"Phd/{YEGuxOX&&w,:ENnGK^ %hZ/Q ruyz}o v@&:>K9t|$p/6:OFX=߸cFt  5~T6yuXI+l-r\ ff^À.|P4VDrn(Z9˫ ߛ'r&inovkqN^$ȧZ4a_2 %y"L>TP%?܈Tl MC2ެ7E~D+%3cfXj s\hx\m9vjuȆ;;gli)xr#r@UQ I9 .3^Y\Kɾ'E"nH~g!`gʟ`$DJ j:'gEnV+V?e_}0Rn)0]}@v_7I@Xhtβ*6Z>Ux敁|8TNd|(ٳ.?15)**Q{HNh%l3Rg׌똮6bqr1e>n{X,OR9/03)|aNbGhQ^Pg- wcM*lX2Ǚ}ݐO\5 5 1A}TXto<݄0߶ƪVaM3S7BNvΞmٸKn_Dn_0hW` +;F203mxSC1,U(03`rU,qw;ki Ơb!#(EWġ,TTMXZѯ_~ĬqogwO}Nz[Ov2%w`?zKWyłoώ!w=>rKQl`kx[%1oxe9"B}y4?eMlzWMv=@9rly%Pp河asIBBs(;%A#&BBj (%yG$&qi_1%1q LJD! _Zg=!͇[\ cD9>pm8.{ _Y-e[fKdo }[U B 1Z"VdOb$.?D/{*F؀_E,*FZuܲjPblƥ`ģ+y,__$QMǶlkxHNVO&3MU䓱aP 2ƒK(1]]cjQ @ 1U>p2<>|q(թqJPK {- *Eݮn3P;$7U8ƬmJ!pwi :0}lQܢ 馛hwEM3E~ѕǝr$&LˮX[H!A9 _ZװuxUa~tH=9HW6AQ WmX!%1#4d>$J%E\ U%}7`>k.k`ƺn PwAZtgS23Z'w7Xӻ&L-?Zpn8 ?`($ߛ'n*A~=lbzK/7q@oJE݄cqG q |ױ p$eTݨ*˲@-Ȼ H?)QByY 8ɉX4 s{ҕ֑ʕD#KT X5k&ckϲp/"c#S[Gp "L}|I#{zǾ*:~ 0~ x-gYu8dH);bK>e WWLVn$SX=;,Wl&ܹLߥ-̊4>o~ ȳtŽkN c+Zm^6㜴_9O \}Bּ@/fEOFRL(|ըЩr@:yS6y>Ue*zn{h ׇyD{@HX&h+">DL'I8u}Th2J14&\.g}U&,- / Fi72>:.zM;jDB%\T8{1jrcTѠUb \wcSBI5ME}Qm#1tZe->RTޭ!sI5!&/a*_fH8AJE-( K섕JW.^{$(YTOѝH_0eɮ|q蔄o[ <3++UYxۓMIW6dM$՞A a>љg٧"ExHyck @F 1skǟ;+R2eS L,ؼhF&p#A ,fyTIvwO9 7leTڬvoUY;g 9@n3oAPqW+<ǕSH+Zgr i\%A-\J7kD'w1dٞ 7Q*̗㲍mk2>(tԀt쁍N]V{cc/NJ)% 6'n8eKg<.v4HUu|6qyQc|IYQeQI;D"3Gpkڟ?j#myY 櫘mOp0dl4EK_ clR[Ϩz:Ve^1a(UX p}_lgQ)gPvZ4 Em/b;r1MX(deGHU;"^Fxv}oOST_,.8t}QᜊXX+>X…J31/ ]}q! <0umP8CfK]n'Jڑ#|Owq (Txavc&7ۏ#4zXKnkv\5CI @ev4~< |c8 +#>]5yoISC/?nF!HD Myc8w F&Dv?ovRqYX|K- ~7IXsS^Ao{'̥K>tfJ' Lvl/rMU# K[$ŕ^n{ T1+m)3eTpFu/sٺS1I.$IL*Pp9ÔQ #R%&II{I+dlU*9 ,7kS2 %8* Qq,tJ22h0OncFtOeDu ?f|3)baK ) Qīt#дQGM}}ٯ3S`8Vk0Ghs](*<\ʒ ȑ{(|=YX8Ž %abIxg!Dٱ~#?)So"&;^03]MB$rXV_=ӉG +W |@Ctw2p "S^v<'HDHVxS:Tdaɟ<9llbwWQV|4度ϫU\I<+.w%|xx`$eY Z V@?0[?g6[Ywvgt-t:1 '٥;K>et'̯&`9աөRa!"nx.tGtb6>=D!KD`gx V v'ĺu,6KȆ1'%f Fu@'?^5^>A@V`I,[PG KO(q`qߋXE}~Ϙq֑8lC(,`}K"*q1ΓYT*ib"*ZUGq/6q/dɸz yAi+ l}1v_0Y kL b~;#2bfv8p kʠv}7Sd{wAϓ+R`7ݳG8'T"fWn ڔ/ &&;pLd!V*Knh}}lV:``>ޏx*%וEHؒJH&g {#N=EGxtkC.~JS2>Q%{ #ӽ@ }) h-f}*NuF)%9=b:RUҪo>4acIZaH<Ϥإ jƅz_Z].^ ;8z(^Y$JLn\}CɅ ;8)8PcIĆ09NzS%V:Oͣ`іវč]m 4逖ջW돩AY eQ?0m/0- C.i>;[^VKǂl,cpc-F o+1N]Xl zEJM/:&<q0nF"_x*v)A.2d#SV-@5c-,n"S#j<]yX :"P~yhTf* X.x)Æ -{pjE_S"#XL3􄟡񴥡뭘M2[٪s"⽺1TݿEp$ <бѰ՘^RCb|"yJsi1s@jYӯ](' }ٔEVto۪R̝KЭ±[!Ci gK| 8;hudTǢ 宛35pΡpe\:FnWJ}?՟߀(,2l;wΤ;WCgN1dAUB8 gKD\x˧hM> %BS$~B7f=m)4y mYK5e0(ШT'#z+;(B r6?iLV<@7[("HíUEߙ&%d`o%qiAp ߯wcƮAvȠĴ֒r$y :?^]>1>PSgcB8pCQ}ԄFN8% |Ub3s5lj.B׾$D@xV!FN RI[mZ?+CEʷ:=Z! i}$S2.P<~uT:26Vs>(TT1`VwfjpYx+NKkɑY_)@ RllδZK\Kw_<{ F,2#bt?Qd XmOL1]`$fMNIT\5 5>S&1{.2)k @xS)oV($ﴂg+7Ch aеP3|~50כRR[|Q?J,D04eXR V#Wa%Y[f [7B9BwO=ZYrLcFC}+R3kӳ<Ƶ}4Cj _>P3Y}p }WNE~:n y>e$MLg͑<"g[oF/<*"48s΍?ăe| tGWĞ@èRƭ7T`aДvq-|if_1G~ b&^VksZV r7$)*Ct :m?'v1OC?h+-3b#>)tڷ:[aFo78`S]• S}"IG مv{ ˧W ^i6bjjL(/"y/x(-Ve|_R‚/ ZzBFdu>WhL@\+@9j\qe',獄NbS&-^CStRvypI_ Rz[G9*iKPfM;Ӕ4r-,̯Wk?ހ6dmh 8+^RLw,4qmH)+->2]03ۯ'BhJ뚕&3iEr =,3^JBaR, E,#բ>*3`nXʦTrtկ~܋u}Smpq U(¦5a&p7LetJQ ,Kmj]:sKۚn«Q j ܕ.'-O"H^zϛ.vkMn>w~8v!팹|-fŽ_ 񠨘Hy)H#`$_$ⷆrw`Mh㑕{v=O~-7&37QmpAKx"W/cŽpc[B `cy¸U5-ܭ5d>>1s},$QzI3@l#辟&Uzk˛8a% @貵xì0 o%mu/'@FǦ6)mY@Kŏ_Þ]C)ĉt@߁ނkJ+ԶORNP8.w|;80+ b]~[wqUlsmq; _ZձIX^# lv v+:)DUz|~B!=$|O#†tt5ڍST,Qݞr#=c+˾45{[@pC* V:$O/b˙ +uD#~ˢ9R7\@La #d_C0 DۭzA( k-#')k xm @6hѡiIBS #Пم 2pMu7ex q_uLί&dn)X^V8~c,|!M0m;/v\ %fzTygf}M_[%n{X<]1r1RPz3-M *磍"YTj^)t5~B~QXGX(9M$)Dld]8r~~kTDDZ_}l=Ղ<%b)T(ڲe6֔׮vIsT8~*)Zs+,ΊmoV`a9X},3(E~ԏm]!ݡ*mHdj@!KL]5h}X. )3b3C/{D͆ᅨo Aĥx+;Kǩt {$*qrv>3wPT6m>ʅbSi qVS0(70di3ՇHd25!T11{F]\WSHHsK熘WM[,r Ox6o$G >*h-ZKd<*~tE}oQXip8DCZ"ȝ)t)BK]9TdE$עhCۢnz %Ę~fl+I`njdenT"آe~އ&>&'+4dW蘱 O#rmkvJJ5{=;(YʦO'z;v,kB,wI7` EUMAd=Jzu[ސ|oc֨W#<lN4h!8ZHRf|iΊlw7Y=MD&Aጏ4UHB1YHfD IN}$S"]VV)qҞ~k_Lj 6XLүzM Ah[U q#h#d~ɀ;A2U))IPf:d`Y5+b/dU.9z 7`(#3AxF[\ ~@2  P |^oVb]ܸO<6-V{EIO ]jK8I^ӋlpWhCY? >5%p +7KC-iu~`Ǹ_4ד-sh6]8P͟?A#"FTO#Yޔx\*/QEe2l+ּ#U*?ze/_C"g{pʄV4M`f3п9NVƉFnZ1 )}rKң nP2i?^pհӑD}0XӖ#LW1=i{ |Qrf II,KAzöVgfv=ۼ-Z> m,n4(Y-w4HN{_΢U >,t]6kGPka 'irMv]<be9ޕ_#^x ʢ6B˟jC 7}kXM9OU){i006YSc5.39 EÓ)IJwB|Z$lJc\s2j7\NUY:Ge~˙YCVv,!eG^tbn˻l!|CAQ+YeUE1_|Q| ̆G"ha?L=|W#\'c6d^hn6ܾzQs(1ZI} n8CC; n{>lX =myY9 4VA9`*WuCg&%Qm6PC<yRZk g&Qn±zPB"G#@85XTitnf47BąJ24=yQ_P7Goy~Hr{?JPG֚v;q\o5׵bz6_[[}H_/:~QuNKYjrQl :ݯEbi#Gm ^^V=e3WWeJ!NeF8 .V-\:+&cmM=\׊@ 5ۨRQG{bqu^J-znb+L&ڵKg.S̨*CjbE!"11Sg+ZxW=lhT,Tĕġ+>Q~#Wq{9LHe=4DO!5@+^Au \9#LAx+ ]KO\Xd(vZhct|w|]/A|Lq"67Z0e|CU>Tis 'dcYwt{ NLT.p!EٴqM  QN0zw'NRNTfvȬԘ Z룑\i / ]&pyF?t>烢rn{oBC+8y]*ӄJh]UK(Gu.xP2RAVG9 \MOY uČJlЄ&<^@ZRbT#GL|ҭ\.4wݠ0p5znD'g6:H+Sr =c2@ e|-tCI+3|ˉ67pYςq!K*"3oDZZ{yK^n҆b7^fq 6k=xĴJ7iftu d!!^KSo "NF(1WC gာ2cgz9_jᬇ#@5_}4($gIpU?S>|}}[be!l7T'u(0F!qfmXf8ac'F<9b\OǣWf~ g,*24?p2#IT6锄->d9Io{xF-Dr7*' 3\S1b'2E2LFqkB.0JT'x;gj[1^n)? Wb`m{Ď ۋrr79C-pìFO H4r늛V =ǘ iE"L?A0+I8#vT;x S\nا[_/ dO9"JO\OSsS}4@>)dMn ^1-xe$A}ԩ?yDe,/glNz!> v R 0AZ6dשM;6֏$I@ !׈k8n0h )D6s"" lk*Tw02\iI=DphFe !`P%+(0}5Q&1 ">r]d}0J9,y_ [#c= /Gd: 3At|Hؓ+Rѕsq\IS)U@"6dp"Ks!#x:2M¯.DRbq!G`)$ r8we)% #R1XU'%/%499FWgTa ҋ79Jj̾H#Y|}h vms X)wwu+J{6|q&)ڔb,F%U?Mx}I M}w5)xww {\N3' jX@̥wJ-z,ЉWk!uD*ՋuNeӒQja&tc &,}ѲMAL^)kHTL0Z!+|~i$㧻ڠ J;Ck40l. ׈ +,A `%rY녷 {Q99YȷX:YEhh8ZcWܫa k:tܑQA !83j\ePtΖ5tVwa,Q=dUt՛Yyƭ0wӤHM9DqR;>7 ָA:Plg$GUYëw*G4sU0ׅا/lvg 'hA^=}&J/{]й3tJ:R"I|u"orx'TFo|ZMc.Yh42[WSq |KFx6~? ԏ}#?/V.R PG6y-.?^gNkV)pgyEPՅWJIQtۊF}J_H̜Ѳ~F;?oோNA Wc$xNY*M'FG2KgY.{Fx[D(c-v*G!ɒ.GIvZP~WcKCW*ݢÉH$ҟR0YjAr#Çd>=jQ~gz8yN"4|ea'`LWˋ/Oy!h b`K!9HXYD;4NH_Y>b.[ect} ж|i?j:k(:Fb8vԀ-%QŞZtƝJMb+o&QA@%B֍RY+ZnY'i>}ww(fBF%ʓ ~G4*c# XJ*Yޒ=ڵc4`.)bXf "O2`,x-̠ ٘ڭY֡*M<'N%#cBIY5F_ 0|"ů8r,i:[*_S![Õ. (]ҟ-) b1b`Dh{Ө#]Gg\+RMK FB Z4%yAjO,݄B#Պ *-tQbf>x;b}tKP_R{8Cn5obڮ6!*$qp\ݦm}MsZ- p8}[wmcYw'ݭ܆idцSOKS K߲ -cĆHLWَ-X 5e}!%}9F|/6ADvq 1V 9M,$R\PO I7HmWH6l0emv :e+o/2zF)"Ub Gp2+vKv5ZQ[%/ zePh"\KV{҅l<-R:hD &=8!"B xOv/]0(Fkv[9ÖU|Jk#QWCm;h"T|2 ;}#\0ay{;1?&F`rbsBF@\#*yt*2Y=bmIn)KTe2 'y`FL Ȩ1ci|Mfui<emEtS7KW?q·FǀC*7[UK('6W!7oP?Hⴗl!rw8ĭsȟ<[˒E#sny\y5`bxAM~Z}/Y]zW'm^75xo'c{5-,Ħ@RºRvY6U h&x?JA[BXƂhIL`hPl(!M7!id'^ͫˉ^k~-@gIr*;JZd"; )'ӦHVDQ>j ;ƾ fBl) ? (sJ ~:a|q,8onhKˑwO@Cz&%Z=|m!Qzߥ͠%?%l\`;1/*ߝ?њB|v@Dɂ4y7{2aў»I=qlsZxŖ)?WjwΪqm4c%x{H>|nӘŸAB=DHR1Pݫ݃)>}Yvb+aP1E!Kpd΋xMZF\r> WjͦCyy"%PPE aX׹9{{M<J9+ hbw}05-a!2n݇r 5l7$M28A6(}pc eaz!>`]Quؾ:ŧWP;m:9%|ϡK3d gj˧P%}y2"?R@.aBKX%Y!d!b<#z[ cĮ+X4) ?(݅9v+_5{:us4<2iAJL20 ?AsFn)xZBˠ϶6Ud]ksk%Io=ugݖV6ޱ:[3ܠr:i.2G.1t AYNUN{bZZc* C c6Jt-רbKaDB;VLmO*Eh6ɰiή(!4qRupQuvåh(j rU7aǍ@B,r_+1~)@Ҩ؈1)B\8s_hNwf_(T#cɭ87N]]F n>L0={FS \W' 0V,ы(uxʺ.ͯ,檋78Œ&NC׍bIZԉԞ~* st7~N[L6iLJҼa1rELzpcT*kVd;YBY6dHڕ7I2,!|Xa"#U[{Rʜ@JMmD^7bgЃo|/<"F9Km49[ewî60+tΚW!|H&~i<^mML=;Cc7@Lc :"bǔ\f)~|[:`W!?q 0fBJۂۃCf]f=nܽnSM яޑA\b!]V֓Q]a7Feo+l]^4%@nTԃK$f-ƥdrflk#:KAeˀUB[#!ս>ߟ!x͍PmKͳ ê'-6Ի!#5rwդF=IӑRvMk噜r H,~E3^d:^BQj>t,G:0u+BR-?wq][ZMט.Y%[ eCnفUP*<o2F\s\ nfꁎS;,qŧq?rJD-"ݦ!@̍^k @x=w|[T 6Pʕڷ>'A[M &/[0 yZEmK- Y8he\LWN DLS)w2Y<ӈiu]Z(=2Upr!,`5jţ]&yE2fB\iɇ"Di%CRSM37㹄 WQ@.+Jum۽_n T΃e:,1+>Nv"U'DLvʓNjF®vX5ʪV@UHZkp6HmrFn!=y}uniȒxHqԔ&iLvN6C0F.T_'\ӻureap8CgfFgH&5[ :r#`m֭L.Vat0^xK0[s`mcGCQ)]#@EZ)Y͛ji8!{ ˎP<_K0#ٖyrWvd|d^4 9EȧAhh\4&+z">_F`! B{|igL2@4bs(P2 v$Ұ昰i 2Z|BiP\U^ Q\D~gC}w_ cV5Wj$ 00G|㧅!eo䷼_q]5T$s j9?"5AI_vc!H6EкxU'Qkk* '埢[ tEml8";OkQă܉$Qٝ[AI%VbrUԵ/Zz. :UChεzo !=vP8w^=摪q0+&ݔ<:3~ae9).?^ʧW<Zv0qZY˩竑!(ݎ;ڞVѳ`crE &Iàb"678wd?j$1djQK9])| )׹b>r&t&ƕ'(qK,q0-ۄt{EV+:ORtIk`O08CMI_80m_w37`(.tUs蚝Yj0ne :AwUこjM٠eC67#ՁYS``,T 2pi|_8Cc4Lce@z' c\DTQ†+p`+l I p@+4d)yڠW% B=#~1XEdg'ge.omoC>Ffh/wEEn}%ocuJ8fuɶF҆;5[G$ raI4':B z.R$H>XK&FO%jyxpմ?/a[^Be4U@.Y/Tڳc8V25#:~ s]m#Gz=^7a_:iV%(\+FkXGʛ`}PPGM7Y\EܣqlDhćSNuz#2qj  IQ!Qm4Rul?KJF)t3 _/ ? W4&cEzW/^ "z#+q-b1a"SF*zPNZik;{Hd:e]]NUP9R"G9*{c׽i]-:/Z&8s SxlY+&9 ͬ3ɵ<%Uispں4J)v)掩0I8^Ћ._nTɕث)֎Oy"g#HДF6=j\',-[ T]"jb&CͅX*hsVBڔӞ1g8Ӡ儯ҔiT h4u2 \l>&!O7|a$ck9CG~Eg5Y3Pgٴ:+_wİ l S'+/)kS s&7 4d|C KH2/>G|{MXXbKO `+4{/arC#T#mPj v&*Mc\RF%Kg$$eoK=>(} /up6;m0 e΃/^nk?Ό1Α/6 4hxO8`׼|&=l5߬>N lzKxx0s3nd*{SA8̱̆ci,{I^X4.@YqV: ycحr+MrhM {6^qK\ԂYE&[ȥFbdR׷]Q v()@lR$S!p&sHf畞$@hAᑣ56MN7p-˼ 3SRU5SFq>J]_$0BUf E<^6{@LvIpWzb4*n2q#k|^Hb f>eyvks5f(Se/-re~ԇbʒyEK)##`!savz):0f#G TxS,D}(1Ilxr(qp =5 MoO]T|^{]_zs݂DE2@2AHC=U:*Yn @KOvky u0 4(\geI`.{=t̺ZUR:(-!.5D|l|/}j&dknsm|(/ L.z m5bcC ir;[o;K8.u1?%C+TB4mK<^e4]r0$"< f{㪑"PGu|Lxz=j7Xҳn =/=7̄Ē*rb7^RȋwY1IߌuN}s1< }W[#-G& ޙCTu<#Lzzm6ۑRUS`!q,&5̉H~hӚ_ Tl{20vKҋQZ>\wZ )y+ xŐȖ,g5dn$ם6YiA̺ oFoG_8{X% a@g#x_mk:3K,x~跶F|.9?ژߥ2 `6dbBvc <(ZI-> $Qd'%HycIȞ7'a*|} TݰGYm{k)jjxÈvQRH,QV ~^O _5\w55@0PZǭ/06fOH²+o B| F{mIR љZ=.o8wgwn_`|Jm\I!7Ԛe8MEodg1|60}>96c0B #E!(MSSBW5K xy9s\c(,9s@G[X ]s֌s˜.c$^ k! H# '$ϨJpFeƳX6nf_^܆{m v 2ԥ+Ud8Oz斳a`.(11=\{&^rT͈&HeҩOwb-/-D_5x<@Ksҟ(XtgzpJT1r3Q l, ,?UDaP^܁=pM Z!i}{kqɈ/87! lv@1.Ka18V<~Fba۵+|nxlQ}fY z[DXLZ7c (]Y:BŰvlaj$+b/Qg"rvaZ@G 紑 J̼I"k_J0tE%q)QPhw\ JGijc]x?Tec79$Tm6Ŭ`asf hd]u%^gQMn2 9&?*{ȟpN"N&@:~lGR{WL Z:Hdkɹ_}B\ȞyZ.d8j&"oj&!Չ2l3P ~%Y63 ߯f\xKР:^+(#6do%}.B(WWyzKfJ]mH,p9lJ4v(潍`ѹp!z&a ŶA2DC`RQOp_v;9x&昚h!LH73k.n,wMyPj@u*vQ[p p!8:";*ͶȭEj$§ 0l|٢9ū%M#YG/[)&K@e62E733olo'Tc2Rp7Q@Idbze7 nWN?@)YE?x] X͗f/13'k.u yoLx}S-T ve@^)raqj [7 $|ibC̴ u͖=OG5 cG`` FP>S]ik7Kk J&e SZ{ec:ͧ׋du;sw7I։ƃ[U_))BՂa 㯐˼i)4H {,vn&=4YaH4S#1eZSy`j,M\D2滝-N2dȄ5F / w"_55t°*d])MR]0 }ric)%[.xaاp<~'PbZ0u8zYi^*9d0_vi>%nBԲ$az-]ܨnN;R@ (]qh˕*-:Dizȯ)"P̸QfL4`QZˈ,`b9!1 ;|2ltfRT=DU'EjCP]w׺{fk0 ϒc9m|;%EH$cIV;C~ԉl'nw.}2԰h&H}Xi'Ed i˂ѵ@>umͳ8!pQ-uIq@aP<1;P1RUUo { Jm_2݃a>hV)(K9|ۻ*$I8BdJ঺!(CfVJc ϓ!Ɍ#!)C 61m+'rn' e@*XAǭޘW?eLܑZ]nSN&J"v"Y{-ICZ/*F5剒0c?O&Iw͆J7vIȊgYq]6(6-5~kq_Swrܢ.EÓ/GCVtɹ M=rLcTf] >z,A뵂evTr'CX/Mj/PЏvvuԣv^(gB GygTV3߿œa99K>/d}+8-k?˽=~"Yk|"+Lj 95e[a0J`C['Ҏl_vAqd4DArKȠ7e7qϛ9]o5% kPKY!ҋHe&פq`78r|Y46GÙŇbR6˜fm@Sz z# ҵM ?aJOg\ \櫡4ʼn`buٶUk8@wD!a 8g c5/ @g9-Z3 ڭv؊PBˡ޾qpo!{X7.!Fsun>vNI}`fOlRRFԫNo3ÛNY"eF+M4ۏ}Je7I]; 4)xbH8涟)vl"^֟,-mĀ9wsSh1v׻ehgSgV2ӜKz#pkEJ ,p F[QlnӔDbQwerwV3v6jh+acGROzbzLTpDfdK&$. XĹR?W %"As*@ Ka{Gi-W Aڳ89,r65c~I=9%f+U c9;*L˺MEM3+4iA/;aIUcl =(ĤZT}CD$\ʊn5<1/U@Kǐj@67zYW8N_YfUMi/6* NUvk1^-/ Q]˖(My#'Lm!'``ѬoZ yT^uۦl3UߩGgPWU3cp]#>M+oɗH3(TSi+3lv{3G+1K!I1iǮL9 'WrDa"EpNL&8~%l+VL׏_iLC0JF$TOc[]9\r*~q ZGw':ŧM,3wS\myD \4:m( y@P?R 4f"'Q3\Տ{Ej9"B@Ek 'k@ⶄܨm_Ood'S!cPߝC$Y)VAuƱ<.^<.=&_ШX{eA¾;*BOKV& &rNV$ݵ=aP? &.=!I[/Ert*nDoT+I.~n8hiM39!z(mKr6&.af 0vށLYkn>4c\T6VUlн/0:l#v1:}RԢPDo ώ6D,}g;S6F8,x|6$C] /f e*FҾn]@RpF,;ŏvyͲ@cs 63bLj܆1Ůu{B7wy>^hQ5L\a##Z~Fڶa"Iy#3|ԏg-gN-XCכdI \DE Ir3ߖtT2𞈁t}!qFT;/Y#Y[B6Uʄ˕JhqIH鍑VNU_V >=m8 S͵cQ`uJesfoj4{ўsx ز(1LH|mk@#t GX9QkN?EJS@!qX]6us \1^-G<5g[EEn }!+sg~@:ڸpp{5`|-~@R :m;q OBuUԯmqoG LF>(cn!6bqC,?nr +Ia$zzaC*#ʸg+3o8CV>{h+XmErb"%BM) ΖZB~0Թ*SCe7z4rx , S6f3켹)bBzۻ?29q[*}Ok8cYVڅiK>4=`)Cteݪ1=hHY x|ޡmA䧐w@Pl_R]늎:^GKrɯ5鋄w"a'9܌F*La7nY+bAK/fΆ*$j9iDLiCR xl:gGw2heܖ4BdO (vCA<{fVJ^x85B[X&>d&va %mPSaQŪ aEZWL+:  Tn?D k t) ]ۉ671x[f1H0HWTᚢl.|L+5DfcrZU(5D'XGvF|6\*nOhSqвx>u>'BGJ@ ևY [QChu QkR e>g:A5z&{-w ~O+/xI[dL )@P0o(*;ϭBZ7LՅ@svP #d.3sI8tarx1 ss9oW:x3|J + G,Ub1JKzܲ/$ٰ<n #8IO Q]0x VT`&2qY|uqdë |j6{P^N s,=J:ڤ L96N٩ġNB 7} TsnldȹD4F\AI!4x$.+2[ӟp[Q"Oj0q<:imu?J ej1@m~tC-J6w+͐l>?n 'r1#yy K503mLx,v]:qȎ\:\$da&>gg]o3NNlǍ#q_3VmI]"9`VW$/ri& d @k+/N;E` /;f95-"'+늞 DJ ?рzZ ֍/ove.W F0%rUV0HMjT9 X1gmFH7r`k_5-RY2ޞDR_fO)uxMMtqtg8m8<[1 TUbNIjٹ)㕰 pC@c6S0GP|:GcMޟ_M/;9I;(35ԃ?GmA!徜!$LJrz5 VU8gr'zb`6 gj7>ǔV.DJRCs &\>="e"j wg0 ړ^_P㍇ڳFOIrN^t)T4}9CDL~ͬ4 sʚ]>Xd\J0([=W_!jWI % -\qOnxmL;!LA}5d'Ő|=xӬY#wOTp1o|)c^>sy=;q{~Ql҇Όh3R m>s{)"Ɛ1`85..Au^-ATNYj d=iBjc3eϗg[Sue薺.u46{x]zPx1=ψ~ lDO>$?m\ĉmSc y>ChdHK131O`xiZ+lok ,6JVvl7i2zGlq }B%#K@3oϢCvN"| a`؝'GDқon\ ^5jjtxՏ=; /#h%kDk&؝KO,/9! 1?5Lqd 1䒋5ЬOHK!XT5xGU^Dj}Y G3M`(+x")V6t rp,MPJBB5H 1(٫Em,jV ɭ^sQ8GKMZEnCmPPZ"4YZGhSk" }oK ZD$ ީ h=n7A5TK0ٗ:$ b=>TY3t'enh^7v҃}k05ZJ\rzsqE͎zoq8''.D˵}tBo Se/Mݵ# r=QO$+Px_8Su1D7yN!sox:$mRnYo\Jp xqm2;-],کI'C5X1lb~m?ɍ0e%m|lq*I(##qT-HxK^ #>Ih=;z_ 85 SbvvOa6&s7zTi\Y묍63d aghIxhː2%;Hhv%2:I)Q(ACj@`D2XSGByu|o8id,2?>BY 8v BЍق!wH`B*. OJp.buVfEt!Ӕ9$_<,HJÒb?\%% Ed>ێDR=C`[` !Z3xhC&oEM  =nyw-7 NVbNPhzqbn?h7*F$kW9Y-rtbpGˑ!zf&IDƶy jαqH;IY@S4+W %w3g>sU]'XN{=`8X~.A3Og/+Mb+m{v$yU9m \\!78#w^n3!$杢Maץ}1_Nd+{b$ڕ>)+:Q'u~afȄQwk/`3Rz q;U4wЌ* q^d*>:7Vح$ldw vՈT뱄b[o"'hzqJ0aV_}rv '"@7UX< ]Ic\l"=-|ob —u1WE]܃_Dt Em(H<JH,0n/`s Ay؋Ej^}HOozIՊK5K믚bsyd l[uIxQdT+ Zc Wez+(p@EQ|5+wU;ܛЖUdɀq@Hn 7hVg_$`<YyoB]! Gej{z@n <3}[SD/Q1$ =l\|`7W d(Ȝ2'ʷwgh ȗQFT,v*xJ͵x*+IpهwiPwndQKP]_ i$ dUbt,CFfSf**Ka˴XpJL@E}G@dž7+C 9wRK#/hzTםhry]#˶Ng֓6&;@1 R{t;08Ym6ZPp;s7 7[ShIhuaz++ 'g% \鶮=pq obR/J`%5}8t?EZ Dƅ=t^mOJ(W U)H #^8]FS@@cY:R@FJoٌ|}}kLfWUf݉eRtg{"KisL4nl8K򭸗]wTݠ [=b ʮ3ng5(Z%%)HQ+ FBƈ y蟱o66z>B zlf̕EAv?;ƱyRX~I%j g6ZX oQfi/5-2}cFxÜn~WoZZGu FsfHSiXΑ)'?d?>}@4m,W*=̮ZWF;1<׾RDycNmF@Yн`~ST F HGxIM\ }Sr袒<~\rV< 0Y4 6~NU il99`TSl n@0ڧ}8nP.^%o=?OG)UgS: FHHxђճ5HiͿ^?hnEDljΦlx%P-N 3 yAŻ59-ʄ6[W'_JO"M {ChXD;q@ʴZkk)xvck=CͶ.pE)oK01Yч)'"; )|FJ]k9u `?hb(6݋d?oBmu.|x5OT3r0Amy )"*K 6PEfb~}]s0u]}A"Eg%W^~n4h,[sW42^˭i;uo/WqdƝHzdFU ;)` GuL5f8]lt{,Z _2e;.GhFoV'鰕gO @rJޅI!2ɦOFPxO=R/C=1RY^ c1]uEYtl6kWpD\_L}A]6BLKWZsD#aBT|Y@gyD^>WX`O,4(0iJ3ئAŨRp؞T[xy֢|o)W[]8$=+5¢͵;7?JUz@M+ߠQڜbI{&~?n^/ڥ5[K} ـJch2 ?ejݚχR+yB fL$pϝa(5I7w)&a0e :.;  )a`@~ْg)7 M>!{uCL8 r[7!g&R([GmKU+܊rޜ&aCqhNnV-||r:ЋoȓZf7EvjX[ qh}"H N#N!t ԁNWDRnXnHdQHg[tSzzp:g5_EǡTY5Y"!څz e*o¿X:֕h5%')T4i{1G9tb"\v(㜍/_"oi RM%kI2)p֚p8p7A U9uUC2ӽ`V1Qy;"/ !aIb O+c|YSj$0ŌX('8; s-d+MwwC@KD^eRHeJ '[pVqd$ [{oCJiO&9 7WNW' ?W&9 R#<:t5ۜPU% $!E5'Tw"{1 럋H{yyMd$eWrx4lb:(`A=^>p͒.TY]2TvWZQ2сCԸJ S: vѶ8MY>0n com)PLZn C 8s!Y#JL_/! jbР13f;ʗkVn?wؼC Oq"3̖|ck!tWp kuOLCfÆ>L+Cpd[\{W(ЗUMތBTz6a5kkHt|wvQS%QTT%%ƹũRĭXUXIcHD;6ܜjNO1ܰ44Sjz[~f.`dNu J/9س`E'@/u fqk&oQcx3kРBӐqrC7JeL1 'X@Ϣj!ʏh5`/9UJw#RvNm)t8jpPYkz m$3g 6ꁆ]pKcUeH4O/i$uH}=]=1PPb|CG6/+ȼ "e8o-f;W3] wq fRg%Nd|duVk'XFP#"OR\6BJ?ر9q2d\ !{q_{_y]vʲ)G{qQ;U?fH<P!rӶź{+݉g $- 4ԕkf,,2' p2{yoVHm9kܯdЂ)ra:w@{y%o"Di&jd)+]^`7!o4h U0 qrB0R“L+,ExOFTUR`z}%Gmݟ!|SoO/KRC9AuTc"j~|q5mxtrI.RVV W7ь~#ڤLeM S(jwVef[u[ƒjgqJlLRX_.ZuO0~ۘ%\}9lL_S k/Z_#1l x<[/wdU=#̵Hߖ8>(~ӎ~+]!nS61$4gAId]v9+AAd {B,쇈֤  c_:.>~h:\Vc)QwB^VO`߳9rUv= 3F.kR{c2^kt<β*/qqAVӧ[ A_%<a"C _y NJ)Ny IWSb%#J@ӽpoBfAxR+y|as5@Ɣ$P4T}{>[I+hT@<WRHgOŨJRv0Q 4J4?1qnO_58C)VS#iOw+FB vg3PSbY#L=yFG-"o+v`[?IJ8/q<ނ"zS8VJ!BY#R2tFI!t,pOCƇղiA_C=w5ۇ-U)bõBW"e8Vr{CSP2,SF Nݔ(@,OT"4R7b^c9Iql<4rmb2\ qеK2lOi7Ztp7uL?Xbm whS5H˄4]l -67vEXB~T4:K1xD]ݲq?[>5Vnࢆ1&ˬ. ZFu(z %ڣ\2yš8h_b,j[daWt״#Q<~B#11ɓS2P!ײ q򙁆@Q`n ~(5%}8viUYJ[)u7+Z)m5yQISzffCUkh?R 1I"@b<+Uo?z*UI_1u;m>ZX5eϘ߆5~VڒnzpV,F=s,G6 i^%68.O_grYu%3Ե͍9jhz )#R b)ITI_;Xhm]3~S &p^e΅"4sK'wă<ؑAŚP (|ј=H/ ˎX2'#s>Kk?儍Sv0plr%uNF;44{aF]{G߂(X"_&B>0y.r]b@\G{12?7fF-'^VQo#OY-МagbMq<4P <'+Ak{'J.2f=seFT[XiDYQ _k@ ?0%xM3"|܊Fi(]?%/ڻcK=hJHlGE#'F& a "i ЇAK~l#;oֆ*8cf=1bVn]GwV\6dL;p/W)F|H;^ҕ7<MS#rXaL0A*u.3S1|\& |?][PKZ.&EB-*A8IL_=@+OݲG7+""̗L'%]kRV;Yq)RÝKgeQ@? e+_d0)ͧJȲS">"{HlKD@9oǗ)XBBǖ+Rrv UebԚAYfve*WEc*6\yGH]̇a =ׅspNTV-X@N@x뀖kjF; "ZNQ\aAFD'&S`vvMЫaۗfJ7cNLA7.7Wmvo,] #+eTgCoϖBB`OyoV#ԡhx1wb,~?U)aY1a2c ˜-ISNimYg4MCG/(V=mq9 ݍ? S8!{xp*&MȥP _d6E@LFbE^E@x[*X0=U@HR$VT1r,dJohȫAO,F# ͤX;7Ye4}aOaĸIħ7-9~|(B]i_pעP9$&Rhb,+)w<{ҿAE aSC;ݍ8j2zk.*8oНRp Ln8` *sL+}ޭ$PwDUϑy Ab#˚ZMZ1JC(oIuy,2l0($60Kkf*?%bގJc\p7͌ƐaF/QͺThկek[]6S+}>,4ڭ.KmPW!>P&bW㙢Sh&ԝC*ڳa ,RzyJDwHZع(UqD~7".N47B U sZ}}־u%aK<ꦅkЀ@a['Vh3cw׻a~Ѥv~f#:4.w"Zm ݇H2 }!3F (qu(.#J?*԰ޅrzT<`:,Ex oAɽV_">I;rp :b8j`(txVIj r   Y[r|zpbMK+(h;uoa]etetf?a1SA"bb3p7>ö"ge`iHdE1[&`6bu*է(5͗{JAeWKZ~]]$@6g0A|l i"=_GOFWxm t@z~K6l~vS'^h:'J/O zKa, W& !ՁFJ1d)F|0>sJI>@$/Qm'J/MCNWZA{oO1QD9I0kVZ<2c;~*6ΰTqBG /+ k-HIK-6m4 Kٝ"v+\EPU1k],oř4F3 "IZ-0.zjnXaJE-F $^'I5ŏlTQ- =N?n.4S4|6c? mWO"PwLtNy:J1qgi8Xr [հH(q_Az=VD#4;zT(!n!d5RtnlΕ$ڇ-kݩԻ9L [=mtօ>#M-T?%!K{A&/ٍK2~?TX+)O*ke)#_X#[hU,{8Sle|F]|sxGj PGḣpS&fዷԫ̓-wuMs9ʮe? RP+iDlZ/EͳVhBqkZXd-q\/OÏXSABR">H靦G=?~nX|0xF^ Iڇj:бp}eR v)(oJ Pxd1qڱ)OA,T(>l5:O٘:"t˅yPrFÎ aeJeMbڳWI~S<L}5;G#lCHR#軙~nJt!ɭu|dڒ`.rp81ƇRǃD2 JU6h C 'e`_b|RPFX y6!nDnbwgtץ`{z3%s1bQonc401,RypnarKcj)b ĔxD9ic P9 B GM`jsNhc;Bk JdUsǯZq"ůEM!| !"-ߦLex7^:s:}"(v Wh3(#J(6= }Ջma =bEucZ |o*m_$[TУO'eZ6~Ҽod s n+tHT&.$b[ gr BaLPDc4Ί̺ sƿѕ#66WV[$km!)۽z Ka{99c@DfDttU&q7qIrsIB& NO!0:R1X^@9~OҡQ$83ɏ!w,ϟb; 5PY+RUwHk ۤENL] 9ҵozn·8*OK2}ի}YraܕH,q6#ZݏFJc=ޥK|vhƖR2Z-P2u7hTT$ܼ<\yl6T| ?$Bq 2] t#Ev%28/EMr{`?1\zܬ o>,qJkj)UhEQE9ta MXt+u_"|{s{dw>Yus]p#yB ||13Ri%^y(]q꒲F~#=s5ª}d`0IF8'p͸\@d[8-rAzIjt"V_s]yUAֱE>v6#+$5$4K5:/|?Xpa,y}Ҥ md[;5/(Pﶞ\nTfu<Z-f y܂%`AC aB6y4)6v%}v^x}{0Z즡+]ݺ9BË5 PJu\FC*\+t~u7E 10thD~^,+ !qp 5d豭R}X2e\86=zaK?0NVWZoW ܳ(OurՃ[Tj#2psٹ jȠrx!eH ϴOfu1i!M0 Put_%9H"RQÔlomh#PgC8|BJႭ_J˛UΟY>**ؚw NvQfdonC&䷘6GNEwVqsWPRsuz%ʥ1>ԡ.WZPt6ej(+pzE8vqҙ6c(=΀>5 d+k"yuz!,}~@(U -X:c֎W{3&›DTp  5@:w/B@qqxry?(mzhȰ8nZ3؇4-N()M+QrQM1ljJ9jgPd a"=EsyVC02|ux9.vU8M0/:-ҵ5wT_(x@ tLdc^]d}UXdIYZ]-+تE娖Eܰeu 4Yѹpf -_qE.&z0'V Q&6 6m%:`8lVb(sPV4"<3qH;Ʌ+p/RJ+*:X*Ƅ0K.H'(7Xk{-?kY)ƨ.Q#G$l@!9j#(W!$ s SRHޚ[K#䏁`뺥',rBs]S8,pŻ CHEcƑ`eѻpX]u!W[#6J)V!EnrpkM#-LG $VcTVg(v>:]ʔh#[T|s _%fKnaY!I>NEVUi2 `[kl430ެ8*CK{Đ|ڭs~Oj:Vt5٣-piN Gv:Ib[%J^:=+//raKOnKGRxXԛ&cN4EYN'S-\UBEAi+.ǂ}p(' ]QOJEJJA€Q"݂>mMPw;" Tܕ3B.x ڶ~Lo()d*9M݆r ?vm 9ˇz+ٞFj)U6)I!lWH!Zt\#Lv(0+#r%|܇%MvWvAocf{ JmS#k JPz{"V}BR,aUª A]L$g* onǨ 8عRnp*`uKsjo,AS#D-7RHi82KGafU>:d^z4Nݩ'O!oFqÃyKmӷx-q,q nS w՘HjBW4z1] Wvwu [$\4=oz,v2 %eenl#ͳ) T&ƚ:Ku p ,۹J!i} - e<\6TngiZQN󻴃&j$<<4Z/ݎR* ڇoU}\w#o/f*,ÂEf };3~l1l*WkXR}-I(ks@ly|w[֨濶Rǭ RΏƕ9ۅpT*P+k?Vhl%KRz NGm= |SQڛJOrGcb j/~&9hMEP z+kpInPpW[w:d2[f;8.NeR/8s|]8GTù쮬тόScvaM촟̔KfE|FO iG\ %g K4ERy}*\MgYKd-y"| +nG0@i/!^ipM%1jR]l!1H~Yroɤ4 {VkMmDdu{-tYݣKY Ǽ2Ja5:V#w+,n#VC|CoXǗA{{4}CLdF1(]MKm, ĥG6H$Y2E 2Ia pkmq|t% %z"2~_;.{E6(Qx2r>[W%Z?sq?pKvfڋ6D"xo5,L&?[W .6|0L(P\~ܤh|ihu:S<7=ю j\m`IP`;we.Kvڅ'a:lQm7*u("| ro]d(J?׸~t͑}Pfܓ&:(eB_G7\GC8h>&F9>umsҌ#J4Z 92j`;P \o6EP>fȧG/dP⬔fօFXgALK7xJ8x9kڙ륗,KvJzO?~,i_{28+Q"Hg̯?ۇc]כgvӨ=ӾRx8/yTS`% ^j@D'H̀`ut3(jK5Q*wO[Aн4-zRV7^OjMic ܢNBW4Y3[ҘkˈUH~Ƀt!䡺+UeVΞ?ڐys}6sX'63e4Vۓ/GyUXyEcJj*"t×-c2~HOA^牲B'Wi?(=] ?Wi"7z V?aO*ov;FleAEkAgOz?J)a9_fbVe5R;7)x9Ġ؉Pcix7^| -GBg q(GiHLN^~9l e3wvbFą' slguX5" G"/Cg _o SuktOQjئ_oHn33<ii1\Dƕ dJ Ӗ2ZN ׋Zj|޺f^R:a,Cиpi(Z:Rx1]y2fuˎ_Ta@hŘu!ԈI5oe{3, {+kI#*= ͉.=k+"_`LaaNpgҦ[lB6}4YE)俏 p݅"e}b&L&9u!~3sHŸeQW;Qee_8їn?ȧ8湏~I2bĴ?BB:WR0n"\ētzC+'SZ6"GBֱ |ߧgl$$bʏtq # Z=,u_4W3Egg WM).Dn#jt{km$SD|tɑeMp#_m=67QgcZ ChgtM 9 tdƮwkDäעF_C8} f5"sZ :vg4m T}aҝ1Ru8z%]B] -Xn ws`'@: mSD *ۆLl:tt|pXۜ"WuNO`? /a۝SkMK)TVՊ:_Q`/ i*\{Bh")QFQ2噏>#vjhy,mu=J'HO$p?p[Ŗ$'BdT5};47#ݨC,_9%`/t۟K23tu%'/[a~jݲ]?剂 yqt2ˍ\h*Ш (Ͷ&#Ї,w4#8\~Zw~gpI5eݐro,5Qrx~ >,ПV՟Ag`|"k^2lI`X! 7P aw 7"!V* ;1)M`*8Ir3L JAݺ3we~S ~D( ^sΰ.=GԴAhr=6Ku_m\gX܉\IsMpwANKTDOh($ ƶiKYA?MR53lOVTIPKE2CчSDF|NU~[dj !BWgDX}zQX(.(ؒҀ;$ꞿ+רBˠ_c.p\% bmB5tlyAGFڸ0/ef+XJt6ENY f@h_Mz8پzO/l1@D>q.6e8 sc4myټI;c <4BAH`T&rI7f}C8wEͽX<̈́XY$^ЂXS_eX&j'e$LXMPJ٥cCgYj>`a$͵Cę۝<sck\DP iYgcvR]yӏ5Ӳy7s,8qx5PT!5{Ddk,4\SwyYHWXp)dž(_H8S盘&L}Gn#ɗV}C*͈ۜ?{RD960)c=ѳ"Tr6X~LϙN1=¨Wwn`!Eb' ;bV 3D^NEm|hTHmY9#&:u/f+_J]1!%&H d,p"%![l4rc: 0Q:KQNsT`վT|^7|sx@g*'{n34m+>s_q#kS> aKR<<'"^x؅8\B#Ph\?5*>,S ez J/%{h`cʳGb\5qnК H 8+UJҀ*g`37W>GDyjSH8YGsnSL4W& 2v݂T%w<ضdFV6j-S޶lK5Yյ ]yE7q4AnaO=ֶH%~tsK2)HA&ځ76gʵo{JbYlnn$d_\w1WcP v{-J :#Zt[Q_VC 姊-'ɮQhsC!mF̴iq6Ԗ SP.Ʊ9W/mMռ5ﲭ?fNȵ;yA5ߚ&H3"f{(eG3#*8|Ae 6ȉiu SNu >D%HgW=׭6ˈB =TQS; ̓-ܫѩ"úgsbAYW.ڻ ʼu*oD9 xM袟R\+vB~@WDT7ED!V,4)tV)<%6( S(b EY>[:pg]w*]+8Y1w>Pi{,|p)ݐcϴhspYC+HMƲI >Oɴ3קݿ2~2 bIv EDΰ$)py) J:&(Y ]TNl0Hl7xިgi%ňT(Td]^[Rc7j5$T!a=rKjgU]g^jMrm؝fbzgD/N :k9,joؤ"SSTgaZ=:q[91ohg/7cL<ڑMdw.(THC9Z+E^RhXְ"M3ݼ}X2od*Yrl)iMJ#Q[Vj OD]*D`gm㞲=V,H%ڵaB\hiYp4bC)yҲ6hd?d?,,Ȃ/͑(fqd2~Xዡ.&bi/!¡RPJӏ-qlcO_~Cc k] wQUGa⑅߷ fkGK"(q tdY)3?+u0G=(ĀBAc3Xƭ{Ǣ2Hua5 t->[K 60;!Ȱg6!HJ6P(_^cǹ)jD^RoN*S^ק r::eͭDZlTKX֮LrUŪ  v1XKa2v:סqO.pmb y_jMOuj*csrCAҖ!+KBP¦NsHl>ra6"4?+r2;;3o!8.=Q^H }D ǑI| 7,jӯD| HحFuE88?>m£,zgGeQ" bH.z-e~H FY(0Fҙ~NEEQ;ftԇ_aWPLT#")u>dLX}M仧+%΃mc'cN1p*3 G hgru\Y(z;y!۸up>,%b+p)<"qaPfZQ:GԅYqo!(JH_ e;'&ƂG/<1ۜұݓO@h۫acލ c0Ґ5b|K+NG?:qTA#e?<"Bss!a0W E FZ1IJ BP H'6a_KSVcbzShzo֌,p! {{\S[6wP/rMD (=@3&˅*PT'.:GZ y0źP966#-*FЌIv_ bV[.AV/"W矁BO{"5E+. y]KUekZC9=e*ܼ$u-F9h(Y4Υ/KTDÒeT&ԙjDGAlq_rLy)B}x u,ԋ)rDY E~)íhp=d2Q|a0}r}z9ȏ!s&6\e;s5&#ӞNZEہqe&>0fԡ0L2bȧXWJ 13Lf[Ȓ$x,a3)L$?'uVMBWCa\ b_GV9CO&Ahhcwh ŞW,?)ˣ8v8߄mLe~CͫNǃ_o& n .º(r+әl wB 0osYWi3LGp3͈P`˚PC~SF"%?abΠuwX<0SL-TKv5el\ӻ_xDB0g`j(`!1c åĢd?>Єdԋ##R29"_$͂F c<[% H^1{ޗXM^P)i }TSO((P64t)`KAKoWoQFȣ}ԍzV]o,'D*MOlՀ~sm%ұX&1J?~􉶂ԃN X#P(H3;nPuJǔ J t}t@}!f>F莇R[UՕ1E:ɑ/JUF3I49?lUMЬҴ+o V6p_!h e1Ph5%,ޘ|$H)H.Ge'>t5uZRjB.)ʾ)Q:)URΑ{~7V'Yڿ*8Z W$𫈜y krȲҕSR|t1kI#X-k۳XtIyyP!9 &Io_̛Uw7B>|&%ٓS9(Ѐyv@T|%|kI€ n-A>3BmbB/B`e7,pS!oN\ҾYznjlk];wiqCfWq6sKCчR4jF.@ȱ\G]GX>?iy0Oᇥ]'hHvqA$x-4-B# _B, "cz]0#~(rAb`#T?Mat}uܩPx`e+3jY~h<ۙHp{)$fquR["E =o:iqjihG^pi4^eD=`[,<"XU(~f?|Y-ѫQi尚u v/o\lK>3o^`:r`,H4YwO2,B nz'IZĝ*ώn.޵pS}-㸡Z<>4*D+>L]H?N=XfJ4L X Jr㭉Fۺ'kv)֧#=#,`G-eqxv6; @7J޽ Y=F˭׺K=_cP%A 9˛HSim?:r o#a9YC>^؞AWxLB$RqA&/v{X— |.Fr[Um2#-3ػy`^BKٓj(1l)b5Q/\6Ϋ>o~!QGʁjK `,*_ѷMu_t"y]*323R0>t>>UWKu?9|Y[*P_NsDn3+B4)$ʱȴ#c:&F]Ժ#__³¤!'9k?]j_#C4^>NME\@`n 9SJ*Ķ~&ce\ w,gr+U6@a~{],|hnyY- > R$N\@;sC̴ 46Wvԉ`/#k2rхO|X+O8ez=4ľܠ0f-Vq~0Pc)v a~wB`p R'lFg0*SUU7TNj}4vB?z4 Gp`KL &9Ep='T&1&P8'H\_ ~ʼnŭ&gk)B̥mT┰[1aAW79 r= 5nxc!<Ŝ@I p;Զͽ,N"r]Z),EtɰP$Kw@lϲEm Ql`=S i'PpڥƶV䃌̘1Om xZZE!lOaX}9DEF"?cAI k>ima!q0cH'!ޭ&_/;ɓ6[HFͬ*q̌fx--G.\Aa`qH` 8 n*!ܪ-;2(cpn53 BsJwۺSe4-SӑܯE24q+*-;PWcFdfzF`x^]̄0 f}qtv(g5VK|z$MYwi5m1pF1s }Ԁ$#<=R=3]VB { O9޺QQm^Aֻ.jԅ*ȼqE7M/ZӖc;9XҗMf~ҹ៓Ύh#TkQگ#fpm]RaDe;`}Pi7ⰬVO:;j h]\i'ꄻ ,%^% #* 'o!3! 6g_Ṿ{X`= d&k(KJ}3 ;6ʧ,e*Iy7L"X~@H/M1ګ^x1 Ѱ-g|$qΚA+ $Ă̵EŸ΅4MΦrAMcae+P#2yh;61Ӕ^0AˢγG듬1SAXP;RVxv; 1™+&,C&gkÐcr"T^X wb : )C%e )Hq4|=8oD杳.[kש!1tƠ/2SμJ^񞈗aP* C#vѲMeGFWtSۓ4Q\{w1쿹bUM&Y4{y#B= 0L?rNf 8^6zZ%c_vH%) S3 +& r/K+[9O~UO`4\xx7,Lyg%KYA"@bȷ6P/}W۸Q,`ʶJ1`/͑}G;M&AHz8q=-"/uf@*q.J5-nܻs~Ԁe壄*5 Huo'\$8t%heϮ(n7Sf‘G_+LQkb),]Y\ 8Qp!(-W@&AYw|M>h"3mhCV(/< =G#jesiwut wȃ5-H z ɲ ?p xD)+ώߡ@ؐ`=}'p(v'qlt8PP%5m]LG#¾lSF4m33eЪЍ7Y"|@l0~k5ΐ<2Git2S۩;4_&D1VFbLJ{ojoCC4 /E>S('3!c^[CڦU0V9q;ܑC-'CӦf-送VG$29(B& qN"Uk1b`Ez- DJ K% C2`)4 IiK  i-_ Yҥ"^Z43AzOPcmP{tdX8Z䤛yqB )̚29F@*J):C7_fփaADXm(a՞"d@zщ)cAK^;twO5 3hWٰ#T5^xl?k4n06aQ cE)uIZ ){h OڶE >Y>!06s亀ͧ >p,+z~vJ-76]7[;ζ 0X( 9l߱t mT=R3?WjrX.3WȘ+= :xTʼ0fx:zQnFa?8G; r;F0¾}$7vyҲgD|СAJJJG*`uCG4IX< r]S6젿j1;`j ^nDKXo ׭:2*SmWV1EH,^1Ɂ̔GȰ}R,[S ݯ<-\gkJiDln$Zs"4Y}=e7Ȉm;L&7׃t'ĉ2Os'ė["L^%͹_gf:DrIRE?ޭ OIT&r:c_um1uu"Č\Nrgt79oT-l&}T {Yʸ%[n^Ψ*7J!6znzzE]1C/͌ؾ0)3Gϓ-{Ikp04 R(r~,|iT}\ _fA9T`OAb&Tʊ@yh@fϮ憗i%-;sU5g:L;mu~D'$J_ZJc=)ΈIFⴷ5yU:bI6ji҅vQ1Npc'%HJ)b(3c*vRouׄ8 0*NM_)2{-u"jbb`e^h|_.C^ &AKf[3u͙7go>rwdVo!( o ^Xm6fBvm6GL_v1&ӁVaң3R!m ]\9ZA>5S݌#cNh)71HE,e3F}qF G9`)[|UV7)t$,Y J.(f.Go/m3((dkbcx4\ ˜{oy(4TKw q!zir&`4fQf:^rR%I"R]zLEZK+T OR=~:$؅vC\!| a0>al[2([ &JkZhBη5}wTAc TKAJGO/>B0: ǀ): @q(,R87 !;#_ {"hʱiGT/̥Q` !6[ e蹒F*8/AMGF;[3,[ 5ǂzi&"K%Ծh{<ᒰRITN0u=8uo2>5#xm6@GHG1JnKV(R'?|Q%9tRNNT_+,vw(R&xhLq%ܷf`7Ȏ+r]i0iGHTEUuK^+4N }˳@lIƈ*x5A3ɂoC7.GH'l1s\9" מ3$g#׌^/ #YSMx`O~TAfPr|O}Ĕ GCX7oUi %F8 A T?Ыzms4lfDYhU&sM=cDֳ =1S}]pwBJyQ8cpʏlL/%ڃh{UQzJ鼫N쨥l:wǜu+P2H"XTD剡gTG4HYU&NJrQI va^>ڗv`-Lp z]>p AVV=ѧ҉t>+=>CH A ӗHF~lɚ$6ݬ$hL+RTcLu(dӛy{N4{K}?n[2\i-SsyfFArĕȫSZw$S@ F TvH2I)I9E~Ov1+ђrҐÉ~ZP >I\n`;~ėSNJ "Ώ9lS"fAZ#0++ND'?),5S4]/.C 8RǙv0g8BMKcD5cM{#қ3燳֔C1'9ՋwtwhW^!e?^h;9`F* :X ]G*<vwx@WFb t7e=3&8o^, o'ѫ*M#-́a)TʙaDG~Z%>}Y쓚oVEV1Jv>ci_CQ]FO{ *Ell02{ ;ђ)}) }/gJY%fd#͋ב+,9 ߣ7A{ή0Ă/򔾑{Z):";|۹.DkbkhW#mg̚u L1Jn2+,2:A¸KzG_=G-^aU~R쭻ȿM.LISX.lQH=L*9[WЫFAHDrԀ wtંyx)qPLdP֜Ӯx)x`%{7]K4=H[VO v%[~ 6k2{ʘ[:1(/vrށG y%a՟|xph(+B}St(D2^:[ |H,DZmJ*h>%>u{]ÎS˸#a5/(VQ1JJ\z sYJz9$uQ[OJMHD\dTC;6+o=R^5HQn]+^9_F+(wj^#6fl?gY;)\EB;CPO1,`Xb Y͎N5AP:V"8'̤!/"~21}(nrcݖT8XEAB@\@oj}G_Ϙ]&òb 51x<J) tL6*tZCGe$%8°Tu(mu؟{UdXҵP7*'TTOBc<,z>6Ʀ4^5>,qs¯M#\`ii lXXCeoC8?#Ԅ1j$C7~R hߪ RDw!t+taSCp'g>~82Nb$'Ɛ6~ƶUI_>n [G&\nPh3Nt/Zc>u?ܸpH/~O-*e&K܃!q8ߐd`86~?؆ߔL3,!(6U9~M\OtLivp]~q&)ĴVg3qw.X `+2.VcS؞Qkc"clBP榟 Bh1ڲEdavЂ$#^HlOJ!2EFYC` lؙVn u6Jx55{yэ-f!!.Pv Iaa^1Um(gzF /dfneR- gҝ5Ǜfه'h~{]/0#s ?/c,Rҥ2HNCE+oPqEͰz|0[;ؘث Vfh$h/󂥩mDgg9U&*/r)ܮ6!"|UP[M*<*woВD6+YsX,\.\#Z,5[$N7aDYP^wQШBsj. |#mHr*b6pM%`|Zt@7^QJtAZIH$?1=hq.g~DeЊcc8?qt]R!9 (9h,gږsv-qr 8ƣzf'ex0n{ 0),zj ElHOyYKRKu jʡ0~kf1=ISj7TŐp f&uĜj"G6oĜ߭ 0VWc$'Z .YZ8 @͢Ƹ*\~NW%5^byHb? _**LEX60R&~9nnsu XXkww%Ϝ/!#o6̳)Te =}4ӜѦVaR{LQ VŰ :`sb=&=Ħ6χ g\Vtg[Q-4T;itfe0XiX˲Ky82c/san%:vULO%΂7ib,s'5/Uк5.FI؀2r0J.#AE "+Πd:&gO2 T[.06["V+ig .O҇z1;t^a-H7Zkz(#e3!#'kYXW<"8o]j٫Y[GdNig$J}oaMZvTVa3~p \{#a0 Y'Im<3C%A6uq} vt~_!*uj^ٱ T* M=e!ttJT$ԝC-_d˱"Ѱ@ij(nXNե3ׯj lQ'I ?8^#sAt@ }&וѿz࠱7ӰuWʛ|فt3ٗrp^ .xȅ58:}c6jH>F۶Y|rہ5P5״s6w,8 x?8N%ȝ5 A\mcvRS@*U>f[ۉͯ1LnM--m(.|Dzz0k Î[7[V;(^<5EZCK 0чj3ƶOFJ|N1y#v~@y=NW5u6,r1p[%ce,"}DU@ L>Wwm STsJϴZtC{,?@Ϟ&poU9A5MqC'p'G ]\}orj/A;!=4.wfsz+J/&!AMҴ4zir>٪60]MMg e~٣hQۉr7HUTX5i^A\'m:$:lw]Ls0qC(TSiyV]C#!i{xsn.,BLgvapI:2}<.oܽAw~*uA@jAENAҞ(;(<[1i.9 Λ! $&kX8ܮfJFFn `\уJE$q&'Hw̠?XBC&U*ҩRuYΆ]ViEG$J\ոOKk{NPf O.g~!'KV{;f/< iS}l[J=i"EFٻ#dƧfa0ҎR%zUB*Q#.}_gz"oHk.8Ұ+QW\7ϓHCvyܚTUA-"JyyFwi+)˿'`F$RZv?/|:HSZ40چU juD3|a,ق5mcaUˢn>aau͍$%/`#5;i* uF^VjE5b|6Ӕ&"?<}"+KeAj(fu]lHHj-8܉~\M$yB$*vM(뷐-711 Y@86#%ϟ2q, a|\6VV\~wT,^5-Em]`r [!9A%;0_r4A z0 4vYnb9ȁ<н]7bA}q @ϵ>{/;EN#mRdàN$Yɺz\ ]cp¸du" .O6ڑ`-&bɅ׉"`U=W:Yen f9`sʇ݁e4`bIwL TJDR&…چZjreؕK*}9[ӱhlh7B|Ub}i(I{5򎃠 cGJ}J*᫅G IN9ڇpAر=*ct5dYN?pCqj>6wFK#;U,inOk j ,KI()Fg  -ZTEAYke+Dx CUEPAxsś_\4=tZzrkYs.ԔyT`~+1;cꈮoA# |?Ñ NCh!鎬4;#8_R*ڶh'9b4EER;k#g8Bg߽}ҪgSЄ.4j|A#宝rF"0 ikrIajq0س=Psa-ᇺx**/}O㔾@a̋|{t%B [ɡ`%_dikӬ3n=VfΔm>2G2yzr0ѢhSR+;r }ĀE+T͝'AAEY^xUdM2=Zƪ/J"2wmN\[/p:jjs51^oZt(ڿgAO\ C-]D)\=%f9ɽl'>i;P޽{fQiTmd;)x W)SUpU7NȜYZ*s|-82z^j߼X.t4p-x88F?z"g唀N@~7]1wgõճq& D^3~77 1pAeyUHl9f9GVHbX[m/gg?c*^@6Kq:BVxOC S;\StjvV)@꭯CwEJɯ<~U,努 ,y! y;&x`FTc73m9*I#%8sٮ-9D`rCpi:;$RJj!lbPI!a~>AԻ(eA Q^^ecѤG#0cΜ&7q~gsKY-pQR^͓aKŏ҆Nh~bCzP}alz t[st[|;J 2tIgp6YC;q2)NGD*^k=╽*+Ff1}5rD7Dm Yf(Wrz~怑^KOY!z̓iqt/FE-+P,xy篨.=BE,ѭ_snЬU9nK Sw+R'Rٸ^!7cA6귨P QKST>:p"&Ɇ%?ROeW_*9Q\&'r{wohTF GʒzT#gV %{4$ئC@S "S쀨K;XxF:n?Q۶ɝ1HgQi 5+5&YDˀ7X|XgFg䔞ElHYVI[(D^NF5U*F'] ,y:>tVri[n?hz$k;SoML4eu^C惁ZѰs5+ȓheQ10WkqW4owqꁻk{wY“f#&6MksD8Y%I>U[O.,b> ~WO*GǾ&\a, d$FD 5ը1?xu>hm % * 5?$ˏD$ҧZuQN-݄e))VW gD_ltA“Zv[[zUC_-#}/=qFHESLS`ᕁḑܮxY9*| 1>ݒxTJs9=awf#ԭ?R0dt(@50Bl4wN>? Dxe9VVa >~ukܧql'DŽ:)Yvnzݢu v/'wNJ-0*65HX z$\A9Sæ#}Tp;*U][A;$t^Ve(2 + ͩByA*m!$v⣿+7sڕjF~z &-[b VYo8Hz.][t-"E,WlXuӤmsKV(N }T)WʤfĻȷX'q5vY%T T~m-3v|Gs]m߸+sW)⦌s1*_x;O؍s $V:HʨC͇A~:˅rX:}=8a|CU77 A#~$:h}պ}(Tԝ®DO[ u҇_<=Tf\;YupOtR3h!A) ~Cً~ !2Ťv,wb.h&ΙmAGE3糸slWa1z:t>E 7*)&'JMl-RHehWAktQk靠֭%5#=27.U+9ZMTmHIC5><5gVzെ^o"6}qw@-ܮߝ>8N M*Yǭƕa`Ʈԋ?ɤF4qH5ϫ-A;^P%V?zNJKXp :3c:ȖdZh(h%ĺa3rӼx'fz+- p^{ЬEVLW;^%_tѧ=a1NEGsRzmTKջjNQH>VUq˓ARePy%P=GhO'K׏WJ]4 q9o $)1+IQ ƋE"4Nxme!V&0evߒk佂&Xi#h)j=KfTnM7 q' g;/y\&@)뫜*?񄓕bEvhgDcZܮڇutMmSRD+Er#4/+XE$tZhj" Q&Pu̮<9J@(# c־ɼt:ȧVhxNj5УNEUp=:+1:ET=`]_Dr`2aPp" -9*馅(m:K44Db1uf$Z Q]+ʞN iz.JFNlϣ!EK3l$05%e q t0hfMGtڹsEX%Y-$#D[ՋP6!-{boAsa9,Hܰg-j70k= `K Z(STpp Xyͯ1lMxi10|eQw_8\mW-e&k4o'WrYjcIS\m7Yxg HGzAӐ->y zBXE{kA3W5z'zf΄gm2}h@s8gǽ(xGBRu U?Qͯb xG/,6n/=$bbp dSOӅv"bԛ2~,ZBlD_e/Mn^s։8sb@f)2BdǢ_M}xD;W uf#T\$?4֦a$p2fS6+yA(F?7hjJ+^xM+vHV?ӗ;X3է~HcZ ]~ r7Qes 枕P> 6)-ڨ:%td xU?l\;3Uj",y ;i<-p>c?9QarܖkV~Yl}oYx!*x^8, mcrUi ٴDU]>PJ"T73):׌z݋|0|ZWن>&=Zo X31'j5WbsfBzuQHe#{e8LٴgF,/f܉ɳI|̀ RO9s C@ٛ}>MSF΅Ɨ]cԇhv3 ؖ"IPUvD3xD/uqsn*9H>Z&+;S ?rTrXrZX]OI 5#t1"̦(4B2v| {n<5h=rȸF2i@ L{*_ ehZUÅ(7hWQK* Wjers^G.߄;:o@6b%lqwT9duҭ,u0~zF?ig{`WzM/aw r;Jd)Ktx#Z򤣿pk<)#}:s"NlN+\Kwz*sLEZ~њ՝ ?WYM0}Zj/Cy0V`?=AQIq9:6nڎ)hZ/@6ݧ hBF6z;x5rGRb; `Q!)LVFR<!_,YF24CĜ45|eKZ g![ (PN=A1+D*'E"|Q:gӐ8썲wsrc֯oYz1Mli,XIz^4$WdζLz)RN\۳w ͑.\-V! qIsN?(2)pנf Ru(Ag~jڿ87LQB? /|PiD}?5&tp Ad= 5/IܸJ[Tq5P=s29j>eI A:u\g3O޵E. ~M ssҔyoH&=ɿ=|`DQn[V?[Ŧvdzce__Apwo5nfOv5HeAga!͏dU4շO =[LP &ڵ ĽkQ_t"9}\"Tƒ" MjTW \J"1`g =n ؚP?T0zIK(aEQ7P!߉_&Y6x/G`F8Iܨ+ᔲ'6_KqNXCD_9Mx qKp#چ˱[y:V}sj l*8E[ɀ7U2[FHah{&ձ(;̝5#O_S4T} g& TV2pTC1c9nha yրj]%͵HLWZR]fgˎ~;d? #BIp9B&:zF|j(š߂p!} `þr` H8.-=]T2*.>#W":ei1wqI6."+gC%Y8ex5i.9>e.%|–Us=~!~N V@t: Ӆ5έu#X-= a/NRmLQ,M3(4SV&VQՈ$/z睴8StL- H<'Fr d`%V/qᾬzѐ ^7 iب>zJ霹r1G.#t54ʘV='p{sWX%h2 6sWo@<5~-wNuǶ$=ڐEtXM)m0OOn/>5f7$=#F^E@0g}OI[mǫ8S.QhYrApk %U`?+*MEóĩ՞kuˡF]WD }$n{ ݖ_ﯕ+@UwsS&T`8eև't7 H>22b/EX-]",wΟ._w_\6P>-J̎9 y^ƭ^Ry[&Q:F쨹9Ho/] r3@]IB'gz6Ŭ '/Uuwn ?H*ǰ;Q{Ď \V2茗Yb[q6'5oU~#{Ij@OH?\ۈ?ds2\Tk2I[8~w7LJ51K ^ 2\ns ZM#z=4 ϥeaZȗ<ҳo`ܧEtBLX*/S @e_?Gr=M?uaӨ#,Ȋ&fJxеESB:N~J['Af}XnF"ny'G=:8ţQڻ(;NccrML0l:ФZJ!BK]` "u}x7M#t}Xyg0RQ2t9bQ&9e:S.IBүgIoB2B2i@џM8d9sK(Ceq^%FR;gMe}Ԑdƚ^!-YZHk<_Y:SLJl+3ԹBo^gW(=rQ/=@f(ɈlcfTR/t?e&m fYѪ3yrʼD!j f$dDēOϪl/z^-?8)g1f$z}腆WuNlfwE @I&cPFTv^żi5EqCBHg {?sDoaܒ= ?^|i ܉Nw"C%|V' n5ꃎAQ hU4w`_#61 J=σ.Bo4yA{s#JizK.!>H2e¥]-KVŀdrZN83_oU jʧҋw1ҫ SD @1~5%wZ=znt-W5P YuF^8y'+vnrՊst"nCr}d,x3hG 6qҚxzV{?BE'uii,$*v ~5iF2w zy\}< ゆi>z ԫ\ڲt :*6(wx |lvXӇ"fkJX!FՒ մйQ(n4fNR#9;t'zwzLӔsJtTNg*U9 Pn95 A۽cqlļo”|OG4m*$66I|o&xnL(C94idAr #evsɪ#eAdF-|6As3GZ50~ԮG>] 2GԨ+}ٙ:t.)V 0R5:WPcb@#:gœ5ߵC)f۵0Tww5$߲r?y\_Q"qzŸ:+Z $gzt iﭨGZZޏCzNظw#AM|oIXڥG:smm u8-g@VW-/|qdi ጇ[^sbn!YKGN=TAlXW#v~uA=IWV;t &]ɅT;vkglރ'xYۗ8xո4⚵#O m:y=ަ~xH["<]nN')FkS~WCѵg.^O#N H!t4ʂ *˥OWx='ߢ~ f#|2A`t%_i IWV ɝk nl,tHpML&e2㾋xB[[Sb+iP`2 Arڨ ps麃8+0&ϼv*抭48T)qP>"sK>U§;bRL4Jc r2R]^'5OozzYR>3F -ҪU便 9lC+0eKOv1VzZ0ѹKCSP&'ڌΘ^T\#x?j3%̂*Ί)V!-P@dåaۘL$5;-mYXѲtB4M̳P$5<S! 6Ղs>_œ(ȳDuKbKLKrGa#/ ,d"YoQ ڄD{qh5ETF;2UPm&*КH8ecb4rSO Bҫ@iQqb(]PSNj.3RLX[3w  &*TvЇ-!mq1-7$Osçl}PH•f P+M^?vPrbC}7SjsΜ[cO9avc pU|z9v)VjGK K<s$lDc" FsG*r:qyy4dΒBY_V7ĵt;(E|(e_P2Bv ~dцkE?ۋ >̗10rKxj f)fBf̂U6 oˬ>ѿI'wVk|ڹ^r 9E]Ehv]{iz vUKa]BF%гoFЇB0<*W+ s0.CJ{%`eҽXOA&]%alVL=g ly<0")%[ך]ĩU|)q8EJ$sY0?3_xOh W)0zQbt_܏7HDr$ASQIZn |D%N 80,hA(1\>|M{:9Dc#;pNud hek Sz6Ƽ9Z`&?l-T!;Wlw~$Lcׇ `dBk| k4?LRnWNi"LS 8κ3p]p2,Pɤkcp` ƙaJhx4O81Z(zua۷ k\5ǒ@zXG.=7!c^ ҨڎTt2/ٶ|>Li4V(/ YJN#6.}y0֜ SW9WFDc)+1{O1zuxZrg-\ T ܂LHĉ2}r 8git96Ws[Dkh(MmЍyY)cT]NqU?9"z QB/3<<ݴq@)Kd(6YBȞ  (H"!s1BmB1^9Je0`ڗC b[iU7 #P1IcT{&b6 #yIL:xBli莖T,(9oluB>SBI\1h;\eQ%(/ 7D{$M8haoEPUbm6U>뵓eh%MpĵS Lq>3ȃ @ {l3Sc&0*)R2aw~*3{u$hs8 Ĕm1끀13"9Ֆ!soLt_q.%S/Gh^[!L~jp'K^qQ.SU%TibygӸE]Óy{sF\Lo:*bdM/nS %%ąa2+gA_-n C;&ifw>TP: yk 8MNCTew7j^-ø1$@<0jVQZh4hٶ\ ľ!Ld&0084]2 CR ?t6z% "qFXpz#~%-qXC|_=ß;]NC^ +J'pD[)a%ED#\H8߇ -0) FjĜFQvkZ",H%HN{b: ;tM5&>[1OĂ)SU] V- u"n10=r(VdKUu*7[Q(ys oN-lƖ#%{U"xs>ai'{'nS}^edV>\w%n.f Ltf1UԊn8r"B}NPGnp5xA* tphe6XP{JRxDpn@ ~JDokc~GV"Ūm SN2mpx,k~ZfP7N|W؂}jk/B [EpV7xBBOVTL|6k{D!9CJa+^G)T& &7s9cN5%+O2A7ۚ8,E+&oGm?h(h~  4~,l֙РYۺ&Z"^`Նc{&ar'`"FBŚaR\b.SKr&@ 6+Z(c"o8h4eWz+ CmpS;jPG("YKPU T*RcV!9CaFZf6)Cu.S02/aσ?jǢK.dQ8me.D fZn8W/ ʍrpq">Jߢkm*%{sV꯫='U?iAuXKr^i\7/tqYCݰMpuVMWjfaڞlM$ TlP`[ Тҡ=9D rx=Qh$gDfYE;^=|ya2̩ ?S.KzY{nW 5d4 m_^CN\y:Rµ9Ag7$&\? /RlV sߡ[(0(]8 !xTǤ:;x0>\C‰c@RRd'4KDʄ+Qy*MC!+cjH `DI@ɶ%(MUZ4%CFf.a㲊ecdb%jWy 2?#B bgTaW,Zoy eb4Wj=,` +<>M.r7?9y0nvspǎFw+ym(AȔw(>)`#`q~IJ_,|$~'!Do+!+ӑ߫c%-OD>%8ZKZSWW.M/?v29߻mGg, yj\0Eyj ?Ku+D.nެ?޲( ffpō6Q3SKSFe ppÉYtK.A9[M ~&_(yi+ N7>5=b?p c," O3;ǸHALL']vE` B3|gg_H ɡN/:>?۴ڙ`5Mڅ$nԸ M"M"I0Fme:wBig;Er;"bVCHӴW^5KXȱq1h8"P`HCN^je dy}]~&vni 93~V@2*;o1lV@(KU=3x9[cם הz%ABh/yg! {mFqZbG)#6`?ha&0]Cf5iE'ykD\DVn!?m-@룠62hFa=7R6za:㸹ZO#$c>cLXo{Os–Z;I[nф<ՙ[Ha\.pBKZ 9{lAJ Ϭ'KI#ƴ $E;;JwDVleG!)i<d%7B1)M0}U;XP$g #:,@J# 5&çNRuV/yA[x L`)\kG%&i&b@jdPB,MO,A2htϠl( q>cN;p rsvi֐i7O~V7r:^lG>HtNCjлzsˉ<8c,W̦)5a(K1|?|@NM]e'*1Wwα+T]?_ .aQ_i'Dq:Ď<kn_d$)*03&ڋ%®uɏ50۵lRt~u:GH_> ! ,r-1L{$k:9U?DL4<2z[٨@wo [7_#["^, m?=L5cO˃W"{J' {.QF,q5@|Ӈ6hٜ Hh\$CJ$2āI~lf'H@ ^R4d-2'sPNyk\,zF  J엫0 %IT?sٸ nJKd/,O<2f1 zHր0:3ˡ3":N毭 wN9%bQ>mpͽ7 Ƭ#sv:ʽrq+S_TF^rkoa&jq}[7r:utM"_# Bk Y12WgQKsTyt5Pi͚~.b{" TQE'bщ(`0Ηb`e&*k;:pev,!5g;i a(k#H1b2+`a9(BY, a .m"MN5&,-oC֚5w[)Nc:-ܣ=  D};zyzj `*y%6|~dEW&4^?~5XytObc2jSEpJx|cG8iF\:M;8ճO/?Dx>+A}WX13(?w]~S۠-`7Z}6}堤?iޗ$L1ژ_en%hٲ䷖cҧ ŒA4[xǛ`3L֖7mskWgʼTy ׯH|bvJ:QJXt'6oλwjaŅUIElR&S24sQH^{ɑ=pacPUs!Gˠ{Bxgcc; VZ lˈ4?|6deW㰺JNhxrZ"=^NOs6O?6۴H @VL QGv_F- ϕ&ůz.)i6 d+rjLpE>quw}C4]ȶȜR<]*(%)~jA52 iaUb]lo-kA Aߦ%xU:,`W{ P0AExX%`]=M%X$ D(IU2S-,X咐1*GV_9lQY=Dڅͻ\&rAZvKtJab6-\KQ"!p%d##!eFzȲWh~f(mXsíQ{+m}f͵zmhshjfs[~9u1DU̢CK&GȞ9^+vϔLGvEdfEX%Ք+荰B685mU6Fy*tu `K1 g*"J٬3W6yAԦ-wfxmRwZnY>~>X.^Gv\8$#;XaT_>X'irõNhgˤv. FbYyN `QC6^S )ztoN/7 eX6~'M=i+;1l"rR:[hڇH_L d0{W48E9|jiZK}.1(K\ T8p 4psJ4mQCN.u"=.JV-<%Lo1챆Mj\YSmR &U]G3En 9h4[͆n) >[V%Gkں.CD2!d=MQ'[KDsnFzNQU2Hj]-lh$ ~י=m }+[n 0u`?Bc 񪿉 ?VsI =s^I@eLx(ʥsx;q*<^.W̧W1ys 6="Ĉ;@TyKL}C9)%6Sr@ wӫт>+WR?06Tq?GZso$d(΋wj^tpW'so9-:)i:+7sfdcwѕ]Ug.󣀻ߦgxPh/QMsF3u1(}+{\z5*@NY.) }f7;] 4Q[_sB7H=gH؟jS6!N[-e $<ƹ/Zi'aA&yj1eVLto[°7df~7 =lN1#$~f`vy*e;~zH vXB479"cOW!/}BV1.,Z2c Qvz)-m Gw~;tcN%bפR?[f(= r}FX8\a09)Mma. Ёi'_tے8w"34rd HiddԜ (FvЗ^),dkHO]>b&֭&w3^a3Jej] hGE*d-CUNuRgmiu/352eo=m${YKKa 9@y'Cd.Γkh!GoFSۖS' 2#[#X6Qs_?P-FΎ@IZб< ~E3T=/^%cv}Hs 0X? >!ץѵ~o/ ?s5_]^`9 ؙ**mTC=9vhXW@*QPJ!.]I~[[&f'@(,{84u*wpIg Nf\A ̯El]"qL2<:HݚKygnL0kؾ[͞aJ#Dy9,J9>˳kdioZo%w݄Ncxq^nl|i9JNҝ/"y4jG]vV=8\NqDLgkbBmSeyQxS_ڣb-1zf,4''NWɬ~M]𘌁*C/<S+:DIӮ[%n\\i s:ΎnzS&ܮ3|`͛P*xǢwNheWVYc)<΅ cPĚƄYso0лU$6w&CM7`TxѸ^QlSD.!tK6VtIAXdY೛ImY-W5\<`EtNY|} )We?9v~să1\zC`FcY,_|q9 Od/RL2ΦWb1.OWWqB!gxLbSocȇ A2u( UUefY%&J@YVlEXLbO7dٷ[5E,{N:y1(rl::c@0pm岋,v<φ20r/R>snm\FyI+뭄{~'%{Ɛ^ k.'39 L4K0z[(-`mO|ɏh5-״?33y}HĿEupNķg3`$=gU7oMUN7mɐGU"1r(~СZ:7,_%GPZ{v-XQ{@ g1,ٚ{26{;c%wWV7mэX2kHHOQZZCWzGA>QC.4چl*1+,HjĜX zs~AoGYa<5NV6'5h>UG=b+"A Hi_8\_f|Y!W9 {* ƺ({C(V CsxzXv鯐 -x=_ˇGlL釘[ ʜ5 p\tTAQ|ej o$Jz^uL8 vkW̍$8 .j!prWSiXT#9AD ٖlk^*{v`z e*`'}A2E?W'-rŏVecOy/GEq[Bi' y>On0ou9ԬzHHpzǓe&AUYdM`} 'RZykGV?IlX@ DH۽ {"p%ɓ2E21b+UIVa.#hja7k}+\g?o̳ -݀uhP<޴Hgm9D9 9<`I!KX@MGK`H2YIʝ-Jn#A+2u+H0\cmƤğ]m7(V1B٥\NK`ov_aنLraMML)vc ¶;ʕo"~dvHZz)Lҵ*j2hAJO.XMd@'.d;Ӭ/Oj~0.w˱s=E`hNB cӋA4 :UO@iH++~Q+G6CKJ@"QdFa:Z?lT .#U \d\v'`EdX({Gce1i A Qk';|͑<\S.Z U wp(pWIvw $I*w mTõ>V{ƔKXl3W%U YV4c0WBˣqi~l_'J| kRWD/ϤQz GvS54T&WhYf1Ȕ-("D6 Y0:,U*~j&!nOEaO+8)}xՎ2`h(Ǜ~E(K+NXņȗCQTY $ݾF^0 Gؕwa<2l֡8;rez-{qFlQPd|wnj] /4rݏD豥XAS\+_cw;vAv f;vj7VnMZ1gWbk7./YAN$/В΀)X\_( lXR>&dzfG3n~(̠ScdԀ2'UU;Aи$snRfyOLր]u~MG5gԌ#*EyGM9+LSTC3$ On{qCܺ~#q3Z<, >ĝП`7SLa&T3 &ƍII첑/\80X2"S9Dr7DM1wDݸL=}NY$,;ցTƕ)6)@+D8 ?t#xm9+9 d]Ql+?U t~@9CF|zzAg_WXAYswX&k w6Xp<*~,x*M*Og^m)8Rvˉ'|W &خ7uJ|c֔Y':뼹Qih@ay`'2V&Ooؒڹh{'ơX{tB寡?8E/?LTyb~~"cbBhҨ.ic}6=" JӥO̞F+jHNRC5r-ZHl`͕,Ć~rTsJY/>DՅ4A8|J e߸V]q/4ŝ GTgKӗ~&,pm[Bŀ!V<?Q f9?L@B<J&* 2qs^vXւ٪[K'&4u$9Q*#J 88q N;e}TΖh5' (zw]+ڹc U䈱\{#x1HE(7R 2O IfRKRN&PEڻ$2¢j(s|*՝75un"L= K+u`aU&Gyc u+:N31= B /Ybo.Ecy ȐjH N~_F[[I0Hyui_SpG>EMZpZӟyS@ͶH9J!0ո@iq"^7iv( un{{ 1wvE# uUS6C{YrhR.ڣ~Y!mP]pSHθaen稰z)!8Jhu`7r[$ zXzW"p\\BRa}:de D4TWX>4!f&9D )A>VW(B#7ȌmBh/dt⍉/T,İݖSqeGc&~;v=i)/qoSJB Ŗ."mMRqU2?o~06!spAR1^@vtR<#P[(~1kY]yIws{u\H/adCtp6*[JJ/?L 9 Ѐ_w7O7;{'dIJ*~'ٴ!REW=숇V"j9z qthEW%\'3S= ]:}#jslU֒-09YaJ6ʐz XZfe`{vJ!RwY`#v-L5gNxȎ*",,3\8<չAh,yz2Az/+1B\( Ug=xHK;:ms窔+*)ԍr*v'mjE.-}-l 9_,QE.V[os3$x3p׳^ՓV<X̠7<@3cl^9٭ΆE7ސ9[8 ̞qR@asKu}_ʅ7kt&hHG-t!!q /z{:k6yov|ͯVV Sk`rSM)+!MG {t.hk,N+g{@u0<A*Gݲ1}DCm4dd;t.9*k7]6q߀_Vfu,ŖPo /JyY-ʱ-rLGJ̲(أaMvyJ#LiWMNDʤ$) BJvXY7œr[ḅNQoYO"4051 @>PFDJ© SEJ`N?LY8g/3c0AklRÃκ@v &բ\:v6=\7CcoY+Kl\`GkXA䰣0>VG:L;fӚ *= A5Jh+{i&\UD3{Z/eH<-flE3%cT(aƫc8:}-nz@枹C ǀJX^ "Pyl: g{^p=R*BfXv#w_bH-r̥,R0*HR$KEWO m WBU Fh)1TS+H{9,~Xr%Яfa$"j7۬ AuV`{W$Y0RF> W}[tQ U*)?JͯŅ82*}}g٧t05Y…hݽ讨i^js#kUl-vM<+ _G:m$?&MJB9•ܢa jy\4֐YCҾli/:`i.f78%wI)8onN۪qyS pm?ݵjkB-躨FdCM8`==n_5u1~B$НӬԨV'E:s~(rEb3)CV\ wK,u\j6|0. R3j)1EE[zI‹PσkMKeR,+]PlͻgTùAm\TGf=jaa[Z:sYΒ)3(1NL5AUŰ 2[CKٸ#t&Tܧt4rxc߭I<#Ⓒ(C|aFZ\!W*M7ZMSPcV0ܦ&D*Pe݌Ȅɘ?w|4@jnPy 팋w_bp7OBA44Ou9$RtAxϓzٲL@jנC/~0*|"ʨr.de0iqB<_q+ü1>ܓ(G d] ˡyL {{ð^'<˪~$ޤ߇Ogp=a:547U=,hLȰXPkn(Yڎ^~IwTM,W]\j!5cgtj!d\{:4%mNT^i;ně@`7 k5[YٷL\=/r vwul5Da)\%ΠSuUx'ZmQs='l:-9u-?''bK8ѽmtyjx6&u_4~ &V jchb2e4H:MhF Go@v$ w /ٌZ$qdړ?8vtAM~^L[)BˤMG +@l94Ciȳ\]]o[^v~-ԌA6G [E'OVB8=p}`. ;՝rǭzx{m'ϑSi[\e=r#6LC4a+T۫'XΕ sdA|'Ǝ=RL)nܘ'NDڔi7zZ._}N(.INtg2 M[2R/`7>ݜJOLJ c&w{*dkDٽs>XC|\"B. x-N$)ad=x H /˚wcD"m1RL ~:4ЖUwHi(ǯv|`U%:ud WHmT}V ǿz}VLwixD!VEIRI⇭򷲊d6#+It9mc{b/:lpi| Tkʚ<1*WUCs=\سw4{vr'`cA'DEFWM扜r1קּNU(`Ow?ZAjI`/lS+wtV4@j:尽]j1TZ@JZ:uvC&nPߔE(eh̞DWs{~yW""cA*nHb\;}t_$$e%[o>hڏC A1!$/lr,.>LёZLn"b;QS+ԡk",E+kX&b^j?C0x?i>@#(XnĿ`gKnEQIG% UY# KMPBRmwiR.됔q삅<. Fh3VG0[]'\12o2MJv g!YHJѲ5k5XRs*O]8"j8Oopi.#aG)3 0CFcW43[9W\㓶tEO¡V/)ܭTyFLS8w)`UHA:hh3g^0iYLJ8O_"'hQ^€wKJ.I5hIo|!73W"H"6OyYG$0L2+/\-(."&{}0jdٌ .mP87ؒmm)d0?J O9r Jq `IHpbw&5+0d8Li/=}_~f ##wP Nh ]9甦[vqO|C m[B8e!mi C0GQ:Yb\ƎrBa%l[KS׾l.']GWMZ`_KՋbH:[!i̹ q>rU|cݝ@줏DY 2Sa|9vK)}nZǽ'^gkGz?mRt$hmG9P3HVۘ˽~7H y/Y_J}x~޼.ifLE5ָ綾-Fҭ{_Ɓ4ؤua BMOZ׶ 5~LQ-<[Z%93[1&9nha^ 9%9PSð_SiоC#]S)4Iujs8?AJ}9=T!4Q ` G#T\dzINwY #̖\F?tpf*)E$ xs*'͡)*B˝9Qpo, 1/d@Dm1.()ӡƥ*5zg6aB9+:xk7f'lw٫C_YyKRuC<~BbܹLTj']AVo%0QU!..kM.h\{M‡;6z#g:`!nܭZ7jy~Q80IVk: {SQǒ%0H?L)I-Oihߪ8F_RQ2s CwDSd4eqR4=&ވ5rƚ1=A,\U8bL\힎A'ldIEq0}W(<]iÄ˰t'WF4~9t@ gz֞a:M~OUIHzU>F?U'rNmw&;xIx\j܁n8_n/(ɥ˲tVAe$ӂkRQ3ɃY& 0i@Ӣ:RY(D.0xƔw{܆ʮW&A,2j/)*H>KfVAk\V'Ԥ;>s 'Zlh3vrJ;4z6+iB ':\2f6OLy ˗32Zd7~$36a~rz~hY)f5 F9Eb1/N *qOTwu("IiWQYB30˼MWƕKn0U#({biWN'}өLFL[Fd2^ l|ӽ89ܛݔbrpj\Z#/?s9 iߔ&NK'7;+&IuLhP4ceuIՕI=U1_g3k~Rg(HL;kSC}aКL?}nje& !.pv&sduA-Re qȍ[BAVO,}GƘgխ i_vo- s(sIet:.2Iv0<c,(oWHRɠ7O THK]%oiαYSn($ &Dve9rv*%w* "xBt:>؝m hSE 0ZO>l9BYtCi(mjs|)$jĚF '6j\K&0ڗA5DXNjP ȑD M4 \P?$s=%Yue8t~I4h[+sYj"]0}ݚV/x]o;8@ :[G) v]r*2/x e=<;l݇.5Zֲ ]- L}w'UHdӶQ\AA!b1<`h?BBzU`[^ $W6[es 4W;#%5T6;"E}W4RS4C cKWm z#oݗM景3= acŶ^Ԍ6?5MwQs,a"X/LA4ǚXQbs H"Ml]%ۣċHlÄ}Xe&:Y$S&v?ՀW@@/炖><yLzG5%TL)_;<y޷]zThV;QmxM ӞzwWy Qz̵[5)Xk1KT)_".P\tEʑ Bi w#Y2դ KL!4? ׅtjbS1`+`W:+HE3}pUDejA`SVvK^A|64urm2H2Y^x0B/ Zf ]/ĨZQ@5vxdy,q i ݅D ݉MjCZy{8h(w ?S*浀Ri%5H~la"Z c"2.6,b'=xi7ـ'#1U.͉%`׏06MhæO:D \Qzq`{ky4e)0Sv *Q|Et obWEx!ĮJzLNOҩ2eU#v"O$%92ࢱBGyu|ϕǦ,7퍁e%AN952A!=<=m)v7'ȷ[X3e نMX{@t%.+ zTk+ڊ 2c:k0\;ڏq,.[)+:Q58'+xo~F,r&y~EpA[=;_V)Cc3Ƭ~_i?o2|PxX.Xybh518a/rÌ0 C(Kܐ^GIKԺe,ЊN`>4l5^)73(iԿ F>50Ϋ{/jLatٹ&<=HG܄?eزŠ# @NѲ9 c~HQU3` }Sc։d]N&?sPr2Dx0-a1N$B7$NS\Ægv˛9료`?sQ-& 0DTo8HT(%u U9U_Je@Y΅(+WRp~yW(Lv)nr2C}ݤ+ ߨBqj~oH-nb9^ YOIXL7{JRDdױ 1,'w6Jl(JA~&ç. 3,p~"!.3]'8:µe-@];i# ey[+5K1,KkO?1Lxdz7SxA5Rgv~sV6lm\Jheu@K 7zgxzpWpڌd46"ɽ@X-R,/[tOa^#wPPM)(k @+. Z?[&Q>94$U[|褣PLH@\ fG]@?5I*C& _QNԵfwU t<@o>`3 K1JLfTko!QhbL"%dBe`}n`.'NHl5̀q$ 7;o9No,$p#,ûFb-F;̮M-}KSD}1v@q/J[Xi,R[K)_4d$| ٜ-RHڈlG9cLx2eqPhʼK6by௪ra+_:ao~d3]i|M*Lkc&¸Ic^ŁIO!]{]=Cm<ְrB#u*XWjL1MB#$ a _B>R'(^MMX@Pk2#5iE{s*EH@-k+ mƤ17\5fd𫼮.cPBDSVml< eEJRl0APeچHMj#@!”;\ 0hŰ?W/s:?̗򏿩h&␫8=d2O;o 1޺ԫgM 7 ;RRcz1+Q^#r!+Cn BMy0LY?nZ%U}z|4YFӓз20q<9awJ}~Nŀv h*t ѥB,?51 MmӶ+Il^zej_= "NR:ُ-xkDÔ(N4% =Zȗj}|TwN0}eol&T)!@~[gm+JWb!bv-·9y[[=B]'5h\;%W>)?jJ gDؠb/6P_ҵxῪtРnWM$?F"U|ZdFFvlWuٶ$$KM `\( dgSkcN~1Ӡm22ށvW)E 146 [iܥ@M{-Ϙyuu[!'0fyD]R bGY0]7.GyB'oux+Q7}yP@OEL{c+GhˆHV֍԰`Ws~Ir"b{#N~D1<unx-|:CD8TXeU̥/> ~~E(c6# ~k]_3L8C|12 e+0icd EA0JA| qSC@]~E@:bѬ*||.]0>bUcV-BM,fѵy;0 5$c c^c bUe7 )_`xRi?(<+?ei40Iyn乃 tYtMGn8~sEnæB nV-IF6*E\.MlePh%E2ȜFyHf;{֌q R77螄!+rSZ_Jޯ" Tw{-$[8vuHgF+h̔4^GXay4 &$q~IΕMf/„ҧi5!Nh޸Wa/ج-->=3]8(,/FyaWN f7i[_#nLBŵ΃+~GEu @tVu4}?s5Vw:PAǒWPJX4e]bg XjʺibAV]YsĬ5&d+MU& w'иq9z3 _oJ1ە*0` q0[LC뉕^7d&ä29LL'E@oOXQ$} o(]FE^&ȟjtqԺ,<3,XgO3G+8@R{VWY_&ϳb-h9pj wQg_'i7ND)Kz?2ۭⱋsH`!}D_}>ۼl7f\^.7/kF[:_UHj=f8Vtu (ߍY!n݅sob1~)$P{ TF@a8qnΐ`OBQ\-P Y53f;XĆ^"1Z8-q:Mw}3Hw鏩 gYjFmN_Z}ViNä0B{`ҋrNb,[$8`YAOJ-5<A߈e+slE0w}A)K{R/FC|}վDo5̣6{ !W~%SEihMG)-p/f{X}t*=PO-.iwPFU@zNZ4`lUl \^n_QJI+\uL<E/@'b:߽AvX>/MKljquCdo#ݍ`EPGxvzσַVmG >rLE䆜!D;jݱ_f@  rrųb 7R\ XBj!߽TS4kaSD61ъhلGZ!ILL2Dy3<e )BYk\\O-f2fFb#sݺCX=MF&O&p~s02kB^PzL_/hOCy{FW Yſf,όJ=7VYeAfTK+qD4uEt2O &n-mo]>_.] Ӱ07)p{iai0AO>pj8{LH*vblv]QSZ P+7rd @ ^ʟǿd}ȏvYѱM *#L?J4$H|[,#ŲatJ+NY/U(]Z{j27ѧZhV'\R^\->[>.L$2tucCP@ ̃2 ^ؗcefc x*U|V~ڜr E klnMS MrpU?M %>b( #6}:{|~xkWwONZD0hѴ=ђDQK@u9a׻qBos9X6,ia |RpfnP*oy[J[+-Inֺ4'd=*-|IaCn':d~,S +F)tt\Z۟ov4AbHoyi;űV;UxTV6IhQ+,yj45TW2P~Chy%\N3.fGZtэОЂ޵H YsLږBIct- PBG,oPrpQ؏ɑzH]s sS6W| 839^>U|z)a<8V tJID^ @ Ji=n 'H6EcX-@s~䩥oLę@SzG}[75z1h;n=E;l06κMpS: G#aӄ u WvZI`R+U>v~n~:ֶ7r*J &;>ffT0@c~!1. \I"kΤ­uw_҃?FV )fRS]M%>DɊQc RK9܇#:l v$0jQ;!Zmm<ǙM RGKd#C# O](Lٗwb#kZ@^ M&D0'*~`_Md8mgSd74-y6x_2'x>ib"Lk$L;yY3SOPiH4@`ģٮ[a Sm Ml=W欭qPwF _Qtn#N᧩EBNv㾏nq3 xFsNkm6`XW=g_ p7Xʞ54-Q􈄶'$ LY/dOC*nebdŴp5zd zV'$)ʯxn/߅ r1қЋeըRf2^YjS%D.#ȃ[Yt^876a'SMm,үurϺ] rʸ-d?55EQJ] RezT"uwtFDkrz!QR6P6k|yC~QumɾAA5T'})MFOC`InVr&rAw3!=R~7ƟRdO:+ >rT{X~=[IQ6qy@qMs VIJݑf8@YM/:"9ih%dxG+AgO-卺AIP:]zNZƄߪdD\DD.rcQiTQޔWx4C3xAyWQӭ"ʲ_64lMLytq ϯv?5! a#O/(8n\ %= {M;E u9{dOvcdⴓ>H05BT$"1U'CUk{.XUXq1R{RtqO{d^}~Z95cE_864 ~tjySŔL4C:4-V=Jfuw s5S !Y4_rB.l{$H:i7pld`IpnM%BdVoU:} YVr}g[ N)JOO)+lfl[Is0:?4+ C|L4wby(\FYLPVnE6Ήen8e& fsB0UPWԇ9zTfMs|20(jWIuX_F(V> `9. )E= 2[ra6CWg?<ܵT I-L"^FOXQ1//I ApȄ@}̌^>GD*z{&Nc$0RX5˧  +ŭUrp I0T@k/@PJJ"c *[FZ],q`gx! ".8;wI6"+Ma;'ps'#W)hP"K^%yX%Fn1yz G,_!aSwLΪοNE}& ZsW`%^ee(:[gP<:̷:DZ ju 㒿:q ҵ9Yk՘II=Wm:[څr[x&|l(ht!8=ݣ3D:jF8QΟj= r)\/:{E~@V\mkBt`$wVE) hwd8fA/LFCFpu5mgSREx '0Ώ"SlXv`{24 s u᎘'NjF^%\]XvjC~WS|ެ*"r C['4DYS#hk6mt4`89O{C:`l1O 7}.2_ZŮL*҉@ 7B]O8S2#\?ث!\ޯ&@|\ڙ@Mffd6coU#s+$}rM h[HBC71{< fF a*,eN= : Ÿ%;Bv`JY9sP0q꽛<v1m ])?qi|yo+m?P6%V !z57Q&gϟ ݏGttE07WP' vg-eU'o4(*yVƸK> pf]`)sk}FȒFMXiV+5"Ʃ۫QHm'MY juPò] Оb$8[I˚>!Kx#V \ZVp큇l92 RPu''c!nly*̂Fr,XJP9O2FÌ! ut UKU|Աi'J~:Xi@Ĉ2HZ2тe K6g6 |nMx]%l+LL( l`Zp!H!A9K HAsJu67ܮm|kRmlymB 8,G:%``= G:;saqrB4/5削;^$|nmeʒf.z+3P]TEPaIG.W5_QwqqP [CF r0:T4u:-MĔt+'S$=''،tDV_qƫ[$v}MfQ 沭HMN]Z>"?YEN8h2nX+/GSFןIMwIc(d9eHT5DMPi;}:Q=tU p+0>\3zU>{Q9u!30& ty·M@l6sl LbO:av9a6q=2ҫd>98z2~[0Rpr3!ĠIJhkA_Ko]N㠂hXNiΫr~W;>򜭿(,_ J!orq%K|o/e f /AcA"t4WƬ~qQλMհ7Rj5{{mra%{i@es)1iz/H i40ֽu ixsHp)%uΞrHذV ׊s7St W=XI sYsaRz )AْAJNjK6Ri 3-g+FxRe5^LD.*:RԍŇ,I `sN+̣Ż.X5&sV7֝N2| sH-uF@t`|Y +ΨdsECH5t3@0TA"p&ud]%ėS Fi*q*Nz!̳*dVtֽVFK8b0S[ޫO3o1˺/I ~mm)=xc;.>ܐ;sL9MۂTӱR u_ 9y^xe>ǵYs]3\EIf$"=a.,l޸ci6f]ү2g;%ʠय˜1#6kʈn(<&̦I0]1姞"Ln!br=wNVP~溺al|Az3 =0t e^WF)wt3 ϙFއ&l5Eg\g[/AJ?h.uܩ" mg.bB+!h]S ix0l~7ɌڲM|ӟQ)s.MRJ4 .a,bș|uxWMo{׍ .c$yXq$or 4.l3bXBP=,ky{nq !?n 6RʗTU]% "s!n8#bKr$NK"i(Pbgu@eD0F %ƦЬR Nj#O"֍Ϗr*:&Еѥ^S\i׆gU‚GB+={ˍzơnRo="/&~dUJW[)I<&逦)VgB7! qEvDmtBtHy*iaiI H{ Ê,9|g{-TYVۙSVz2Z[:L[ J}C5Vb z9j(Qz~ vP}\㤗At¸ cwT Ub6!4T|6MЌlˉS18}%~4[%cǖ1-N/ڡɮVL1G)-kh D8m3q ,f-w,jwC>wr qz 48 Oxa+eouۂI,p];'jj{g YP3v*@+؜dZg혚V@NKzVȸn-pk:9I1յBuT]PdV%BˌLd>= C'ߎJ҅ri yn}F/I g<A&-\w1GYumdбLrcG&n:m*B/Erx\>~8R]R{ӿ_x&>{mCNi~`tƄ7[t qVL Ẁ[l&I8:O0Uze@j-:F$b|f~"5H;hRGeeiyX{.B/ECMN۾fv!^y|;,~Ap2VE.|z' = ճ rLuAF5u9/>@gl&W2IeC1Q unEW)6v ` lJ(tPL1;2&#AB5"1 r9I%V>h|N z*U?t}1uMQ2^|D<1tX&/FTi?Vv~7^e@B'6C|:` v.{5vXS-LR@+d{ADD t=9,t/1W.nd{.KP;߷:NOV3NMJnKqkm:Uʰ vO? 6IYb`"@kapeyn5R@~XS )vT}fK&'d moMU1wmprKnL| 'ehp5,~ɸ@шxlD`ɾTӘřoF(gX z_?n7i ]s8t.\r)=6.wU&|VGLb&Opfw^lUh%61"[=?Q4 <\g:gbK5| (pFIs|2>{2]'H$Nz/<>s3"NСҢzu]9gDfal唸RZjiuuUp0Wk]U7[GI䉛mFfԺO.2Ьثbjn]wFt.S,sp;$hkV)BնSN8GQ ]5Wd[bhq_h|pWV %aׁk|(<3q2 E;yo L%yV45 As &CCtLObg3`֏7ta4᭼k\ԧ%FK -},R-kn|YٛU+33_4[vxyahx%x rZ0Emq2ɋF}옒^2XΟzҢ;r'uVG@oH:cB-59cJn=*3On0ѨZnN 'F*w7cXQb/tS4B \tu^'/n}hm,$`s< IOl q 祉=%KZD=,dS^Y2^B rB5ىR,uf\V |!j2Ciq-x+B|[U(xM,; `YdGd" ]h|,adVyu7|a@dw܂=w=OFœπ2*z1%O #*Zth`bT{)(fZdpȖx?oT"3.bW5C;|,5Fz=bs޲ڤxaݔ˲f}ʱd0AuEg>ێeLJ`2k~}e`٤٧JqQԍѓsw# $S>6QײIkmNꏪ A4e\1{v_sן=\m(ȧާ @у7$^AL e+avGѩo֢I` {S0ye oX*8V Р9T|~_&g6FI51+=U,tKˣvH J fs E4nsm59F=~2ֲ3$n94G²?dXրyMt~<Z+a7ZUL[8|m՘Tn_d]=wud2墇-\谩>YyA((  0=7r4#zI0u7L>mibx%җ*jhW]R}k\`mL6[YkVIڎ_}P.=-[jMKq0r!4@NPhQph̗Z^^)h<$&"BbQVu%ӪRsA ROpńb~eB]y3hY<6ٹ%j_khbkTS*B{->2f-LϞ'Wn7@Nq[8"'MGvG94 L;kf=V ȯ.txh#+n,f @q߯WM"\J#oUͶڮ!(U`P[R\hۂfQQY>/ shVwnڨCϭn> U=maU(8Q`b)<=K7?a qG^3B ߷J޾JRb}) NUWK/{K\m{ iǩ|=]6"3v}EDԛ@"LS̉e Fn|A$c Q]To>3&8u#mâ"~)ęZ nhZVF ԭ"-cU0E76&`i+bZv ț%!|ywtZL,㵲G}z9&%F'QMGLXD:qHY]?/e*Ϝ).p09{o]|{(L8ʚa'p8wrBWqt6هߊ jX"cff܇ES*ڋaOX<jhnsڭ/^ժ@@4m!N.Q;* ^I|u8VL:/CD}Duѩiy3vۃ u3dpƐ&n;0Y-B.ZW @6~R|t7+/x!{@%M(I+0&[ ¯RMkͅo/"=!&z:It-jE\\WXK4"ϋR 2t BȖ!?XG3כPDCFJlDp6R/q:^T^3mqTUZ*Fw6mݍlI총5hD(n)ze!Y2\!AM=oOZ0 Kr*E8vOܡѣYHDC#bm!/cMW-ǧiMϷMQXʐ!\- Y/nlj /{lϜ:qK@$`"l^̼ÇR9}A""Ǻ. \L5 ^!O[դT6ԕ?lZgc$@DS$3`8|h_vUR jB[#='%.KjD]tyUT(O\ Ѐ~/'"Ύ %nClhk_;yTLYP5?_BQslg^N4Vc^D+;7iu1È(6WluUPɛUе1nz?\]@VMY UxG:~ Vc`m d`Ρе_ʀ”F7nUbPhs.sIzR&[A/.1~mwgcJm96p]c+/?,RWItWr6id,f' 2H};RUL-:ro _Г's wE|BŜ  zneY.{nE0QSiQڜ9WM%|n6glO֎"܈s7e?F-;Qe ?ZRk=%)o3ѐd"knzD/nN 7K_FėF:>Me0:Fm kb*GC/#}nݰ;'>e.NX&"Et(I4& aB)&1XeѥnUdߐe)ֺwW6+)JvK_ R`9帽7!f Dܝsܯ^r=䖲wV2N:kM]/jEE|ؖAr^$LЏE'8x~ٰi`JC_n/VE+&*G}oԘ'_yD|@x1oH󡉘6ѡ7])Nd)xR5Y_n,_yYPG/h^@bU[|`!}zhh58]LWY'0+I%kA@!20.\0/65Աoda-XHADQ'9\uw~t' Bd3؈ضABHku7׾k'0 77u5[BӢBV"apYudpBL|un/bd8rꊢ̼wS>iuoͳ] ETyf>[lpoO3^3L[ @"~A-*Ebry3VQ_G<]2'tpՄӂ}Oёз=a NryKxH_xhey+,oqNKE,ܭVhu ('O*-tnnp 4G ͪA ݌[b]noiڗvLj8:&oAM Q]VULʸ'0"WnfJC$*d1'ޔF=?#w>޷vh JDRxkSbi$MH"q-G3(:(Ƽܧ4>T-e~|% &H&a0}c4DU:ˬ򍱓?6 /!60N`sЏ\) }r&]HLRۦ۶~+l.BjJY]w{& s<"xX1ӝ"2UDv. m@ 4eLEGzaNNqͽ<|[!iuk0O#cW1QNr孆p Ԉm.ϕ?$ʎ@Q}Qw=isg#TE)vq ?Q CFhFQ"Iמ@)I T ۬`)·ϻ &!>FH8]^ҪB* Za -$HWOqEP@Aj* -C~9qq. 񀾚@So@1E/l1=cXa98T%37>^D5}eO 6s2oݝ9m6ƽ;4sgD'!LOY io 14ށM6B6c?[=JqƠ524y)-^ܴOSLÔ8epߘˍ % 8%΂co$Y*PojS5uHR#2TWsPŚ./ߟw=,bo}c. 8"h3觮}@HC^#sA}OܔH{ޓ}:UOœONw0h<2#~F{gúLl4(8'MJS _IhLe@+=JĖzbP\TD+Hږ !zuKYo=";+d-F{A+|2Vvjl Tך lQs^m)BbDh?_^_f5&2)qÀ .I:b`Ԅ ciL`!ҽ9oWqh/#t-tjɁ[ί{ xnQ0Y+$ STܝ)ǝ ohK=䚺%*+LL;.0V:ʶ]$;=dDŌd Fm@p rx#v[ܿDp5R:^QW8'XJd,1O ;p%,rVftgK]|l,@ܻXiN=Ds?/4.L=M4,^\>c4;:HQ| x"uXәw`tة0 9ŽR7tpfg>!]ko \= QםUxDlD<c2;#AdA9b/<4w^ݔ҄EI9O":+i5 eDCյC`;}ۥvT+|ri؃bg\#tK("EPFip7X3kȁo;ɺ7MYzQ0Ņ|Og(Q\h\Og"?<9PtWֱ W >U l^]Zڑ#^} )~/X3pΖGx-q}7<^6mj 7 Ǘұ355]F(-e-vBS7=8&PN\xHٺ .8|OуY9=O OyOUOMd#"7 -iXUޔm UIa wP{cvN?JQ+3|6/T%[e/sCFqө̗H +F7eÄ# ; ^d+ ̵Uc^Xq/@/d40N8`Ng} AuhQD޼?G;:q?J3fC9] S&/)}ca^(DKtoKTfߟo6ȹĨ{nfab @Hd͢MȨ !zɊRMkOF/tB-l]Io,26aTq ]5ktL?jcqPeVDTdb|yIPh07䊶1on5w1Rk !훳1o`ZwBՓYokD!a$?XGLzX+:6#%>@ѯn_:敜;qOGYA9NhDH]?ޗ ro//ûv߮uj݌^Ry :L'zU^sm0I2-xRp-t5Q-W=P {LD?+!spMKm2߿IIYᜊ3+%kăG!.ž'ՅyxgT٫b`JS|:aO )~].p8{L&/c r_T9ߨ"*h a`k1l{l@kěuiemnՊ~PQ:l52aliï. OhxO]h;D(Z݁* r7"s@Ƒޓ$hM cgI6{ '1\vDdJ85uo*lOݻWԠUl.\YߞE~aѬT{e֒SPf %ͮMB&H:.OiHc8#r'z7B9/} =z3 v .mJ Ab+N8McBM<K{qeDS~炗 DYRuw1e;~l\tݔ*N}CE/;yz{xڑC+.A,Ǹ?(lk.}hYho}iybhĚ7.2_,]2龃LN{l's ^WDĬ0T\ku- < A'|&ozƁvU ޤx6 6#zecx'l]dQ"AW|w5mzq\` Qԑ9\b*t>->CN' sa55EDK )lQЍ+@i nx C;Ɠc|o])\qnpj`O،lP5Zcᮡ ̻~XK8=2``n80hrȍd`-,2LS}EK{+ͮ.bo}J-s(c orӯcZڄ DkZRP)JuH?1yae+t^QhJMQ݁fT'M54rշGorTmWgPK3+$[c0MF&uc@ŭOgEmڋFJ> ҸeD[YG$Iв (`Ilf K%eZ6# Ҷ,9m)A%0LT06mkTѭR$-.qCy5x6! 3aΦ19.ƣ.[8 ?_%[  Nj~ϦxئGVKa+JRcӋv[4ܹl|]p =[c} 8/^Ud俐enK.je)F: $ *3BOQSY& #[,YG擦o( \Y$*PtdÊeMɘ~4ҋ0rm7uuQ9QPp2Ґt_GkXx/mN[o-|ĴhI<{BR g1&3yݖ1#FX+N2Q Kڗ]u}f G1d@M|(iXww4_s(ڟqTeFhD(.? }n}.j˨nCuŷ=:d8 vG'uBX-7n{=׳\>:؏Q<ҩ n0yk$i4?ET-);zv0ˆ# ܐڊ}?PJ+;rZm1%/  Ӝu$V6YS|'.XCPς#R+m.WV"{O 1ped;*mɍo*!a,o~.\D2F̞ڡMN QkȢ9Vbe>K{N*.3#e)?IT#3eCtߍyz^9B$((\*4;>  {7r& KpJV][&viTi\ZJ@ OMi ض%.$I>\2rs9%"ďʷ68MyGP/}59L ڴb)nii2O0DDȻ҈+$WaFy/)"^|&px%U[ca S?{R\y8 j;Ï!mԖ(h"IOtIE.ZbL5ʑN @R% 0/sO|[-cS[P8rjoQbȍ:ܒK`LN:Ir2Jqn(%T )/ϣuPޜpT}Tkzp yj !}_pA?K4U} }[?aX%"A !|M4gXmvLWs]q]$j#RA:)&fT)B?t'RdqcBt<Lh¸)e`  el4+YBG{i!HW◉Ofä^,[) /ֆd%Ȳb/+E2_%% Nqǖq߿?ӓ{$PqJ [Nn)S3H2O[<|(v$7a/_~1d@Z^Pc/3?2[=[s?^?C, MwxȬ]McIJ?0:cȒ=ksbp2F6-k nd"p/r#ysdXBe̠# a pa ŃڧdZbI׼ZlȴIaN[XBdd,3IJP]_)}T&{nP֨ueڨ:qsl  ֟$NFSTS.J rmn_e`%rа( 2>& ͱYes]㥦E^ŷ.eV"!Dwl|iLiBw]sǽp(dUTjfW9:C)[H%Ÿ!bWD6Җ#1>g_(aF}"V|C/>H9T >[yȜe]`@bQRidS#bs]96* J"w3?</C۵ QA\O~9|8gp)YFǢvF zyFЂc.H† Ahf:wIO*:6'&B 7I;t\g߆B!PDNVקn 1Xl\iET?Sb&v.#Yq'ˤԩ-wʌ" p}ܕ?2&ϔ}j5E fIWME<̮Lrصc9 _0+*yyӆKB H`9<(8jh75z/%-6O>kx' 7`z\8oY6bc'#ZVWo?}7a 6׎DG 0~Jנ#);eQ fRD} )h7~a浩>PO*)j^&Gֳ4r<{ 5| Rq8+p.y̶7=QB։O$0 e7Mٰ 6-}#5VIV%OpȵHV(wJ|lqVDT# $Ez} KluS2d_=1dew)f5 H;0ͮ>qh O9[?Ԫm_ݣ_lTgQtF{lWs #hܙ5AU3$!YH*"L\zfccc8`!p=tCrq?m3 6]~Zʚ 5)q+].bR$s~ 1lV/KgAXEݛ1TTO-;v>#m:- ^L$6h`/-MRL{,cbџ 2gJBNHIYӈ buf;X/ UIKx#xma^C|V%O훔. a%@>rZ?o>ńv.<'MɔRыE&v܁wn?%,Cj @雒Y_BsWm R[2U&6iDo?EHE0v-lVcGࠣ.e};?Qp0-cQхxanϬ ef9rCT`<4/X!M'NnANjQjB̀jp݆dZٍWs|Hh0}HR ́ۥИ1;]yCsZ,Fo:mB~⌕xHrVqmZn(`iU|lI{Gaj$U- µ6T,'Jbf|aZ~ ~=IՔlHj5#-L3y\S,+-) x< 3R.79ef+]#|Nt$h'䛲N77l۽G-FZJr8;1% nۈ. uݢo;s%)3ܦTxZjX+6}·kTMYP,>osd,-~'Y),l8~s۔>XCbi7 *.8 Jت$]QS]4NT!|e0 zfXzu6zQ zHz jPA߁@2 aqhX'|ʘNQ9ͫ8"妅M>u8. #=)/#UO1tvBqҽL]9`"P&,,1d~ut܊M"Sypx`x]ް3ca̅cJE8KlnEU.Sa"]<뀹D&f w$ #ߴ^"\T.q d`% *#C~9Vҕgv4vYX6y`,X̬yѨSu瓥Qn$8SԽ5A@ e;LSI`qOB'mȠp0;eEF΂F]FԉO`;7C2 #EL$AxEz3S hu bhF[{wG9*eEB!ze[b1> QWj$ѝv-Љv0f\z|G>aRMmRطPu†@dp6'DG XܮA+.S:Da_Di .ypZnjE2Ĥܳ-.< \*~FP, F]Y ,#YI†M&4Mi*۔!ʘ~f8ͯj3qb / гQ+ef?*Z ‚81H^ْG:}`UI"NcejC!m=m!cL3ڤJ@\KXi.xTfIt\ m3?FbXjNʼWe3zS\AWyGC7ODpBw\*X8݂b 6T> `[4~_p>a_b.)Z6^Q^aq\yv|B>v#ik?*g*BBK}Zmɍ?~kORP(+%cnk..~|7A>yWp74e7 Ac7/5:6JiZbxܰ-B)yag¹KY9s1tJP ?ٲ!dXQ 1,p߰\pn++V<`mtҗ]Kvޓ7 _4mjSj*ᰐ/u2LS|0sQV$^4Ƽm^kU^-ǾHn*s t՛;MDNg7]zRh)ێMa"rgA ?a *vg޳ {EDn_yODĻt*Ւ˿BuoO~nڶu{]@RX]rz10|kl1D7)2NPEaPZ()ܝ,~(X}֝؊FajPOds *raK:[\i"E{-]Pg;c UÚ[;4qb(W C۪O8|Wb0۟{i)2@hUOL;pp܄wt#\zwaAGg| ^֪NNhi|t;9΂&p8݄.ݥ4Ϛi7ˎ6'M܂9BLucwbEXTJ2v=UF`^?RΗ光v{Oؾ;4QWmL׸9^k7D#łyb㣑mЅ StC%ϱQ'`Bg-$J)^yG.|4\'U^ϷOFMKIstC~ayBea]SN({oīϓ?{\b8o'IG\S:k%kY*3;n K`87f"6 jHapH{hJLo{9`MHUű yiVkvHkaˀWLE;c$%\KN86!=dbnl7W^d!b~U$灝% Ĉ:*MPoO^fC#d|>Lth^JR_rײ%"1?ZH;nd*^ [;Lאi)P ±S{{Xcs6;039xB0 0}OuPuoApw_љam<16+ГiPyaa\#BlRvdmfd&GXTQs!`$jaTՃт~\Zb~;~ IxI xoe-E]^aCc)qz1֑OT0C\x1*|ق̕K5mBfTwV[Tm\}8LIq@ E:2~)bD_~nRGl^iۓ1& vM$2dXz 5Aw-`&d]TGc!X Ɗ ER"3zҲ Q73﹏bN)"YO׊CIAfW LCD.4 HUF n):')dT@\8.zbCv ;_h1V OG6x?h1{A=ŠG(Kfi!qс0+9ۧU\H,d/mS\SQyHK~9[q̂bXd`)_K $jCQǬ>C.o&M\m(q(X h] 9\a)NT|KD!q^5 OWE@S_S|0*ڌX&{7~/~FАWC6Kidq,{@#/LO?`XvwhZ*n,G:v WsV=,q,wXrX}C?} #1TGd >w]V>vXGXB*L.0Q>Rp!k Idc1MSq bQ 2u[,HS/>Pgz洶0 UwxbH ':RC,ZkǾ2`[CMuRJ`%R"ux`p8:pjxQT T#&HqlYYrmoN!DՀfIȸGcMctUFLN#Orlr Tz!jGIkOo||c,#.%8SRnک سC4Q{,S#6 ~Sz\-KGn= κ=n  nXߠgaIeꋵ}a$K5; cy-D4+pHrw4aZ+z;n";|#rULbITh/5蔠V,DV5j!JeԍU lk`u֪5}s(& S#),\ ~65zh >f"l4^ֳi>jۈGP74~ \,\mo"_EhO; 26i![yt^z SE;},2$_E?UxJUPe̿wl4ZܰvrtvP Y4zFǔz.eכ@T3 `I'N8Zbi®E,G_yZbHc*k[0[īoQ} >LD(x?zV5Wڔ VSbI*BNS5XV` ҥ?|1$gY$mݴd\ ; >j$S\V[]ج+^4_L!f&cR$ c3w7πzP +`(aAK02BE7N 3SB+dlG ,e3$a?1O-aQSW܁3܇!Uy;EIeM3qރh9[kO9J e6Jl k~ aQ k|@cq7S'_<[ cz-qZpw^}HoA\q*R憕\i[ǰ/q*݋+DƗ0q&, 0ɹϲbi++tLwg!F]a*4AOA?8_kQ>E8ƺ*D>I>"1Kn(&UMWzW$ׁG`PHMe6u[<"5>i.*2e|"w<ԆXjv.:H͡;ĨfeYܡ3`NPRJ} A& oj݌Q~H։ޑ=K`償#p!n﬒F@D!B&=h 0{wUTrdh5^O<¾͐/5+} =A}]5dQΑ@B9(.ײlhSް>'p`x<}S1db_{bX|-,xTMD-Sr_#ggmC$A=, jT>MN[ń/2>x'[ָ>0Ov. w\96!Xzwbb\>p`{+WKQ!p略]cgV_X*@&( uDަgz$MysH'?n?քVaZ6´Jm [CWjhFk}-INA'Xe_rT"8F`1mdbK=bbeQ͕i'-ZPДF)Sύn=М7`D+R,z,uDaծ&:{U,A޲?BcxE&24S>q@a*})N V[ESV!؏(&:MS6؟t#!QT̎!)W;cp*Zm64j,SgH+gVlɌLq ƱTߦ:O)Žvckb<ZDo\=Egjl # ]xGR-ʲiL00Q5oE(*W yP >_:t,4_qWYQ 4p?)'l}WVbWlYUX9XY ۑ`1kkH 4 :sTb-U(pkZ}ė"=bX[)쫻Wr&j98be&41j1 <3|TI1 h=Y C8)%"EBEFwj;;OUD>aJR'e`YS6SǽX5/sn R% U`U$}A>Q_QۥQ*Z-_O4[]x"ӽq1l&Ĭ]{Oˉ+;={+h*|ԽK7yBz&s2CSlk9#8+r Q._MFf~W/Mځ3ZUS7UcgrdLɝ c1BšȚʐO-a%}fۚ0O}){K&#&T3=`K50~{0I"CQN}~X3Yg-C'eTF+@:_<J GP_T0:lK6]G1\;4zA}Y|CX&@e3=Usue)dI0‚DJF|MJ|JH{YH~?gMt$zJqmu_nb\;٩* Y![rA(4]6sXA/G< .5Ȟ0} ۱fƾ6).3M5H CǶd+B@h$=Ho*R>¥B|RޡIS{m=Pob-e9KFF4JKL&&C<{r]Z 0=ohw9 >0w uG Ϝ{.1$ ^݅ٮJIL#|) !4GHUĬG;F!s?2.sa(ZFJdZ:*zcT.K"J~ͷ~FIhyn1pyMxF30ZuBGkǟnG:vSq&;ĿȬ"@~hGo- S}HE/:676MS)/ϔQ4߾:"C4#Xp>x)emiE~Nջ]gq"4z8zx9hݛ=DB3H%--ׄή؊cK'jB PH`kלf]@X*pN]p͛6 \* `N^r;ڙXrcA;?|%ps1[1-;؛ @Mvt8u 25Q Ay:pXW2R=z q|3fQ<s쪜]Lu7]q&q_bj=b2qh"q,'1GɤlT=|}ddZ)d%+슸/ƻ~H6e)ۤƸfM6VTM} gÔs^U#(S|o2T-c.}Erz+mR-.C0XhIA@ə^ލr eo6Ю@A."3][@:E=ysڜbj|LBn޻깰qȞ,S">zKso'u P3I{5n_!yˤUut@(qi8haqG*=dcjSnGCabV+FLMP It}D3DJJr^vI`[^B-vpiq͜ 7P )G 2?*̦8P peWC{cn.Rf8}KoGN֐C}|75dÖ~zQkhpa3G@%8]#d r;8Em6G4ta!"l>ͼT)+yDWǑSvH+N>[aaXOOwaY6i3zkWJȂ=t7/\ܧz/d%_tXFW>Ylǖ|{36NXk[')qfujF"᝹5x48Y#xo:: D1B=R0qPU ^tĄ(e"hլc$cY6QƾT_MR!{<$h ŗY+gkjC#W0yY[7|}aVڗ/x,Onk qI1$z7 #Q=¸B4M@rB% O>ƴeԅ bJc V>i8c0caN{pWy;{Q|5>~rTkK*:ڠ#yÁD7ȋjKxPTSݦֺ $URk"O.qN{?*==ǭ!9;~*l[ O\}[X(*ĆsA,F: k}n*@)ZgE u-)̿#C,=)O"pdOfvrQDZ`_97[ejlL:!+_g_!6k#Tح"B]>(UfNY /[LZ‘o+ZJVsfLP+A3-ˇ 9bɸ R|^O@*W =}Xđ H[AkuRAxW oSڦy6L^,61k)NC>%H HU1,a2Tj14ϸMf;'̪'yEP<"(H:wQ>E׮ʦ ppR ⇹:c> %9$ hĜi"3-ۍ!F*&s+ʛjN+_LsCfE{_"k_" Bp>'dm (u>b!B"j4}A3g-?Qw}OrY‎ŻOnfʄ5;/17!K/ -]JTL:Z.7G~zuBo$w V8($s+}:u?pt;WfAU3Qr)}R6]U,, xXrVyOLBpc]mO=Yb\?JH wh4O{O'&v7a&ɾ@Շ~S`X;"~IAIXQL@[9ۧcP ϴk?IMw}i#B̛ D^nbqT^{Z*|̴_p+;~$^Fbz!aGd-B3 2+4QA)=,؛&葃w#UUgT|;#zmjs}ӆL'93 mO`PBq mfaéjMlW:]z$ݡiNrحAb[^~anrt5i@y 5:gȹåj\x:M-q@\ғ-Lih$xܒOɄ/vmS-<sSÔe n럯-T$W_O^#cG(H;J_Pd7'eM93W=J~f/q7L4$űURc# Gк5Xڐ7%Qus~H]Bp3R ¥1AB(aTԙHFCX@[qR=Wl A0|zvdoQ^a@ .cEFu)h 3h=˦sZ~sv Iz[njQi?U;Iw&c;La7p[]x%h>[BR/(0 UqA=雦 (mxDZsx;!вa7+Z_ܾ'݉;^F)Io^4h*8zF*YW=G"5m@0UC ǵ_ -P,^:"zI#sTId.X|oP&˨D W]"ݸDՄwF^/H!RःmT1՛Q>Jq_kuϻ0A<]8poC -A}ٕ"?zl5uUK^JwTjo&X:1ׅ;H(uojʕi Y<€Vucye߻Q1TT0md;)sXnΔNnǛ{ aȠw8CvZ>Ds7$'c15/&?q Cf ~!sI _CJ،ZDbmSP*0-Zco/t8Z d|Y ^sч;geٚAɉ@ܞ{ x6,YB z4=ĥ`BjҢkXU9L5@ c&naķZ ҆aUOhCUN33oNN WʎD1H[  O8U*R3Y@9P~/(9vڠ{;l2RP $})5`ݕ_8 # r;gjd6[<5)3BֺX6_DƧN!̫DMpM(d<=F,ƚ~Tk;]*\g<+tВ')0±Ʒb Lb1tT%<>{0CLQFwH}3J}nӚ߻|~m{VRf KQn pg 1%93!l!Nw['Rn]{Q; _7$JM_5 1 SJ{8e;NV6X̀ɡ̆Ē %uP݄ 6;YWG>g ڗ58lǪMzP e"oTp/·8? =I3+PԇFdVY,CsG-t< t|̇B?T8B؟ 6:@ Q`p*+zZ]0c 9^ cH/$}.˾~6J' *n Xq7WI)WnUfingӜr(=)h컾!F]c'rhѪY}dďKFU~BU#r6::LncfG466_=Skn E)D Bj@^ovl! 1y؄`Q1| MXo]=W& YR+WRrBS'39"J*+O8[n.U93Gׁu1f+fB4AYMȔ~>O@5W i\t4:v<b~II*[}%(:6?`{3VA 2$~d<꿫0;Cnv1|">D j&ަ\Dwٙ0ozj(r5s*&35^#.J2dq=EZh ZDfH_1^=;A5iMW9- J,dI2unR#}E]-m\W2M0 jaD˫-~EЋtK\`<nohDS, 'HDtd*ɈU@FkηZ=vOe;Z8 dKd!36R\#\|'#bO"$)"_m۔4b3:NguvDḽ4:YI|-܋ڈ] և8 YƆkcl'(VYH'586+^ǙZ{ :dPY5g[AA+.f'-zH֭AS6J=j7Xlo7s%q벋m2GԀ:ǒV׽7P;j(zR_!PC8*߼|g- XTLdx3/l&:c2 ?x6KBȘU LQm$|#2D&c+mWœ"M)A}Ex4MJ8F&QZF/҈Z  8vhrLv[Jz14VJ*xIBq:0~l9hNs5Q ՎګyqwIU B0:y^s0~xS;(oʼnz/k2P:+->vgu!/^{ގ> ۛlr=gdje+<}kCCA]]2:ktNAI ,:](ì5C>LНn hP:c Ay̼2Pp%pz` Џ(=w_%qz78N&"&WLj+F9q7Tjʒq?8K$+QXk?Sl,6@6 B=Xli 6H >tڦ'7hn^ԺȎÒ PwlRi]~n-D2|~,{A/a$nkD] Z/pTCV -QL;Oi1ۈlƕEοV WzUW %Q:|^jDd_죅'f$}ќtLo@p񝋺96-NŵaL>>~R,0=Wpr`_܊Թ4pF%kZr>|MZh=__رM0亚g9'l 9'+CzMR"4J˿|ڜ%GA:$jb9sNlLw׍8"JX"D$9v+N!yB{IL0r&,vlX-E}(JNv2>RBO`@;u]pKw]tXdy1+CFTBJv,ng[ i}R3X%)肜bp9Eҵ7MM}4u F6ZjCme :ִ#iQK2%`cV^w'9日9Gءw6hriT2:j5&[(@O7錷C{4U*0;%3JpNMY_^IiՑNkB8~]p6X,&;r\%:aIg^j>C3;s7оd&g8:@/IEhm';'T%3JmePl-;@ֳ6]&[m8\9͟>[z]Wbs {h{[qI-A JODкʰC׫ FBXAg!Jt>T7".Hd#/7K_ {NAFXwܞp5m'<8H*덑Ij͌Dks%Fƈ%r6y?u>L]MN ,o) )TW]}Z<46G4Gߊ0h2^>0"Umwl ײxaVfab0 .yYq)ѼQ?p|1'J$9Iykywqߓ7mXGRj 9#+}D? 0gwnJ#WxYA{|[,(jw=T]<7mT !kxisRh'45i4'wsHzOM٘HǮʔyLm-{#~n9zEh5([ /NtJuE< $X;K9m;+n͝|eTTe^]KN}ŢE6-|P[~5pׅz3:=q+?Imd~h_[TJ+PȥSɩRMA<. CRF,)=Xu͂xꗼ6!ȉ"{5J+A)'Yt (Y;F's2`$0miHiC~ Fm>q9^'"%%aI?i҃Śm>y,uBb0|E|%ߒt'F Jx2qb@30pWuoU0˺K0dXfO_Qq<ʬ-ʽf~%geZIJ1sn6F T6 4.W !tRI5iTM%Qd\<](~AD)I藜Dz)b z+yy]'f?o<uaɥ,|\ |Ź$N%FHOVށ9D{*FV%B'oHoA7Na{vQ{a_p@sE.~;X P :'}@a, Zⲯ S݊K ᇌ07InJGْ@KoN8Ԟ>OЀ@B\2FE~Q.!8܈3=)FS(A]~Upu<ԐۋN1*ZE1vzdځv臄=$,^=9Ӕ경x$Q,HjJSh!i9QC/pQ*րOB.-XbBy1 L`MKkh֌$ivxSr>uTAX`` ]>bqf{DAa:XЅK83H+^Ƈ A41#9 ~PH$augoCߞn Cc8oVBMAQ ė6`XэHm(E /D ?B ; FO4uMVOѓ2PיXsW{u1ԟxH!f7+MOgGų;Fm'eBnԢ;caLvn1!z Nז,bSz۱8T1Xͥ!YZ(q ׮~|8Ѳc%* : /yܧ"ƪ'͚FM<19Rs'YjL#M.F'A< G!A ٚ}w$5?Wapx~.i<8 gu %GO2W)-do*;,7IT-Ee=W)yIVM@G3ڮi8 x+lAf2衰қ涊z\+ vܬhl$^fA3B(-%녵RJ;7nw knGT;po8`$ $D]r7L\ ,yK%ԣlr'\T=8-"gd(ܒ!H<:gZڬ]6HuBc,w;%C5Pކ#4D;R9Ń&0tfClT'Ǣ $,|ew77$)K3ov4=e""yO+myEЬV|4JMIyX#^qS7ړح (P1 `hME*%:`U֭NLR+BZ[ق9U2_2z>6Ңq 'Y\Y>b i^G̊$$`G'PB6 PWࠓWn"aӰjE/[1=>,1iNcAP/!’׃{{Atql ȿP~5gBulˏfƐܭTu-2FJ?TK@"pR?vX10)n>hzMU+yz^?Igw;X{үuOF.4(3rJG;X*f6h!8-1*F /sEu" )9v#%2_;/ k y y2 S>FW/6+!%&.?x7Pq<3HA~ R *i^ˏGR(1%" Ib].N`ǤM. MF a;+lTrz:s;p6d ܢ(Q:z$Ix3p6/DmCbX!Br9ZkVr5M Wx>Ive) l4KJ[Nxipq^TdxC5]/Caҏ7V`.,Ï;y%J5s*a$&=3Xo8$N a8eZP^Uj:S܊T[L';X>1!{ o2Awz]Q6~.ߺaz4>?|!|DV=O/f.\6%-GRD5Д$F5kM*jXO Fv\޸ 0F?|uKRLicAk)sxz U;PU_"i(/eMahTG _ l[ /uԾ[~rd)1Z&2 *;>+/=s,3qUEp܅qM1N1iGa94P. <{o//4۰? {kBX>M HdS0"i>K& F"Ca$K*l< q4JUI$N.f\ۺ*[rLCWve(´K("‹aS@C^!q4Y@_o=1Ӑu۵_T6B :*zv3'iQʀQՇH$\nMط_g\j]^/Zt;{{'lj}02z)HjmPlIbe'ώبznNo,[nxl:@M<)Rl 3MUTd/MMQHp222xɽL!]Jp4yJnC'Έi@$wl^f#;Dtq!P[ s\ 63L).U^[Ox$q* T-'%ۊ"¨Ya+}R;\T.F(iSr _{䇺K=9[5 ҟew`x2^y 3뺾#T|8DC[A*B`Cz|)$z"~CbOv. KtTp>x/ڵTgVVe;W1+);,lǃsu/}o6}];t18I,RT,iݍfNsc[`n.$g/n%wg? N5Xqps}»RwftwPLgʦӦ6k)͂RJWijpm8GpE@oL4u^,aPP@>Q#7E .(PdlBZșS6aR QmʚG9疷0/|.@Eh?XSS*VjIh'k-#^2)֕ k"9Mz=(~,`N}IpO0Ƥn n\ЉΈL\ xf7 #>ClH.A8XԦIQ}R v3B v$x[9$âDʮ m]PQ]̷/4\i &Y7}܁  qV*5t |9xc<>o٦Ǖ{jcT\Z0"Y&ީ,d$l]JD{OGK=N@rvk9N(lmÎ jw5$ҁǹ #ߙ*q癎Vyy4˖3@؟;Uh"W ӥռ`W.`$lZt̜m^^?bLkBwĜPXhX+4.<4ƛhB hтUEhТ7^-جRW~\<8I:!a{N?6LjIA*m^vn L^ wpUW8< RWXƇdUPQulz㡜Ӌ1澻jO]JQ鍀&Khv Ӧ~&"cP.FRXS.bOzV"L$7&{r h!a7p ;j{UJ%I#׹܉YK4v𖃉Ua;쌬E J퀐׽NHS9:fȉxV0RKDNJ/UWˍjY5sUxPI!4*w XmLG Գc@!\V-p>1ڣn잏&rM.p:"ܧP'?n[BELT81m&7#cojWTp2$M]nBf4|属xsogT" (kpqࡋ晬yܲ.H#e.תlnzcB|"n;  SVQY8!E_T /…^o]Ag^*=|A]r@z.c~bp@xbTayX$XZ% {݃M#mFsD>w'28z!"{݇pt[5̱qSWI\wrGs ɹYgm $#5cm sQeb4?ʛ,cdKǭDx ҔRqB f9l--R8\rJ&17qݠ.4p9h}L6E:NZ%r/j{bJcr!1~PzCOCr1gۿ8;.^d$؂!ļeFQ$6M-6FO[dV^qOP贔Eth+fZ;vKn#9rOpA `-^rѐcѨ\zWVd3cyIcVJVaJH+ &"<}MeWf!z]9q(YWmNydKљ'cP|8Q=cs}ր g&I|L @ [+xv%xJˉ[jV85m"q=%~giҴnCJ_hㆪMzݭfoiFS$Ǭs袚ٚAQ\t )7K c>S'cتN >?ȁZʤц <f}=@F_'\_\8+ga72kgK[Hgqu*S^"nCׇ( Rٰd:LA[_., j04!HzפkJc駑1Q$=vG 1U z#4Ze+@NR7P4_]2{Xdj }#* *)ҝc>.2 G6 3}؀ YaPs%D=cxYu1 xUKH/w-)uj_67qQ'ov{f,DU}JMM'u@2I]v!&{% U l RŨ Ӹ C?B`R/_!{Óa{ \%CqՁLVHhp?m~VKxކ:bǶ 00|.=mItB#%I>V*.bBFfMY e3ʀ,w4+ . èXLt; XyÂ0ad}]ژ\1LKD *٤dP'er >j6B!G|^bɖ%PI3ѫ?,6/ߤð,DM3@ ̃ALxYk `<5_ +S=, b.EvYm8嗡'*D,nZhM7@:e^kC%K,ȃ ;q+cC_铦4A6|~zaCec@X[k* & X[ZH@ƕ?euq;K8cr.0 WhܚmAC۽vZ6g0r{Ud-k}3^b;kH(@C!,@I[.S~n$,9wNҏMj)צ`WO_^VO!ǞlLI^Hũn#9H P^z y _VcM= 36оLS2OݸT([5e ];[\;MY# Ѥ@,H'*ҬȳI(;??nlJ? SHrG^DO>|kvr,_ˇ9Vc;̛ e+l,o~wsc{<#Y +&t7ә0Bh7oE4gIE8/Jy4b3'1Fo:=e$knbO0ePkdG3pexiJ!2d=8>j&>NhxI?I \'ODd8N|5r9g e!_y)$E=H=n.yL5I$`\ >6#QYW(u`= ܴ>N͵ <߆{=b:ZB+v?nQy}aȴ=ȡtX3~,$Aה}A \`qˈv&ҙ#T[BD^Ľӌ`=f>!c=}3˕[OgaXi\⛧*M2 XԯVէy8(Z6Fb~mESF[Ϫ¨T2^flATI᮸5|b,!od]>HYAb{a$]% '\&`XS֨Gs0\k U~C*@R+%٢8NB xB0_>5--Y"*qEr Sth.?Gl{ aN3+aE#1R'Vxم?`x5xu|%d#uF/hԇhT>Yw >kFe<'H4H);+Dp'O!;`GN.{qJ뉑I52`IIjbkY[YA9[ls19,⒧#BgbZJU%f$M&13 6?sN & [V?{M'g.ݚ'WAٳn;jIuK_$k7.OoQ^d㚟hL|I({>i T[}ss AjAN*bm4q"߻\xk؞~2L1x ޺JJgGϗv/]b60rF)Q! AZ\o'bIsd5uKQeĠXpQS_Ð@TkeuM۰}}69ͳ6;rLy/꾈`̜kOV(&6u(@7LֳZVVOU@p'c`+jOۑUktJ Ý A\A7إ>Ba3 b|6ʙS4qce.*1M dQ@~4JqjCO,=,ŅW6M (X؊PjPnضp!>+Y<,#X^ 38uDrIqK97]%V:N6`h!"''OgH>}-^$5,}Fۇ D.Xzh@bJ "HR2>l|RLS |cab{wN!Ve$: n3nj\t+nFLHpGCcBdYv\ չӺPu 8psEXgY1k We%Tdo]\nd!H$$l!zlՌ*y}obSah|XfЙ_*;.hbp; t2w<+[?+cn-N4Btv$GU/Q3)䞘߁!:k %L/#2(ܓia_-6'5}Gq %Ugďk hv{huL dV/ d>j/GpsnCQa041[xFq]\ᙇ]X8! coÃIy,o$c`&X#aO2>$ݟ/;:z` Wc3Ҝn0#+؍RkӳRn~(6[ F~j+{vt<{yo+pR ީT8 |hat7[Ե ѐHV>4+ݭǾiGjNH97D 4"}#p7UQhò/$4Ig' ,.4|]= :4q5=@W.+)} >%D`IRB"bRIn.ݼ!#~@x4L%f.甚٭[8o-A4b.)V‚eC WW~k=Jl|-z1(nW~ǚTٻzqЀjOrAH`栃ϋ<"x{$f{*pr^10.a Xa>ausJ^cw"ylUaIB.:ۼkashb]qQ'f;ۘ 4!!pExTuY<iýfTS4J3tC)Y9Nʱh4VΛu2]O xL*-whg}OsJ5C{lPpCx4sq=VU %|׭=*$zCߥ(l弊 Oџk}]HD7ĊJr6X'⓪DPv~S2:ꚑsS^r_$bm3beu^kQg$Sg9LU pJDYkM"iV,VR@Ţvmݞ2BD];hyR"ˬS?}MeC+*NNCamgN}" B'y[wi7/6Ȩ|9_z^KctRm^ .djCKte:wŝAzPNh|s+! @[%ʷێĂQIq24pJ;%/JRpPA-Ҁ :Yݸ%4Q1Y[_rA2kP_x,Ukڐ\G*7>LϘ|D^t./PO$/-sᔠ0֗4? !oE9\ف gxlbR 6MʨE pZ ܲ)7#SجP;-(d ܎ FܖwX=W.h@{I2*-4JZ^k CZξ?'I5ۗSZ+>N1#𷃂*%i;!~ W*<_] J$Oz:2h>_>z L?A x*yXSa~ESy^h`єydȗ1O&%}/8z}>@V u.Ν"2ʃT@ctT6%Ėy( Ԏy,ǺFU"q.k:~!&˶!U~ Y2aF \jR"Ovxh0 uz?|6z!2R٘$$%-ζ]YG3' w]2tJmlaq 82 6BEEcLT߶hn6؈ِ%]jz\CwՁ(B^a?*'b/&cm{Tѭ{P:,Hbru lgPB';bM>IJ[a ufɀ.[t6' ${'D-8 Oœ*^P$ 6eM 3Zc5fpj:hTZz y uQkq'UN<0()' xE!n$Gā.N'|L^JuBJzTI%+kh@ǡ)T%1kggWi؎ːpD0$Z^t_~kY[,W[S)|EO3AH5~ 3!V_S 31 ׮'" j"s_beO}`ڤ}JtIrm찬lb9X8ꕂV{A'3(/lҟO~HE_˹AXx82S*9*w-?gEEas>V*t}Xd} [,㽙pe@Wa)%cvacbt ~[76D~WM2@%݌hZ,oM_*CAP.r\?X b@LnnS #]}J A-$N:A9I l ڳe ѭL'%۽-6Q+pF(OVÛXx+8:Wߺ旃,+Bt-p{N,d=pBMA34݁ch߹s%>Z"Y Cf L5ڹKGa2 =ӊgu萈ֶL/ /-:ooOY8۩0.1rڥ?Il cbUH>#m1R*䍹)CC\*60j#9*xޅ<#r!8~_5nrs6=ŽMv?kM*rI-WA0+ݧa2Dq)>il׫j }9nҪXґ>8Ad3p,TFJ]P꽁t>gưZɮgva'b_ӚÜxd(cG_PdaQ)rG]y5KWWs& ow.>^G$VUŵ|JvdmZ}i&š]a#qlZEx{Ϸzx /N"?QDU/!I΍h_p+"BS55l, qw.G?qKjA5f-u(TKޟ&*ZŔ- OcNitZÍ@VUM8R %v P,uJ_Suw%JHnc:5T_fьih' =h咲CtڡsXt@mk\l6/qZh8.F@K$oꟻ &_Li ?{6 X2e ֬x#H3~Y([[eAD:hCK56>[ٷJ 5 z w|Iͷz~7iϤJF7Oe&hvU)GK߇ΏVZ`y|`=ј۽'^* g^Zc6%Ry)~;|}F8}dH&D[8+t}1MnP: '`%=ݥbFxf4`."$H̩*3_8<тCb0Y"6R@TnՀhYU\-MsKcKޏҹhraptt"pFzA k=eqx0H 反ReUHiooG+e&!f`9%3uЬL-!Axdl*sȄg|lM,2Z{BmG+I'PRoi"+CWP4LE!O>(r©z(ЀՔpbD_y}s Pb*mٷ1bњfK3s?hgH}gL 9iF >n;4_D>_yXZu^eDD~x4 %i<6âNzaxquήڕ}URJmFU *-.[89a~l¡ еbrK й^} ``BBoq7:(_%C^p)h(yTTw}1z#8146(*O77#iU w7Q wUq eߖc,CIFSSOۅQ:]%輫tA_ؙ}$G1u8cdA[렭!eENt7a\g=n^74'3_"Ju E;9CPC#|4_B5;j}"̋XPzodtH{U|9O` mHd4Md4ё#*x/0nj?fBF1͔׶83sl3WsE|=J :m(i-TI}}r@ݸ,s'/'uA\ A*t"$w̕jDzM"ďI;B9&!3"BE#$ -Y&\.N}nT|T} 1a` "wAw~iX|Ǔ;*bk: c̿fH-Ĉ]:!UxM(H2؏vIS,36R7alf(6ۼIH_w<~6c0F`Fρē!CD/'\t"'7 ӬJzw| )Uת\+xO`4Iyh 5fD #{:VK.i=Ѐ1en8o;sK>4\6SQ%Y)au.V7:?Lkـ~ YikqkDIș=|7 h:q`$6f&E}'3juC,:`ž%O~\]=g>;W7JRqWvAJ~oM0z'ޟqR'zlj@z{kĎE n;@&CVXD^ÁAR~wul G%LWb%?^^9%E '\AO~ 5K{ צ17.Mf ZsyT(*lTYԇT<2@Bwڗ$ <-ISM`Td Ҹ%|ѫZeW4X4Dx5;$ԕ Q88q)r}l¿db{`obc)㈭(I_x9}J[ea xؚUju͔QP׆JW ݰR1[8+0MG |M KcY>!U  / E=A0~x$qo#XL];X|.h n=0n+t]ھGpIw8 &f7hYDDR75:)W4),WVCu2Z:ۮJbH~fpNUdסa2q3"-RδT3bp3vu8h@j`T7A9$( Y*LƆ'\f)ӋSGKoHVO-O/rQ 0j-IQE<_Iao ?REgn*%EW[Z b0rfqhjԒ iЎTw ԗHbl?%Cw=V!`FL$!Aij_ôTR١X@w+~j=fiN6dSx1nzxa!܌*v)͋@UET<VLHdL`6hQpY,,o֋q | '$G :$F,+.xQ`q#"2f)$EWpրB4 uzprEJ6D(:>gDvP-uڇ,# P۽or/ ^.-~vYkֶI8+3ݐS챸dj:-cE')},YC1ۭ +,۫mDD8ԉDc.]/{ԊEvH}(u2™tW_@( ;?1N1,آD" uV.BX \>(q].e^ckU*.ꑀ񠳻ROKGs<brN~DmMbx27,CzEH! 6",pN \T.=;3>8wS;L7ڱ-Umiexhps@FDL1vߌGD8>(Ň_,[d΋z dgM4*ީK*|GCU~i[k=7/{X^3h12-D1ag+ wޥ !#ݭiBWf{QEJ6lBzFX#xg($'vL؝tP_̹_.Mn-b?"0lҪjߠ^r-yɁ<+?:N略^جfk߻IUC>z5c-xȿMKuz_M\ &CqW$/&zg52ueLi[@>d3HSqzv 8ϣ|` ~W;,? 2~<$㕳/s埰51c`"ATxWdmDC܏~~F`j‰d @K4at瘉9ї|,\V|'Fo[ܲD  (ng$ ^,/ gbwJ{&"Z򮄙?j+s"'W/0h|ЂVUo%/D N}ǡ<%*Sf:5Pg:ѧZ…u% )Bi;LpHF}F!9r (WX0U/#XT)H (v.\j) ̖ \Di|"r2֏ ly:ZS 3WUt _KKj[*U;'YVqRC)Oun11/C]K|ے^o40f0I6*2vTZ+mȅMtg>QPz$ݩA3tY- ag4ff[2޴ Mlk l9(.KDQ)*0q.:GK4\mLTN"҉,vR:lcJ$yoaؾ4wWGUD;wD}F3wV ] ).b N"K5;2D)r3Fŵm WOkq+=$eUD}xf9cRS4 rlނ*ظ/"UyzVMkLcXYUg d<ń؜}gY{o`XI.'W)ng]{gD=}職34sY""}6F4QԢG'':(OoMѨ6 yVL /T%y͝ӈ noMӻ [6<73JNC7j2/xM&_\UNS9#aõK=i`s%E?]swK6&_!6>[5#QApø 0oӇƜ $M7 `q B &-5 E4OJCP ~ X6DR4٧ 摀8q[ Lq~8tL[%%JäA-8.-Y﮹l(ekm{uR|UDxO<@G]1GcPa傼}lH8}*bELfOg#f)mpǼmc'Ll|-lppRXOz$hnȓ\Ϻ&MERH, 0p%#Ml )02{6+r3':K|(Tă XZ rE {'jz3b#-tU}~%ےpM]xCj>c_+"g#V^p52 0ilqU|~$z .PxvhM.:`gFcJ2vF?/86m3Ԅ-BQ'/zʕ_ԑn3Fw}PBkE 2@>elt}ih`Qz cX%c U1!2+|rxJc3ϧJ{ += vN9Gj辐糼 @9~1Xq` p0r$,"{V70JwFOkCg95i4= LAœxʜIN)6꧈Eb_ҝhf{]щjhM(qG0Bi9 J"܂[ [Q!V@_n.h)xb7MkP ܘ4]{fKs1ϨʼB+zg:o&<BL/&'e2gN+ypyD=mJPX+Ф↩:~AoKc1gxyOR‡}40-Z{;&LnX&3%ZB6Cm3S+-`#0Xe"P JOh^S?`tR>{ SCGݎ-Ef-w@b^vz@["OG»K #:V3'DQ{5o"Z F4{ʇ7G9Zz,hC.wwufa@uPDoOGf+ٴ|<Ab%_aSsV!cl_ٿ_iYuI:AC3hBm(8J } Q+¬2{S)GqDp!N5;ˬPuU;wэ|vL`{>ko[἞ڟZB@2-$ub9 œ%ýPC\=Z5l&]%L zYFFEiIE6) e}k2ys,*d-Q̚ۈ$E e=` wySF V͐Rjb]:f)ڄ]8\Oyg$t4éb8zS\3-3&'?W%CTWa]@MU$, Av)4'٬Orhs#tg7tWWO J"]ǭ. /Ǿ@Sr+C$%_M*{Wg$78~t6>qHYT_Ҽ8c PO;pVi;ӎ,AʔfC8 ɧi)}I}* O-%F)5!LwyӞxiwg3<(q͵Wt@i4} =?-r0ɲt 0.4y-zRݣmZ{QէLjpa&rn~ԩYl;p8ΈH!aN;w64Fo y'st|.h(CڟYh6 #]²ït2![[Ul{X %`\$ޖ&!D9FthnI+3xU Gr2둇߳\ [4{rڣM(J>02Od ["}3mq=8 z iͲ eg*IW269GgA]|i3Ř~wgk Q['@ , ƭԴhnHvpx ɨ"nL(1ηA+\#LMK'uvG[r g1HAU.ǗL뽟B5JnG=/d]_TU^SrV:?3)ͻ):S.]puQ_ 5lSxQuٞ=?d2h~Pu̓ L,x53S&i"rKi~*UzoT{grv\Wٯض?3?(+g͙-Ҍ\zuet >jy_]RW{,jE(9k*F¯vg6&X:``h$cO4zޠCccvjkhf&k(rCçzh/}Qk_X]ZbsgbWB{~C]W%5=*PKdt#Rc[:Vxh@\Ot7mao,$;nP?V^*ͨTk'b0P뉫UQ[!>Ή+$ܬ?!JlݟLM\fr% n J]n$3U< )[HV Vi =ek՞ئ }It s8O(07\T$o\\+Dv-P`<+`yӟ;܏q[Y~ is }XsJ#w!->/3z"$[!i_6=|g!!,hI/On@3Z4¬E>ȗ¾:J~/ 9'~ۚQm%DʌP&+1w9џ]"7*0LY 9mwZ+S|/HS olf:kNkXJ KN(o{DdS5&J^U[Y2]yZҔWpqvc7?b!hZ88~58nFU-BKQQoTVNAg N!q s9@}Tv8*TK5 SGx韐MY+s%=eY (ܬ̜/6jvˁ .lwwVrוՌ_1Nk "bYvp*HB2%oN*SEOh:it01[ NJ\kch?'b7`ɛ[ާ56$x#@Z2UG/4CՖvE&\N73kK>q ~b<Ѕ9;aS9]`L0wMM9&0n{90df*yVEp*n?2f⟙d 8SaE#jӶӭLM`I4zзlRdb#̝m*gK$/gϗ;Ò%-<=P܇=oo_)ֲ->9ZxR|k*P,jhC$۪H ()w0Xv 7æmp0Vt\ FNKHϴ2v!A |A%K#Be#o\l}~Hޖ#YA\I_g%lE^'͌ ڢ?p~?z6p=i_f} 7?Y}ǢUge^DC#y :h–O8yo s18Nwɚ'jBi\QWQM-b )pnV8_ A]t2T२615օIPFq15v(XnnߓXrX? jɓj=s\ U^)6 ,UAnFjD;uo:ujfJC菓GZFaO\ؤ:륁-]< @E&n&~=aLVFH/un0m*oq?¬&kxk !_޲ ,|i}8v|udzCT;QI'Txߘb蔳L?>YL'hiEyXh>4F`›wKf8࿮ۥdOuվF&m0gݳqe'N2ijf`'8 Ǜ]J^WPCxgTޓ˞@f;T'CYh08b[.\2'a% j_*<=&9q5idcPFӽ3aqk^„+?Or4o:vɩY7F?+BPܝ]OtCymwnͨ!S{`@˯?!<8cu|J;G?|An.'-|* p> SUL*$$!Q &_̄T'_Z2(_pM_Y0?(ZWŸ>t׊sk=ݥC: {>Ƚ'4AInЩz'\z~ٽo~2alaV߿"1)FcU :L[ iY ƯdO]o˄]h# yoS?wB?z.PfCRK\Y]U!L/889sx 7Ka4GЇrLbM2Ws1 HةjK[u_֝z*B5DZ6M~ WVNL!NևiIa~ڷO}Ӈ0GӖDG55o闑~إ J 6Ilv ^G}9ۚOم&1…zxmTF @}q9Uf )o{V?O$uѹ2ӡw zk! Vg`V-QxҀF}YW?h2;YS` \@Q߬MU//gt]VZsɰyk+k/P.~[BP$${2/&),{Be;<`A^IYlKmAH)ilw~G #}'z[O8efJ`rTU½{57`͞.{d6ŃHW6S]>\SOP2J\kU< ,6RNy3ҝ\*5r;!67 0 3u؈z`Bn ?Q 8i4ޒsrO#*ѽؾamcR/fe-Ea+yڝpXPv;zNA//ٰRJf'RgUx2[0g̚y?錘ďw 5 YH6=+B<9p#*(x} s )`v<іeKnpkJ: AFbљ*ηԟ]ZׯѮh Tv&w/c@"+]+Wu^W^aOT!H *!ɴHcWHSIzlj~{H ΀)PõR@n\lLPn>h%&܁or,gdJYaV覚I)hЗK,K [hX#Q$9\/>0}tF} SwtVuⵡ@`/ކ&J/ _=HOo?Q4~U$SrEY/O8]w`a]T˖vR' UmЭZ?z[J!m&SjwqtqX1jD3xS93]ҩ !YNx.rݟ ]tS$׾\SgtDxbdɈI%n(ś o_lpM,y(sݭF-2ԮYxZ7ʧq3k:H$k9l\htrÇz ;²MRhDѯtB=ȃXX6;Ьz- oEp2f{2'|gh$￘.Ʌ^.&<O鞜"38{4"d(_5 FvtIȓnםΉeyǽKZ__R }pس9Ne&*!E ?%.[촼GZMH׸]|+u&L1IwF(> lӑD|_D \o ,M.Q(9yA*ȟNYa*SM z"`CŽa{jVJ0/; <\DOZuywgUҜQHuvKVG+(% x,|юCJNzIO+$::GqLgi8,WJ ~{hun3 3:$;z> YW'f-cvq@Zݑ21^M I59]Jtkyiv`JwY~hZ a01zYg!7_ag*^gL4ůJTacxrhEmI m\~5fEd6i* -㙫_;߲Z4CܼQomE ?6s.2Lz6W%Vj/CV_Ԧ ikf0I ()+G=}*?2%_'P3.=x $Jª]Q0\WGtߘ #{A;9)Z\M.> g`jLME95U,0Z0n?Ӈl(i'$,Uv4j_[٧MZί׈09|]XK2qSdYZ΁6jJS[03ڰ!̑r Τ4 iq9n5vZ/#,),Tus#bc`B߬+]%FޒjqF %uoļ3fǀ% rm?nRߐe0&[CYۺU_z<cӕVᕞOͅQKbH).k d|ґ85UQ?g"BwpsZ? #)fƨʗP샩`=zd0hڂ~&D#FsLҙ4D%^Q(D d&vBjQ(Q;W^=TjQ3l8n "}AD *blc}Yǂ0ra4bkjѳL), Y&XvȬR.0%%[_HQPJg"|s˕PqnK5Z*eR_`J u?0O4 " ӇUCIrFB(Lo {mV؅3j6n@FFnt`%D[SV;`ڰJ[(&PZ032 _Fؕ8 X5cꍤ )pꤱU#+\8a(kq@ ?2]fզhoAmBTWw'eOP(\3YІ|Eq>=oK=`" H,۹HQ+˩^ǂ?݋;>{l-ݲ9c:I T:lU)d ):ֆ1K+Bɞ]DZ-J8pO>QڲOk7}mr/ي7QtU~vWw)uѽIbCUJ+zXx 4 R DE@2Xm6lA}r{=eֵ놱翽kŲ^yM?+'Uɉ[̚asSז (qCGtȧ%1ʘ`ͩ #CIPj+AfK/u&X89u7hQ8yLn6X<)BACa w$B᫲@,}9S\2r 6=<1>h(#26 gnL+d[%K /׸QxqDgPB\%$d[6 ˮzJoq4h-E6,'FD_-,!z-(|-5z;%ZY$s(;?`OP4㌜z YK #rβueHdX.b^'Q`x4*E:*7•ȁ#Sz''omK۟تsZIܫgFg-L)qq} 7hړ9s Hִb'ҋIa, mkT˲Y$? g-MH.>Fc']>"'`/χi$`}Qa˘w c,ِZW|u%QR#5K2I5c"z"U+(/8]0s{6ƖL6z?|ޗ3bJX4`wʙC0q2mHy[Vyu-_e| P+Ik^J}^H/Rz(d'yV/_羵M,dNJ.Q﬑@MVQTzbud1}m)F'vb6ѠA1bG=`l$Z:F2oMK'9?e4 R\p!,]ŷǘp|{eϘ^GᬬgQk4uFYY7in$v^daIw]dJSG[mU1IKLBd&mLД\2MxoLj 5&PG|G{#=."m|bY\$**ػiՍ" _UV"oIxgߘi͗"Pz\HI:Md.B.Qx;}b;k\xI")mDy/?hm܍YNR{-_Z5})@ZA5,q D|-tob,f5d.#gƫV厑lm@ˡ`y/?i^XET8Hbog-aNvyx|fn ) 8}Zk2&V ȬH#OhƳ]*(cD!NybS%9QPj&I@e&h_< 0o:U =_(7T !61'z]ڶ[IG5ncy[m$Q]]e70mrbM<90ocnu0dH6Ne o#^WX:05l@_);O[Z9yL}e[$1rNhϱM:/y!DO#]kj"ue.H5q*8[S߶tmc Ml#=ٮ$9v=b$sμ#(cR1нg}4PqJԠm8}eP6O㿂JvZԀ)]V 5c؁rM?5zqxjF1q7Meǵ6,ԉcW͑bQRS;|B E:A$ab(y\1 *yS*LpF W"ԛ 7?`|w͂wL3pP]J\ ;#´PBYK1K8w0tSڊw )xZ;? 00n.Ng <6 mT1\"Q‹9_aRD1˻`;w}^d7`v/> @),p% \yZGOEؙq4}ae"AnT7C1jN|:>  S`7q:y}CCb"7zR͋qhhk 7'W/DySzMQ݃0zS7!ЃSC.f_\j@gQ+y3-Ly.2ku"%r;L@|K+P_ 3´GNPdx6$:"ŚV]AU{Ŵz*WmNOqAJuÞPe`zLaK{ʵKdH@b+"/-`*B]~M )oR3q>!^:͹KREEףbS{m :f@Gu3."e`ƨYZ $<~+K c9I8g'$ݔZRwܓ`8ɋŤ> KW9hصmOY&DnȯKVHpFa_́3 Yyfa\B.`^B<,=5&D}R1I!-,K )scJ[v!2D- gNYw7@m!yԔě( S W$ߤ& CTmivXzE6M] L0*EM*`Mw!QB Vg\! B@_ɥ_O{e"<3ļ 8_ک!l_[$x% kv}\ѤBҋQkK)n8,Yx_}ouhsrqA|co&|\{>t>s9,HmGM*zdVNq bS,ZLvw`u opynOhPoKYb7fDž(<hN"TFV~3jԃ#ڠc6|YIf up;&tDh Нc˼{y:Gyeu*nxoLhI&K[ Aǂ:B @*ߥ FM̢X_ !z +18yB.9Cwuh;R oQ " E)eZ>Qk2չj>AcM+tO ;VS]>XLh`x)H8q/v{u6[qqۧbFSE_":xS5[ܩ ʽL1jrejYu8Rޱ'wu+kr3%zZeNpN˻r?Jqx޾pYa$goRS8]\m T%ZˤHH{N ]k'H1ڎ牯O D_-(/Jmq3|Oc~\@ox?:=ltQQ'V  n(RNIq NO%#a2hmn! CVKN3_&ANۨWAEtQ]5]⧎Qs;BڱKq>˱~L~. TaAh-sqZid,KNhl}tmt 3ثcLj\]i[}!Y1e8 ׺:XY_ZY}- k7+yroq߇颋p҂y] 9{#bYip!hDbR[j-\("'FW|W,DnP |Aއl&¾WQǡ>DW=wʵ)d}VbQ¿D{ܡ#tq$xJѻm8ԭTJd0sj |m=Ȳ  $w^RM9'&q5Z !οZct>I(-.܏!v"{i= .r1\~/c|{Yt8/p&gzL#k6dM0tiHіVuR@♥z$:Fs2na+QDP '451SEܼc`kSMFݲ<7֑"n'54qT|dNrSoĽlOJ׈Tm"sLdQ?hF 'b!4d™)/͒X;zd(V(q>cvo3YKJИI';PBiAُC*)/]-`ZE3aiaM"y$"2ysQG!1O1B\G;!r  pC1EhG̉s(e8&q2>5 fu[ݪ!2f+ŠV5VJV2g?| / 2y8h#4r$\X.=_硥¶'G-5yqݤ}gd]H%IL 咎{yV}on+A$]H sySm!&jCsBxGx/ Wz7My20wTu9=G՘U(`!=hFlgS{+̚:?,2,~\~K^ZKiifW9QkM`8rJ:G:%a_A5E&_!˺wnq\&BZgȳt*a -H=:u)ӷG1-@Ѧ ]ZX~w:r!Kyk)WlOR\_8ئϛ#BAuAIu/}IAf` ~N @ @m,Pa$[z}Mq*>!^ѷҊ[3O5 ]b-%4ؕqUA'CV b/+7ǝ, b^䮏PǀTQXU eoWp]acBcgs1CM0uY&zd2rOo4GZ{ <b.C(^yH8Y_,2e^b y/XK]2:b܁-E 28tmTK )t7Ң@xD yYU&hEM<xp H.<~7CHgd(l*w(#P-/P2 i?&7ɧ9if~_B5'k\*WZ-:-*zG r`tч3Apa +a$vl˰cդ]_;oji{(U־ IbB Xw=\^4`:5DuY u{9#>ԀL:ޫάIx Rs9Y.zGA{5SE9YVL5KEYd"˾Zf\4,5V;͠\0G?;*oy4xeHe M|btH7  ( y- xcxoyǶN!D>`:gE j"$Ri񁂿 L_v\S+mtrԒb8䱆~ygs g6jܙL5.GVJd^%sN>syZ3J53Q5]ϗVTKH"hgKEX ]Gۏ!n(;MMt9p1:i΢]E%SuyĿØSDr2N+Ϣ.D^6jѧ;a!EBs^#B*naIEjǣ+UO5 M@_>a:mXa?w >jQq&g^,OFȻ.@pؿYKi?뤇3:n}Mg҇Efv}hMn j1V}X^IFHIE_+W4p7pЉH9%δ )({\i':饛# ./^덖?7]+>Fp{}[xF'2$%oX/] mKh{>l!]4ĺyG eۺNEɘ54mȅ})zi݇NOt m:U/dDtסp=|§a mcE2PtNXwBIs릕6i^ T`$h}wH=,TJZR{j?:37gk*˭ƶɜŶ+^\ jȩUaJH կ@DuvQsy҄,drO+CyCrlz̩[|o ^¼_IDB-9׫#h!C?6DhF;0#mV\35_kg3v:y* !\pp+bW_B uκxf3IOk=q w1ՕӹP~ .:9\!p5e@ES(x'}MQc[5o35m~ |v›;]" YtI1@NifMm%y_p vf*e3@Ӏf=MoH4ڪ$(Qeuٌ`{`,T`}WZ2Ό-w7]j;}?W_Z]VOMJA'4 Kƪ-U|`@`v:hjp!hyLa#dkd"Vx*\<,!=Q(X_|Y$]칝;Ҁ6pU&#AdPnt _yw+5.],F_Ұ 'BI5@04 >,OfNӪϚ+vT Ǡ|aKQձc#.MNB!):ENbe:w!4t9Sƚ1g'PWO [;% !nܨC64t}{\⥆|'/uZRojVIfYag.ܩ<[;|VXL O逯ӎ|3Z }_ !q&&KJ ,- Xx7HKN\PIFܐ5g$mG]f~x}+ }IrNg*"|ն5:EK6Hyr$V*sջթpٝKpˏ!Yo#Xoqu*<9lB nZjN qekj[P}+>6i,s/z⥇7w$F¾:^_-K1AN)cκ":  L;{ kPRY) tI2qV@(UӶ:EFD|6񙗃Æ}P͠{_fGJ臤"JK27-1f+C@Wb!}.Jq=2kۿas:Ân'X{b&JLYP|:< dyB܎u9wS7|7lB1춯4ls}_X.k 4DV5,OyӹFF\OK:dm^]$Sr%Auv5Mp+qh[TL:$އ G,oS2b,xsYu9<%HB%3/EOQ~oS7Lc"U֛ DMUL7 g<dB$TCj|n~r V"Ad@:t5IIK1sf#Z@^Jf}_vzw\N^\nP\i*q)}Yۦ<$[+t l,W=gTpƑ5g`xI}`ʣ$HjlkDOn8-(;r|4mBԦfd:^ݒDx% >5Ew%D'oΩ O(ƕp[!f,t/_E|ET/7Zufd?ڱ_+h+rIUb+(M;Pe틸0.`293>]ItG`OD\H2& ?3-6ΨfQ8el+C_nSJ{QH5aӁo7K`rr!@wq^#-alͿۍUn۞*kY./!Lw타+h,v>eri1[򸮅|ɐ$TsU銕q JĶD}_3ŁoMѸDPU@ۦFY[ UHZ@#<)Z(OjKd\]E&{tWfxKd{(^5ZK(t:7 Ix蔺HLNw(p,_a̯pߠx/.= .X> է<~*O=>P*=9D\D1VLs~b=ecH ']ؗqIdW% vvh v?.:Gd 7Ci3-Ǥ U\UvO6aU'H!lԖS1 ;5Q˘;w K9F3Q Q;Z! $(k|ҟ>E)B`aAU"(Z$6  "6<}~fWH*lA<:JYծsѯFDц,Bg|A8{F\9"P:d>_աKe"LCZb*bIuAYM(jM%0xcKd:WZ"dRc=D]nMAatFdLz+҃[M,_l[)]QDєHD1¥Kf iw6 Gpw`&nNpen>"ճS+" R([? 4VnS!- A99jWXq5бƅ7GxQrJ ^!Gc5]4 #WsQ۬2q"RHCc9W4,RǕt\7SҴ'473qW3C-Xւ|h7˿rW7H,X \ݗ% K`vaJ&XJm5vqH ֱǙ$%Y4t9Pu{$cWHLn |)(@N+hrv$Ai>d lI) AEDqĻdN3L=A7+Lp+,wJ|ۓ7K0j)!, :+2QC.!438qQoVDW0-{)] ?tKE'" as8AhFMjzÑ*LQ!E`19p{74e֪'5PXR!ki(}UCiKRpC-9,- 1?欖Og kŷod޷R;69 &r?<RofE{tH%׳f@^ϑ']Xg.ol.+ӯ8%{R<ŗĸQe8FsrQu] o2UVT%(b`7s;:s1–p~9JWp؏lLVS@V,GSĪP=Z UA?QXa,Ԫ‹I,%{$y0 eu*d(!f5<)v% &y ZPj8\.MQ=fLEbLN}1EiڿIҺڶS'q3,UݾHMΞecD9Xd⸁9^{}ʔА*^H֣1IӈlDʕ}f'ǿ¶L^{McWiU\5^-r7בxGNj9#קQ;5A;9v=$~;-Ԝu&fH B4c8,&Vv䗘qiج FS""J>/fV9+y)XUJ.-dt  HV+|l--DODٚ9 atTVXI#GU^`,8n֢ mKtbN7cf&t)>w-([]{ksBf^opXzD? MǢcf4hhgm_%KSE#Ёs^U[jJI؉]2夂ѕS4 w?i>WA-)pX<*.Ø1E\K ddi0O h[O-d3\=T`E_<;oaj"f% SI7S,IFB36^Q-}K(OWtaR_WG|I,)Z(>/vs,mgTG6)Ƅ_$/Cu4L\PҪcpT䬶4"h׃n /ow? *CgЮw|r|VrR&%DiDvbE)Am3wopvV:Rn.O{i:Δ =Xe,Y")%8JuC֩.^W{ODhzPөKE3%Wؖ_$ӔGRcДWi]Ij+,2'UJǦP@8]12hB| :K*K_jVdIqiVPֵEfYHKbf(VQc PnPX|e-7dz'a^G fGO`9eyO& T*\ˆ'Eu5t)h|}U}I9l.}6 q tSs4<@bwF]@u?@F*N?`75o}+2Eav'i`ڄeޠKp&w̳k 924w}+H7C".= :~@7ל&=Oxڢ2rG̜TsynZ=𢼞Q{9޿jݗᶳ^;=by8d*;3b HvkN"}S-74#'ڄZC@` NqJ) # )aCWlUʨ.?X?{C!l Nsa)ɖ=BFUb]߃4[+szT@Y#Kc_n)JrVॆ˸C력6bǓx<7,9r4aBE6͏ e"@\E2{zi$d ?Ls"=m5oQM'lj+>ָo턈/x}MZOzZDR/'Ѭ|vѻt|!:͇:p(V/`AP ;X )OJ-^°&{akO~_cP* =OM6zU4 eHycj?g=W.:p(#ڬ;*^!@si?dy:bY~}T}{:&Sm/њ1CKhePP Ep߿X{-Ze4VМ'1hʉ\܅l[54KQA?ԅCÿ/ce"iSĞx./~,RhF:*K .Uҕ%Hg<x;CQ* _ꖓo es*ez&#lj&2ײy΢ïl& /6)r:#UK+.v y'Dy6b}> X=qr:' Zǐ}&LG?BcR ~bf#/{$S㯊 xI. e6yVɟ㚌V΁ } =D B}ӕ?V3*q"Lo̷Uљj_rЌ[T>k̼?Ž'P&]y ErKudFq-N@(ǨF`Jdj*C~g^`P!SrSv׍d1'#$&gchlTǀ(~YHKݍ7nrW{jRRHw-:9JΕW!UKSN NTF1pn:R@$*|53%but*d‰MI}S[7~8#oEUc+ ZI̾ګN;(cJ2+ $:H%|c(Kf\pXqM ljedJ[xo#Ltf;jg{ZZdd}ݢ{=謺]&O)^N)=u2Z>Bw{SF~c`:%YMGM#Õ@v,e tɄ3|]"vVq8Y'oL*HڤO4,Y !ۅ3Ͱ2?IJ8w0Nrg} ޱgsw:oҸ2A 3IwoGz̞^ui w* J)AmDPKp="K2}mF;EB T VǺ*QNT @00"uAǧ]*'S!.NA ?0#.}|G <ρ"O"Dԫ7^~@djTQ!m!G~ס*FF4W)&}yP/6ϟ*$tZUP_18G: |M"C,Lb;.; Li):K3~ߧ_IaW9d{/jHkUm! l2vʏ5zf)-9P-VgRo~5G&Q SGJGZQ0~4v{L}p05Gًo$O=O(ۋt%<!慿S',LB>VViLa$)9F#+Bn|wveMMY P.xEAꮍbfב'4דS7!щf z@߷0t@V';5=VRH i,v(i}\R MbJ A0l)bi/ˢ_\Pm zhL$afR–lV9}2"1 RMdžƥU!K_Nm'u7Sos-GF;H1Vۦ>$xz[ $ N&$P)2[̭'ʓ&MzF{7m-TM_#Q/䔢 ̓秗>d'ZMaltZף M`#ց!# 1)Β& N{vQ>O7^t!3-+FT 4Vn덌{4Y|f[}ڪ-`14{" 23I/\!.:O$X D'SoԞ6OcVcΞР.Bi6k8p1]B^"Vj5~Uz=PU~"o*X;&.Pw-z]Fecm_ҜX|ȶ(7w@ TD`N%;kZhb+_Bz WNq#f2 0ddxLU*dcI e_ס,UIC7!/+܈IH3֣Kw^\"7 1A&PӅ2U$uj4j7C}Jق(`|[&}Հ Ue{ۏ+|ވ$V<JMp_s}J.CsF?K)=*J]&-H$rL&=1D\_us)ri)!^Ű͋rjZ _.kԻwJgzNE([Բ#M`=Ik yN! SYʪMiYmh_ҍBL񍐮֯-Ki|T YA A&V%p\{6@Y<2HT=Yt0FME`[nt|"R'ʹe[j]xǸb,2=9v,}(~ ֹoEC{O/Mʢڔlѭu1/< e*RR ؚй -/Cd$=HA%^uWVeaZj:q:(kspK 2yNB Z+fTƤS}gs!dMόsQ@ [z{܍,yn/rey& Lڧ.Yek[ENNr:"%\&BT])k.hLo]S7=Pzn͘ppu`Ճ2~ ѓٜ$j3c;&hXITziUnN oA!Kq9X ߗ뜲v? a-Twx#xW 9Hxʚ"ObC}? U1SLnY?TᙆBMөnyCvv^]Q  9%AIqE˸KoU-i1ԑZ%ܰI*Dڒ۬`#,d?KwESaJUe]8~d%FSh"sT1,Hᙘ&}ҲZr#*UNС{_u{7kHIN2@!lӵ-p,L|ԗ0,N@/tX"RoYґWRT.hbE-@$dS˟!9Ǭ0Ny皡"fL# Դ .@>C9(y)+U'mpᶓ c'Xz$ީ&\2#Dc8ajZPT KK{ͳ9#QawS$*sJҘQ;`ju5 _SfK %-O) v6]dЈ48Vҗv Fi({+k FxRbCqO^ŝCDHam24I_cJܫ󺪅ZZ't̵wPZQNBW']PZg@O^Քkkh8V#< Q},L$ ,\OÝy,S*bDڒ(7.1"H81Ǡi^HdH_#;F)mBwmjUB"jWn0 m!fUH$GUl>dr]Ҏ ~bb/)?o[v)@-P܁]Pfb؛$} \XΖ0Ǝl{=%0Ϣ6ԁնs̘v+DS{zcWјrAX$GbFy=շkkmOl̉bA4FHpg+_A #-8"~e#V:xJ,Q(Q3g5$KE8;M(}JyM:58ÃN&]n7tq|ϭ.^%Xev_,m,w&LvTp!F(jޮqTʞˉg02:ι 4IʬW13K)B\5,B@M–X*ыxQ!Ada5$c l4-\m !'s;b&ȡz{L]L7C?`IN.rw Hs+B$|v6qƆ4v2Cj:7"5*2d!aLoX?t$0+;tU>:Տo^凭鈟/-t`74£kD$~xX؞oANS)8;?qR308kdD "o,NF_FK|T ` :FV/ry%kbF&dzOzԱh#<2́ZAzK$~ΒSHܾ65]b|"O~cL"tJ,οmC*7\kt I=?> $8m< ͤgtj9i+`֑x%SJ Ӈ&S`D9̀5D.=&5Iz7%P>hĺh!Wk"芺!K!UrR9B7PCӟN^}:D Q+N@4Kb> j*ϐ<s%ҵ,Xyfna @, 5 1UU޷E/79&N/qXeI%n}q)>p⟿ev> |NP1'ӏ Noroǝ}ZKk,@bԽ+!m9w(U ӷj;wawܐ6XqJ> mXEp6|٤ٺa t( w+7R$Uvy6\Ҝ C5E$`'j;̭EXƽT//!NLu_]O%^\2?){N;^,ٖ>g,8%1F LZ隰͵Y˗c' #?w|:# EN`llc$c{g dfOk~񐣑R0W!| (dѿ%"4J56Kna<&C.GОTcP򕣱GZ ,>Win-B :C̸/O& -ijsEkx$np=c?KQj7_1hT=l  ]EŊڮ_K] ,a%>pU`Z%k=tӑ%\5QBOumYLͶ&Pp=mnZd"I%g9O=/8-s/+r)!s) ]魘V$ZO}kaWgrʰ}c`dЎ 踴`N ڭ 1k չ~3#_z- Xv%W2z[Gǐ?[Y/`GٍQXBXKJ'KR24$eP'?xOD%r_{ϟnM[WGgRb`F_K3R`2ذ71DCi>}}HC 4Ln\w':0yծq~a+?\bGTj;?7;%[9d:8b.d8#y v^z^x^۫pp.$0&F1y5_r^<$hTԣ$KkɽD C4hYW1kOŕr/mPe\pZ^$4QIWuBn_<y1a Zq-9BXߩ/i4.h%}qdͻt1V#li3RZ4m !VZSB4dX&֍ftm4Y)YrAqq餑*+0V3 ַhv8b[jrC DֹuI^@LT˱1 sH-T5ʘg_'݉s/,~*t^+j#%G*InWp/ȇb9hrVǙڿ& wEgIo}pb9M$TJ~K в$Gs(&zN4c [ǬOڍys*҉d{"w9~5g(ݣx;q%LPETs6S6N^5  B NgD7"޴K1Q],B3TOS{g&~O&o*$Պ]Xk^,"F+[3 A_?%IR*/xhR|CLB j%+yftՋMQkIGG1,m%pjj+dwr!BFԛ`*eަ.:Z-퀓4تN⃚|yTb1my3~A5 |cfğyy |I5Hd K6 @A!lJj7.:HXOX#?6IO%@=U3IT}s= bI&`:C~:06qj|XՂԬ2gqƒsiP/;if:qahqzeF'^\BCd75[EVpL$hɴk5wߩsRw㎹>).Ù"^PeN HETpĹ6 Dxt1hvZx3ƞ+f@*ETb>x04 ¹&݊T>e¿L]Q-ǾnT W&E]33sNU׌ߖ BW=XJo%~oIk&}s3mUBGZ99_5tYȷx]%$-'s"{OH僾-k+գ/uD7OWzg2prE̔e1{1no yIS@;15*ʅhɝ*O&pyµ)O􎨛N9p QIWu$ #cMh+LU>@3O?qʙw[Qc%Qr4L#N!6~4@wW/L~j 29bM λ:h9%<@i ?EK1[Mê,)>c&Q *R1}E)uXz{>i|٦G9D@q7F2O}[5S٫ҨR RՓ pE5w,ϹB(~NK̄ fv|(HKbH4V#ep'Jf8&6%)l)Î΅|)yY6N>'|-1m3^\%[wXF2fM\%1({5z$rMyzx6$r:`'NV"X6WMe@l%[!W_Ѧ ѹcuMw# 7jS]7HA=kmy77 ^lDU:+WT )z}?i[s*adHFOctsQJn!vHݜO'Dltdk)󄡄#HVfіaj!" Of*>/ vLȮ{p&t] L1k "*\gi⏇ɪeqA\bfb+%@@@yb-G+V KivblnRN~..: V+RՖ!I)Q &2x[+QlZ#bY)>f|.cT|mwgmcn^"N`L+9n穹0)&7bޮ3q .{V-lCZљ];C7@!90KuҀ3 -}r0uSԒ@2W|a.?QFW8^~m CCwM;c] uIg ?Aώ%O\q/PCS702xM)PQF&xM1 XXlp8I"Dce9lq+)}"J@|O')zv(d~l \B߸DptayP; @yziFU@-UC}_&1; 1cYL*^ z jO{E^2D^'T /v,q,q])_)kHqnJWۂ2A#EV3,.}lK8遮:nhׅ適;QX4Ȕ À-jhz' ]210`[t @XC,vRPW*zVu'/"AfofBeѨu(_,xZWQiV-8Jl l\`VkR>2y=%x3*"3aʾ@ѳ]VL30], 1|I/wX-{&Ro\8;yEX *צ2<<#tWwnQw{X94a Ka/#o3#Myӳ{!.j>!DOACBrvU?XW8.Ů I?Kw z°& `'G] AkgۏB YYNou0?6&+]3yql1 t+S:m;5DSƨ6 I6N8:%wz  ECוMQ0Deqy>7<˨IMuߐwJNhN`3+ :!cmU|tП>pBd*Q" Ysgn`$zFG!'p^^;goiMr#g6Efd 0"gu#ChBuf\ґJñ򧒚-ʚnyȂלK1x2ag*0L h]7uteiO:<ۅeJwL=pdGܬmϩ26V4̢ښ {IܰwHy.2=a#-N;X}CAWh?XP~ӄD:̋\k@UpVa =p"FwyJF@`bIJw(Ѯ \Nޚ^M2SjRAPAؓyo3b1k=I&'6bQƉ*W*.nSI͈&8Z'n70W{oh. KLM54f&+Ouێ"\ zمEÞPe2K. ߸Fk]_;*UM71?yTrK$61gAF61~f ݏ"{Fx_$R\+=8wmra1xʓ_KplD=׻7A+޵$z* <x^ ه*2l* )i4Ov4 Կ5:؂ΩѬd>JeD{c]_K<@Hֹ/gԄ`fFea=sDަXT(6Fc[֌T?7/nps[8OvtPt>vɑeivO rzhܯ]bYdF|Ϙkv}ηLiSE@>7k%îԇTn} +9='Jaud`%cl~Y' (ʄ +o|Ԍ5'0AdF IBlK?~MB3(:m^orWЦ9*]sچ\n^2ڿqs;o<,~s!nB{2{lOYtsFT OhFW[!FM<{j״O˻RDZ"-Ap#f%qLᨂq+D>!e (x%!l W4S#3ݳۃ^Ed"js`5Qr oV`+#Rħe]0Wk zcm7CBs)?.EYJAa٢"AZ>GCfptiym g!nSMRG:ݽ训&!:|8BТ&FzMn1M,|Jv S[75eOALՂI0%uY@>aF鶯JiK77UQE¬i }m?iyGYC`j`y忻%pD}xO*OAš9xF_u{"Sz2 LiWF>no} pX"fS)S⼭E9[g&.q0S#KrZrMl=)^_\b*ShՍ}= e!$~st.f#2 W\GaSF[6V‡BK9d k86cA^ 4At޻. Wiy {5ZvE4@D6CGs6ؙskd`u$үչKZ3'G 'P E@T\G{ע8b^{#`ajpL|KEjq8KO~>Na8Ga'-`c PN׍ 9AzAZ FOS-'bVKh(zD\lrh"  .ҏx(=)Z8ˮJ;Q ^)CXM~G:$Mb7@atlêF<̾ ) qDd6%ϯb#kpdFa<޽Eb2mׇ(zmox7j`_5jxYn+x݀l,CP_CV>VֻEA%䷏K9DIܚSP!ItWT?!#l$uG ͑5ĤNp3mwP}n\R+&<[|)2H.CAycC \ @^%D)e]uBiv#9D3j'+`T}Us܀vQQHi"JBɃg䳹0[)B+)Ih[p}j~$6'#MP4%HMbHsSxOtqFӆYVE*?gsbWF(؍cPpuyy"9@C'U9B,^*eg _^!CdA"?0 HB}@OAN3VfNYQZСb225s\`ĝ \z]Cl[Q&H58O NtO\K}Hg:'pajS;Pa,΁*ܭXL큡E[{%`Q1WVyCe .7a-)OB (+_r`o%zFZDa N$hr#<{l`tPI@ֶm \,]w-V.jh!;֩wHA<|"dnZ7=v#B~#qqzW]#K f3eN[8t;1_gFHk cnZXy8H%XUwt_p$7_lX;䚞ų  AGIt0ƵYkT*C 4a"Gq(0Vbڙg}iT|+s{~\'w\IpglC3eKzMR"0 $YlTY@!{g.w .ꔈQf džڼc#@b')쑠B|i>_w ^k9LmnU~]'ek l9mBB(q0_3ѠHl%!G0ehBeҝ[K]&0R^ʩX'z#U׋d`Ͻڐ$5N i:& Қ/AdRs/ʀ%ƲԳww`B?h:1 ȭ*maS~\R \g>nGDgR;~,n-߿IPýN>%$~7p'E ɇ 0!:kXPRV%l3 >y*jK:oRLMl}@t!D< XQ a9Kl8 |.#h$m0PuAMݡڭBy7A3 LC89]%pB-}0WO28^C6ҽlXSGRrRéYA{k"eUg~YذW$z05Vmm(\"; ɫe& w]3')3G72\H,E hGZ⎁9xY9q{d+c^U3w?q_ǯT40vR]L1so#@9 cYxoaxߍ)rl6W0dXN#x;zJzZ8ϟͤ,4 c1VUS2_ Pf{~"lpb4c4 q[&V+,ݽ#l᥁'>ci܄ӓoU_'^D!ۑ@МFr j,HskvVc>u|dkVjL.'zdV G6k{ȇkOɋefZXv,=]e::btƅ^-!e oFd9w2ƫ{80~āY^: 3"cMrNp1i 1ʢ=@mgDTymBgg0}轀G&aAs;|X\4xW6} }I5g@X뒄& ȠFG]37̖ĝ6nW,mq%w5[hWyƗL_zBG KޡNb5Ҥ] }}2J 7bb ?E+nE4m~dn( Oƛ|Ij1bOth]l2>d9.vCidq^vALTU@zg?Ť$sB dgteqs3TW*0H\ox{gڄˍNbƤ~ˀ]l"S'mIh|+ H^Ŵ1^W1<ٷ7"<ys%rW.}A0wr;}Vj9l!:'OYGڮaAT]v19.86˳N]MŪw;F @ E8d 7ll9@ӞX^&BHoɠ/3 gc2[?fo NT^D̆ІΒ~KR>.}9zfeOf@+TMLKAo :O,LOZTtF\3_=eRv |h5ԃLzX4ܔ)7Jq%#gdgN-uFF5}3'q#dn6Ϋ|'_=>{t9At :?,캄?s' (cPS>XVa10~R W-[D3Jfkqٚ:ベLXS( HbaA]2AKbg37$ څXz0D#ڼc`e#N#BWCMt &zDo"D[}0g5,Q{"fkbZrT} :< s#*)P=Z3 %fy nsLPLU%7<>rX (+ @إlj6cI?sǛC ib,0OlV}۶='P|O->{wSN{G'5#EӔ\V㥂##'y;E< LAvE "tdi5^*!w<-ihT $N>D+XHQJ>#VuI/vL:ȷ[\\ f`fv ֝m7ܪϼ}]|S$=]v֭d{b&t qONl?#XM7Ra))MU\\032wg$2B.cCmNQ))aa^)^g"cP툼ŷTbծ_26rZP)MD0@,UwV'eNayR\^50T;}vY?QJD`ټDfmk;a)j6*k$JoSN`Nh* ޲1/$:IA0 \Ԩ nBt/43|6fJFWW#<)Eyˍ.ǟN(U{ڂ<#wP>YR7 h#"ib؍z?ZUU*Iρ 9'MJF @|\] u|j|`@gp%, 60X{WHG>ދ27R`=cu~:Ȃ%,{J|y0CARg9r;tf&2G=%um#4{7f24|8*cT鱣!b à+ a/@E9 K1ж%/@_E_r@:rB9&/-0S[jIS3O|qbO;P䑯M+#X}}0`kCIT }B.?!&h)+sLONhVԷwg3-(9qlIe=bW ?5| rQ,mGJG_Iԇ'g-3vm[oRD!~AI,WSj#ǵV=VR_x{^pM`-8T?#NO^CdIJ82N{J= z@M}F~Ry hi/stm"J*pCo}xIY4o*0e%qee[*Ӄu6B _yLW˞xDg^~"*t 5:IyjRL:Q ̨m>e=b%BÔ8In5ȡk=ЫڥI}xI"_c*pX/ߦ?T\١xfp!?ıPSI0 .@Wٛ0@DOq=?c>DfDʲZJxB!u;[&3x#"RkP33w/{.:dlMbK,:ۆ;DmhFd`E KSt.?gog0#Ά=&6jW*T,k'Q( 'm|#V.%@kb $q!]1aռΒ]O\/Τ" C 1Y(6,Y^'wxK9 qʌaV#2 W;Mċ$ ->Kʇ,&v|F7T:[I.t%8>>-0'&ȟj@I-ЭBBj6b1+-ڬwC%5|Dtf3O(H=>RF.eS(ۥ5G̡xƠ"3v6 w?iy(4i}~76v*f}/3b~b&@5w9X Թ٩C-Y+WQ}׆B4kږ7L`zgLc{;6N[H_bʉzᒘ$[`d8%PBœ-u>)̫2H21@9ͻb>Qd7fF͑_]23Y;ŪVxRAfKLt+tX\g?jH&kűUV5,JbDE^GQMZj mBbN:8JcФ-8/(fɆU^ZXҠRW G暜 e`75"Iv1M1'-k)/+Ћk~|: pz 8P3:p̯vi8XK,$N+8C8`)`%.KD'AJ}Hܛ!.X17رnKe(N'X8tlww-IHUyAp+ Fwdaj-` )ˆRU5c){[<ǮbU\GbLllqD,^oЎ06J\"E 6{uaUEa{/ YIzVSeBEȁ?øD){sc[k}i0y grq:Yi0Ip|)IO<'4+%1uc2Dq$a&WnPm\0i(v #hr}\qaBgSWjl_okVu !ݞ\x> &8Yi }JHToid[fWʁH2'n)TV1]|c,l<Gg:M(}aΡʓ폌e./y`l[۰FCjٹ5vh/&;7]m1Ur $s@m4^Q!gJJC,t6رQu5r;tgb5nRb)߯lu03=&<5bBkTᬘ5*mW6&R~bq:֑,xo<{G<{f;^mtto{s &ך~61u,7:a^Qk 05Ӓзuwc0AAѾʌga:^L]OXVJKMKqchĖ@ނKe MP kqCX`\0ǼP&Z 햇R|bvaSǴqnbTvfx%ߍWf(D؉!d?_eU-dcVNς mjܷdH$`224z׶hwCh \h-Ɓ}e-g_<VPΨsc-c!0sk0bB+@psN`vTPSVy[l2cjZ&nW}u~-Էu{u<2qf/+btܐ-2k6@hR y݊.fk+Y(|!QqΉHǗv2QYP"Tn:hGॣ|z? \N4.|8B;oM2=a'BSb!aH'9,+TDO7*O4 _4{ڇK4h1ɬc0Hࢊ6q)M!mɩ] Ȼ.MVt>lm_j"dbOʼPY/'r=Zm IǁTQwƃGϳĚRr=h4%Ij\+"N40QesՓ0wK_SH\^v8yK%ʴy(U[}v 5)S +f1zGB|B"t=lBO>uݥNVEMne=`9u9Shg:s~vR d]l \VW-OB4~A%Sbq >;h[QӡQ! 4x7 pS]Rvj:&J򴫋#./z>14eyPZk+"\/.ܜ:YBkj2ZZ}}0aNsҷ* {\. 1`rV:‹V‡˹ܢ~#|I;tzW_Bnb'-nxi!sL r7<ͅzdՠ s?r+=Dʨq>ueKnρ3.M;]?bOp(J JD[}h_bh hK5ܫ^M ՕdI0 *L(+-S Ti$RsFlxOk fPBeeHBl䟩`(#ezj>tkUJ1<2T :4[3AtX4<_M䜋|3+I"J2} 1ji :iR3HX.#9Dt2L_;B/&>U54<5ԍ}RPqd7NמDP6[Qoyos$ڠ]^Kԡ:&[V%Y,eHPD߼hJLyQ׌W(m!ujJZw9_">z,!RA~^ъX_%" v(~Y|i^L|,dnl(.[Dg]!t' kD14RpXn?w%0}~Hv"??O6ݝ'Ft" НBovTpcTѝc9YaWoS~S[a񬗋p+/a2'eM%BnkdJNgL/R.,x-/>U2RR@}Qo; ~)Ɇ^0^RF^84xP32d;_E?$i>O(MwUO[]=hyx.|* 2yw+/W@àsai#`FN׳ڎÞ96TB$8QRމrj/姝% +]%wQ?W 3HpBxQUݩ<޵ą*=aJoLXar}!AZwF,=%r X*Vs!+fPdВ fe*f5 ǴGHㆰ|ND+X!Z;x&hv I; gTe$s~P1W ;lx߂WqܣzK?ko` qrw'I|I^Q C`fhR$&2HЗ}״)੃AuƌN1^і^)z]p ѓ=,BKh/ZU($@&SȔ6r[*r!Q]/o9ZōW>wVlffpC fX\+RTsAA}[.WUߑ!ׅY$ܶ~/EpKۯoG]UO$:܅چozXܪ'|p_ o˭Kh"U^`*M7bG*/_ڎ;pzA`]M trs/ۛgWC<6sEDu By;(ܘ3~>9ګmbjQ Rz;O͟}$` ]Z|MPHE Y}OxIJ" R%M-kI^p3=Hm8TfEтmGP[*zp MNTb`AzpB;?1n;6~xppfz~B,xp OjKQLj8ҼA Ś:RK P{^Xr^c!GK|ϞuR/' !iq&/ZEC,7BXkBDN&:n'}^| i!g>Ē$//u:mBk'k kŭj QS&ʷ> D)<)ڊOJvkpMc %Ivy!=>B&&Egv.K}NnHN^" ^'ß2,! PSPju@R;S[BZc@=̙$w4߬h1l^xepi/PJjN:VK Zv6tu/0Y6g$v Ũ)>y=&ȁ 7}PY3⁃#~0WPbmB{̢5;P&dY%Fӑ #\Y}4 6NX?S<6y|΂P^y}^xq:y|VIH#nEW֋*6 y C=p#\H2i)584x%j~;h8EQx9C@҃!#,a,m`cOj8Y&<}r" X ܡy!-|aڗ&(֒RGF:S]UG+aY*H%#kl&@E-m!۶e sY"ex]Q%K f͔ەF .(i=g޻Â!9LVzhvHeG[[J8xkZX減xA+FYp^wz0;,:-,3;m#1V C/YI xi57(Xunp-:Ɲcܖ̈C [F}\ ż _N۹ [a ?:St0 ($9W1OG8:zS D+~1'Æs%":ٳa2~HhޓznL ); 6K)PSd)Ž/NQSsVpu:=)IkᏢx^vEN\;mEڛ/pPP }Y{`#c;`Tf.zt?_%.s`bt?a$Euz I5 >68kr R b/gL1|B08N9sp_C5G%09$ i38,TqHx.’ʳ?͐$nIJ.FY?<|o;6igcR_%+=#`>B֩}rRJq**yͺzM}ӌ@1de0(a87z7CQXt[]2"j3=*XRøo@}BAFW^0j.K!#6nW7/CM(}xj OUe&-dEwf7tﮙO&ۦX;FRHFwxt8fM"6 TAAdMG816,t)u\,N]\f`"2rzq=DB yM/\Ͱ!$@Rd&dڪ2 cyG>ް$*%AbFtUr}p\a'mٶ/|zDAVtCzKHv [(=l1<`68v IE!gA< J?ZL RϨh]*^V=$q_*3f,wfderLuxNCKᲴow1,l;5f]㲧)=3rg'/09ۑ#d: {5EX![N, z r cb@RFjZɲaK~qt+WnAY1*U8>1\ҩ-‰ yK6Ϸ&˜NpqC0f12_=f牉&%1h̦5;?ϗx 4_0kLݰ;Z7˷&{f f^HG?RK DQUsm-1x>>sQ^]7vg]zXѲSRO:V- 1F)Bύ O ei"cSWܞM/&Gb:n &K+Gbd6&;E>)d GT yBt#RQ}{huop 4%Z?;W9]r. ̶'A>oB 4,kJ_s!&J|L+FP(t HZ7(kE(G׮1HkιTKbȈng*—WoB 5X$M;+w(wѝԙz]j-cy׭ĔbR1qD}D^։g.@-l良ڙ$&?nЪn+]AePxKZ3$_S%&RֆR}b.Q3N9K?yIjf(Y{qGT_2.E~P`η#R% i2[1P4Y,/ l֎ :>8/)3.&F 5-āg¼8KiJP߃,eE KR&iSgm pD UkCLΥXOx*mH_kHujط]A/jK|T@ L.|UиJσ7!Ȁmr]$brOG3%pϟukg3KlezD}$MEmO ȴ|D愂f&Ih~*Ow*kBlϟ\nΤߢ~F6b6yz؈xE~O-P (@5Vd(d ٛ0:0|W˲M 3eԋNͶlV{5Nף/MM3_8>gWmӡؐZZLɥ-g2T=\@FQb\ eMZC^B"HĒhdJ~ȫ'wݪj$ 1k.7(żάU&qmC‚==-.eᐨt}W,g+C𚳣龷t`[r*ڨ9-bCvCF_xN#4oc<lgyҎJ*͖5iTddRVȆ%g'Bt3\c7~3 DN833S^-;4px 9xvص^,8{yiɔȆqs$2Z7$1l"ݟ OӷJ1HM`'2R r@FZ޷9Q@9.cf8 %ĭBPa38"N6jw?Ҽ)k`#ݲG8mm u55,p>j}~ю aXe,SSyNY_ -[Cp~)%VDwlϩS7нjol00҂vJiU-_z^֟7&,_QX%J3 -  ^Ne~e]|=2~ ULFQvVǔdrvV Li[NG|>$s(Ր܋[љʓd`Jt}~lFS K{\M{ N.n;zsA98[4lBd2FjqC^>h< Pڻ56ƭD"1wf5}NHInK{ҘC'?Ę-4O0K[NW%y3ق$N\ k1+ݖ讁q<ғXG8d*q0II`fQ_ b4M9@{iٕ@մ%XGv 5( .Vn]/*>X.$K[!=d)Btj#DFPֽGTch*5MXWޠ!h Q 4^Ejv2n6nf476/b(߱ 7Ζ#&u57Fಶuz%gY4JEN&@Zn\/$a}Hc;/-sMN| 8pcSğnjn#Чx靳J]bwq$e>l:1a  o"]+hpj}0Gc-nG~CEupu9Fq%fe]6ֲ"Iz, P$S{ S|q"=Z%i՞49i^DgӪ'uqw݈̉t[J$o_d*ϺmW:fCm9)Ǡ-.t'Ʊ3CUu!BsQ܌o$zYo߅V, D:r.uj IW҇uL˅Ѕ? Pw+'!a#U#m֨g79F$Kzqn2Hr 9&垮 ;)=oJqDK'¹B4G#ΟXm/lVD[1b"D>9*ʚ#  }yq{_  w˘rZwzc u$npos># e-E|ʕהS,{M7-!lK C벻N2د۵4oQm @ԆY1Y,0q @z)w$魱lE,N1UA4e~)0;@ORh7.TK[pp\r-24[}47\Ÿ0|8eǬ{MKmL܈WsrH8d:jMKQGD+P|mf0H]fc}oyo ՇަynAGKB1,m&gc CafJ4$7K6&۫1)&qҚ!& 2.i ^<)~t=mjWHT7.è]lQL$U Jl7>4c] (@| L ƁoeD00w+ـ{yHE5Mчk9Y`7.?W !@':1)Yli_E6aAvi8~UWX֕M_1DrV'1{ Ic:Һ\m[},n&~v#~|qF`w]o>)+3cQ2Hԯ  ]~Z8Yasm~O>͞ˎOf)њ";ovQ7ѡ AOT[aW<P1Ny&èƖ;#d>I[!T~H;7V(͔/HpusD]FbhH،B~ {2KN?[Սױ$$Pl7wY:w#66)QIl¯;SQpħ^+?7u1-@P(Ժ{S7i켥RL*t'ݷBT64)@O {Ė2t O]',WjnNߘ7}Kږ~ހ)U_GL$ ~=mdbMYBlN=RCLPӰ8`8t ~A_& Ѧ tY}4,\;kP Z"H'$Z&UjTٹf3]ρ!sڼ}?r$+ؤ c/IĆIaum[ :Uvx2NP~Lw_8F9ǐưr1ZP(I hXYxn34o+c;UR7aO`Q"ڌ1/D?,IJ. g#|8by{#)?hqm31&"6^"RdyaIg'qU4ƏQI{8OVP\{~Uf~هs>FiG %0 A3ɏ WC؅;5~*!Q7W\9/B^LE&J좟O\pv5EOIQa|կX7?|׻JaN-֒XZ?DN\qT vO1ޕ g _Aj(ŝ. Q9qޑEK~8qf \xZ4|VsLbv۠C+O?կcd^-^>e> }tw)YVaduĥՋ}0MsCQ20U(Y4 #&p6dʤm#qyq/ 3'mİHÃjX&yCh7Jm S%ՍRd LH Xlz:2+W\g$qdi؏(T&3̑/b د!UmE> 1rkdmL\."$stna&% VoR˼b^-wh-zɺ}{K3 BuSk!s$27;ܗ[JAg~{`=VO;5pM*h-JRPel3#pmc.B2>#.hA^};n{ 4EpBkGIHe%NFc^؄h B@~ _8\h aބKsm? 8*cqذ QKu)9N}p8`/ U<—l-a#_m+ W!7)K򬦠91::aҸ>B |{<3ϸAUO@dܭdYܰp0k*E3U#jY9,9@ڰ6щ=뒘k]DjQDeAճea9I`Lٛ %d4}! ]6/-AV0IBa T9tn0Aݜ>Seg%g2 ! B!VL.zeo,n8:@71~Ȥ~Ř,x !",ؖ6o[~^g#Tw6;; R$]/4^t2pfC _O`9*ਬ+ZʹtkzNsx ;Zldݼp#i]SB5)&X#vzλYգ#d ϼ>{ 6E ZSמ'M:p 9ajH`.#+Qq/ z53QPMRC雂;]3܄IOˇ,iR(& |Ma} Y)h{fr_ew7oѴ@txx??\LKu`G]U'VyuΛjį8 إ~dըKŠQz aΟ+l*&[=C~<&cwr!} >i9(uPKjy!cnQbdRqY<Б>!vQ "v kqע56g~7pl@(lnhWfQKVTRd@b#ٍ5'\:KK5҂= ZHvsZcɢ*ِؒ0QX#<X1́B+cVQ1Xz#8.uiC_8dsMݏyl|Hn o:*>W5/RkG %X MčC-mYrMAFS;rC IfS'B,@zTآK"7T쏃w[LPJ0/0G]&A!'S8etEvnls>c1z|/",V}e M GIXG;D}O ['3q?!y$|@5YXmŚ%R9 6VS_jkM3n0 a |Q~,*"X~zP$V#[nvxZT黓NIN̰;J(gW!0NdEs8RN > sHa!iv)r#Y4^#mky{8=ϲ3y\8 s'J~ h'$*EIB5 K 5Zq[91^akR(3vޚS ?)w1٘&6!^> XGgוy{b:Ũ8 FtZ- MBm[)`7E"2l"ҨhX _C╇g- BS{.B's3x1 18Ƕp$i!$Q>:A)b^:aj<Uob6AU)BD/x:=Ȟ`7$m# b}Z#zrH8! *$Hב?1GzVGEI!a,gjC2׻C^i :d$䫃Z&CJRB"pE8L`=ov@{sـȉ, Jmg 蔋׿>*WA΃`ܹXElI5eqv0jeWH/1pݐr^kX#A[f :"3GȵpӽKWhwe퀘0Zĕ| ,nz(n/AYr$i%tPMbԨ[K=K!e\M-g7Uڞau:ƺ'/}+Gn@-jkD2EĦae1޹RZ5Rp 2t?QEN$7\Jn9+U0̙yA.J9rwề?8Zn/Fq\XuA}V{ kÆvo_ZU;MsDJ q}=$"TɞA;I5T~Vɰqjh YjBqcʀ}[h^%P)ݤdQE@] Fv` 5sϽenX(%8t\wPn+ynG>;d_0zp<:d:v-^!)oRO(Q)*{U0m`mnqQP-)Qݯ 't4<;n$R_:̵tO(Ih6F Еr;= xJMȉCΣJŏxJ=1DN{=UzUC4x -yc*HmoEk*Q\GYJU3Rt)$7{@ѽdSz+,Y뷆$, Z#TăU&!~OwJؽ!z˹Yyukc&aҿƱIt `%(㏳-.+Bш/!dq򚅊i T'4#97 C& cdNaa_n59^+tr7yjQ]}p}:ef{& 22Ӻd7H :6~°L/zhD^cB-o#HKO~cu}*t9d|ƔE1hlsؕ+PUO%4ljrI  D'/Ǻ9o\E@0f'Z1?X:"ūRF䭺 ÷p?Ͽ^1Jނ@犓#Gk\JOryc'+|9i- ?59p-ґ/ɆShND~-Jg7YLGZX&`=$Xyh0ʉƵX㓢r I}'#YQPW[[l.ؤA黸.Φ369rQde VE=ݸZ_XnY/1Bk8,;ωY ~딇t S`3X?aو VG=^/Bcc7ÓHȼpAD?VH?pq bMvG#xij{TTmM>i1BOmPBrbm+00D)5-Hs7|PV&NIJwE)PؔmTvk-"rO ?ns v,cmH'C_ \ƒ zl4Is-#_j F]\}{>Hìp^q:LMgJo 31ǕZVd?nt"H@qJ|,DT7:xhX&^myi@OmRNg*_|{AIj0. Уj( kL-7ՙyQ>HɺQsH?(H ' }F9cc!<*¡*ځ$Ko/"$E5`OQśBUFEXHyk1M"^HpVx'MΌBZ{pkƅK*r X uM$d'AF <`] Su_ta$V SxJܳ?} /?bw܏O[;p*| 6tc/">IߚjYJS0)Ev I.$5 1p_P*zp[O.L%2*hJwiT1PUUL>c 8&n[g?gtՖ䋟 L\@pgQ0h69)A1,kUz:7P;akߎ^dKGk)hJ!Gpw۩Ns@} l.~7I !Gm%v3?niׁ};כ~\>~+xx.X?7sp'ב`7lS%))-Qf?#M?Q|{J{9]N2 d !ѬrzzMN:G’w˫cf tkcT(3}Jazš$: I¼khKyjGbC4*'(ϲToAGbZ~p/A`2z d|\|BúrD _fϕ['!YoCS~-(BM{ 7K$Ty ݧ- Mn6jz|a-q ~A{KUܫ|]@h|!zʚZ3:&;Etsüܤp4[w7Z}xf)%rR#T]T'"w"3Q<i^ѴWKY|Bq&y&[xw=sxǍT㏇:jNHaY+' dd+߀z!6POGf&.nÔz&r{A6Hp4.Řn1,6gܒbZVկQwD7L# |!š?AՌJ6dMӘ _JE赜IdEqTb>% 43$ +╇\w-=eÄ05ffY7mgzX q,ëF?ꜯ1&8 U( crK+%x8ꈚi 8®k?5X8X#ߥ!peejETroa/<3BGnfC5UÙÓ WvGHgD_Uр?`YR"ՍiX'%3g}@D r,5.r!ȩ:  CxeJHc>5޸T8KuZUP ucΞQBP\4L rVF` ՠe$< SKYAeɆx0f*{`.QPa] okK 'w*?7!Ln>V}e7`?Wb䣻XW4c֍1ʀ: Fst^Jʄ)Rnr{ӻhYدox!(ڳ  tx-u3C0O0=֠kQpG]fdYkkٔ+6a%JU<MOj!Y0~g 7KշaExo~}#+81d0(+=.`$cUySqk WI\t<%drޑ~Yc( Q]HR9]wL4}kew7h@jTh-Kl?GU e0SUn7J>ƺqib+Fj}M2c jrabjww 2HZvl!UP!G㓫pCgKh'Vyg/ 7mg}U'rqTp'] DS$z>W63}~, L^QNvMȾNF즟 7 Q9递Gs_-7UHd@ Pp#fط]~b#/Ru.ocƳDЅ@yZe&W~l-k5*";=_:NI1uKo Me?T]j!U%=’IT^z$r+{x41'C63D?(ݪ.-ODQؖfԷ_v{E \;n n9u/ft Qc^t13g9-W!}D.땘3]#@zba'ɉl^)YV|?")[k|T|[u\Z-^)2`1JA; H贺td&>}5ӆp/-܈YEBzڙV=Ω|&;cr!ǻtv: =Dw_s1 <89x{=FS.k YAcx 'L%$g7jAŒnyJ*氷1O}񠵺WKOҽ U +o |tp~at|G>"5=g (Bw$EK'Pwo|b˥Tnh>2F nbdL2ShE @ʾRxϿL5xGo~W4e2_|4Q*5XGFoUmz5rˎ|LRH!|Ljw֧dڒ I&ث m˃P_Y0U^`uJ/_H.ӛ" 5vEqpjF.U@s%kbA.)Kݙ9@ %iF7œ8g^e +ieL DPbe?ȭ:^Oh"v^^ʋ|E_J J]Y 6J1*^ `zS3'B9KekC`$&{(cT~;rE+'Sh.B'MhMP g^qZ|1:``^!TƄ&}%PZb2VvMj?d _SN`"kb(PrOMsƎmW hn*+RLڬf f(4Q ؂M`Oݦ2K֥5M/HRm6zY Gyf9T.EqXݰ<lBXB7r bS Ӏ򥥶"N@2ME+MsaNyi1Ǝ9H*<(otޣlF95veTzUvyiS](2 PhtPcCA>%uNTr_} S\=݅eE&Ձ۾Нo#-$;GZzVtoCV<U-tBEBV2&t&Fh6mɀEI9O>ؠEt*Lk I-bh?Vx?My ߽Pd[U,fsO` Lgט+Nsqp[{^<gJsC2/υF d֒. O'T#GH|< NkA҅ gV&%z,lX_z[+& s|aXfi9<^=TIsۆCIx(|8Sw؋ʰ&&s6VJ(~BPX]*!뭹gtsCI݀&9R+ob޹8eOB&14vOKR:5=}FZUB}'Zеw/ .i5R֔9k=jq Σox̋t{o!mדlJ_nyS9SAAc%+%h9aϼM6x>\x=5EC>Sl#Pt6hBwu{ Xì (B*~mu <~9Y=GE-RYAufslcX|Kp]cׁNh}A l4dZAT[^݇IV*NրB|d#{6 ԅL4}ʿQG2]nB͂c E < X;E/ep,"6wd\ wO,\J !9Ethz#0>jVHz\Yfjy|' xM'ɄE5NةB 76|a~ HĭpB1wſ΁x<^ېc\5QN4^tr\-gAtS_p|G(fkk| a~LE=ܕʩvnhGF4&%2:^ki<%_-<)gIYvGM:֐*zo~q_ݭxÉZTlz#ܞ Qg :_@u{]vsӏN;n^8,t%JҸYhv? Au6!|xО. 7T5 **°!<CKb{Nl?`jdtw4t9J[_؅#~}T+hR24>r)YŠkBu[ϵkW4#q}>a>юBݎAD0,懭$Q S{ɟ 5]T =" Is5I?ܻR4Y*jNm8 /uB'kgt 0!_naWƬRr`ZyLN+ͽl/)idV @ ӠO']bIwu >۩GCekn%MU]6]VP/L/( 줖i(w[&p1Fà19;7E:Р$Ԩ+()i")эv5zx>R ?O})BiՙYD<㰰E-ʛy"z΋p yOw ɚ ŖK-ݗXd9vI@}'aعՋ=9\>) wn2Vd--Yd̺5ϞQM:R>rahɶ,(pYY*% ]!\:I:H%IIn| *G$ב W4wAt})m^,F1٨η{skg4FW}_ͫW3MX7Ɖeun]{l3WQ˅ɖ^I?gѳh*萙ȈjYFKgEsoҮ./G1HR o-.ݕ*B_Pc||Up5KvRxqL1e@.pIņTrs7Z;J<~n\j4[($P@no( ˆV`d@Yf{ŏ^YXAin{wT l+ЙMm^B)YN,zgppH+pɪfR,d#L@ΆD,eT705l~WZԵU,Gd,RYI|'tGQq <Hc-X#{5RSss*P]8(' LvYp* d z$Bs!5ZaŨ':ECvEOLn2B:yE\\K Nuq;RYxO [^ŷchʚiLd1ϐץ:i< "ϽaJNhLUXJ9 0T0)#NJp xz,-D%>R'9pX5Cс jٽ))C bO 4Kc^XDPK38HPL[-F&Ir%} jMN7xJ$;a')K.Msa 8Jn5[<)KQKL d-!"9[nvyqnBL#1Xfl(ʫJynNwj-oc*+Wu~`qzAw|[y}ΰD5kG^Oi< UY$ Pp^{m?JHxĪ|wu \hd3dhP)!}*ob#K *sXtxT}4Ni2+i{Nd:MeghM71*,m ֋! P Ķ63FNV(z( 1a B4N:22 g('~$e?jdBKߡV+dw\ .,MDIPBEV7VW_qeri}Cih`]8!C=:TL@2wM1 J3dmޘ"ێzLTN(Xhe t$PreN;r0ʢ8IWcxZ+"g X ir~6]tFvьRۼXps:9!k3H*U ) 9dkEULs~`ұ4ykL/1j8xxg"{1KL@ՕV2,ѡ(^FKBy S9 Wd^G%Ĥ3~3懲H }XI ъEQ.k6ً@xB8G3耧md!R P nNkCE3譀L󾚓CBh} 7b<70,3tP p)PEMKUT&x[ EWGdY7C&/Pi1] 6VgeY|ʜ==F-|7SHLw0B&#bF860^W[|[XkV\r,h$)%k/柑=Ųk[p P>srm9-o](?҇_v5H[:bILCAeV:ftcʨ|Q?]xi47) g^\ADdI) 8Q3xG >ފ/#H #I]_ < DȔؔ;:eHҾZ[ƽ&t5-P4u!r_TsPp`K8`=;PwLD;v}ݓ;DC0:= E`ch\]oE hѬ l}gh?ϬD47ba 7@k!-ߑ/IOY2 61b] B}Ή JYnikh!#hKmij==8"bn4Y6oL'34T⥷0ƗFHӏLb uOK9MG&2搈j2NQ%ZPT'jΪ`ɸ/PϹs(π+=l -BX!.c[MB%,{uW2H EJ^mm9Wyq*i=a)Z Ru&LF=u26#4nh1';9\20sy@PDZ N0# ;~h뇦KfQ,K4CZ 5ҁ%f:܎07Xi5wيȂo3QgRŠy(fB5myX=1A]6f]6o咶ƨڼ >%j위A+p]6n;63&FZ_d}5WGY{#}Kh?Me˷=ؼQl\ǒ]LML;`np w[PP|9:-9Y6+ߤыY7㌺UǓ<~WMt] 󩃓@LY`PXATUT1m6nEk89 a~e_~t_VcnR# e+17 F8fYŐ9}!;ڔO+o-B*Q{)փ$5C*Nҷ.rAamXiEz<\',|*&߁*e-rkjUI)(O}ʪw$Uŧ&4 & E.=ir4fOl2=ӃJ'e!UI]uЕq`kИ3<`BS2#F5#pϑ]8"Ioyf*4C^ij]5TD| n 1aaM,>gHsl9;G'JTB# , `O;[C ͘.:8\n;>-+ԣu(7* {Hr0~$_=IHBCߜ{>VxԤIeyPE%v-p".QGC}8 6MclpheNq+؂Ef4$>Be7V@L K"^K46SV/hvnb"H{(Vߦʵi^P fPzP7PГ/kI H}x8 >G&C^HW,{wD"/Z=DxESo0 AS0dv᭗!e01u ?R $̙Ef3&a2[LHޒ77@D4JZ<(J3E_mSiߞV'Á+a5۰ }OLFe^CRHW?j F:FC7Yǵ? PC |,]e&C93W(?; B׮7+e. {,F @  bI. dY1?6#JxYiWD3AX_|P-o}/zԃTmk0oUw";G),od.h |FQ{J_PK.*̎B|s?cz˞ۺj*`㪋v8O^ZpphݡڙjUd5dNkdGc` D*_*T@3=l=F19o7p풟y0ɱ=Z6TЊ[f};.|dmLb0P-_XUcj+JM 4Lހ[YcVM İ{+/Az阞7GKs*brNe`j&5zh+_y>[/lKnzFi5p@qB6B}*v+RRRx9e"4^=|B4(CN`SyL,9yNdf×RL~HurƑ*9ܗ`df5I% BbeBX2%Ls"ϵւ)G}* @%im.\7FZ4p lB:ߜL/L Bs>$5>li3di{0%ٴGrVGwMna)6uip7k2ʦvq(f_TH\N4oj p TSQr$6-IDlj(P) >mzҵyMFZ/okNԌqqC04 uduW7Q~<]^h@a)E?oE6B=tGSġ'P\2C>)ߚCoXW3kC x#\-!N8XK!\BRΗhОzڼro9fEL& Iq8M0vI~' K#U+ IAh?l!Z<+Klvj~_"XD;o۞^ ^V۟D!hV]z㎨ZZefKwP6kn9q~pI?Dq;PfRT#txGvU2=IXZMH`qϸ ZO\ $h J]@y5? [z4<"ݎrl! 2Ng_qʥܥ&6|HA !#& &"[pnVXR*-T Irw}qC؛#}TRPp|{lLKEۥZ"5>AWi.\Oi٧$1+9C^F.0% [K+=0H޸ PT\ѿ ӵ/6)'\HSX0gX4%NA\s%-OMPn!ԏ&4vOItjE 7_[TleSoeB\hLǎuY291Uծ͢H'QZGmͮgfBw +3!rGGY%Xiɮ\H5m"0)$7fR3<qs"T2ku@*C8wqaO5JwXZ'1=٧+'!K|IÒv 6\~=;ОXV}Ғ/\I}`~:Qo4/2#gT<;O0"f? 0M@$KSHdVyN K?Zab}-AEI|T}+w4)%#th5_ytsL)wJ3&W f@j?a<_M@ qY{uJΞ7~Ë oAw.].>E]qF^OCgL  †PӾwLcY8C{>!% 7Ӛ-U vy "F0g $禮|MZ=+ &,LQ҂~34#.;d# Hퟬ]hk^!z5F^{K+o~]iP-o!>+rɛX<؀Y~d+i6O9j6tB 9Kiə j-;bLf >Gp@YGBC>VPݾz{,`G)ܩF|.Dwz=?g \m&nuOPHKJQkJǞ_M$V֗W~qTۘv2XS*%|s0OTݠx#}T7Q4MmPKr8(UÅz:-\*9r@*ʺ:WٻЀ3-%FtI8kE"[Hs۫ܟo&\!, Oa#yGY?vƚ&ȷQKhS΂:oO7^ށkꆳ^C?DsY/ˡZ `Ll?W rz|32c;#^Mܱ@9Yc|*EN]Z}LH45g 'JAFaY ꨢ<8Znu @UU07UW1X3]Bͺ)򒆘3hmIHNuk2Ԧt')aԮU=94.0r]-%WCVB:Zv!,J*LM%)~53 [ߺ)̶^w#Fl%.~։a|nqly tz]Zɀ=M3¬}K+Xl(s7`jY2य़Pvi-j4riVS0Dr)sb2Ͽ{v67!mFs9|41+d|mw \uGw3ؾlm:K- uk$j,kw`MV:8+|<Ȍz76qT < z1jp5O7|, H#>IexWK?io1Zq[+efhf6-qCK0K'KStHӈWΰUd?&369(_,QAjq"%@W=tP0` B3*AЅ:>].GEd= 9$U,p]?@~o`E'k5λ\94wIpIfMX^U~ADRpRNyaw^!zF*CBV~2 OqINrO-wVJsVФXuDB[b(P}/ϴ;`j2FG0R2K;'0ɹE\-a";Ҍ|8W|G]=> z4lb6ټG"`dL6_A֦u,zl󘐾[1ڗ _Yo_nܵ};=: O,QFnBeZt[ (XzNw_ 纋/d+yN&t ف}^7]& #2n>>e`: mAӀazV`˃oV}$@EXȄdOq_ i[=1ˬ_T^HMuSx9*"ג[cr$-lyWc]!r=Xy l$1nym0Ef˳Q_n|-#U2ToYk(.UBjNXFmBxy\8;nO' mqrHߑD)v^r`PuN!ΘDP-#Ti3m')s$'+A|ퟬ \d(h5[B+jUk -0Gե.8uRV"72˗Xw`ˌRh"eX{cԩ &Z[;B<OvE37Xc4CThgڠct-f*$X)\Gm2QVY|-FsɇzM (3\NK"z#DŽp 5eRrByG(jI)$f_izS]4gYAmoU{ >9Qy֧8V΍6.QH]$g0ķY4{RyYu;SЧiQЊp F=XTF-)Z%Y]m` 塙+0"eSNix4H֥ YBՂ*ocg _MZð_yfŗ! `ƃhQw7,Yl_2+d ^.Xks-7Lo'7KIb[F(EqMs 7uaGP| ffB[ $^d Ӛ +чe^i]YA9é." 8N^X(nLIA,bʔt 4Nf#%)›k:[LK^N<pEo1O/Ţ 6%6 %3P hΝ&YHˌN!bSEOMaѳtKZ).OnF>|bEQI֛; W-s"?.| VQxO2ҟUEB0EDjeۦgoB 3lcF6gKH1|~M8cxD_LR ):n]'p2q{s?!$(%m]3+yǣj97 ~wí=j|*E?!hmr"b^qmݴWqѕ=!dOMRʞ:}G~Ƭy1b) B]G'+t{df[ K*LjU)'RIwgC{%;>/LW*\#N1%'h^q魈K7^O%!įaLhEcV_x%  ch,%bƚb-Eݜhm"{7*f6QMGЃIuu! U+#XYb#*űb8R`RW ,~<+Z0"&0F752 =+ k:>yT"q@=2Q3϶gޛ4 =aM^Y*_nzW045L by'o1Kd@OV#V_ip V]|?~֣<8P1Tw颺2t7ZΞh*~TYPy1^h⃮e)0^]/Ř2JV3RzT8 'jmW K,Jg?\܍'($پ*Kn'ͻ1لHNViZ2 suǹބHij =jnN?&l+h ڇ1Sc鵴wIcݤIm,1Hՠ% H`5}d,OrH9>5k%{\CcbL$R(]d/!gk{v.ulzA}E~+skOxY]X4 ch Cou+Lqf#ut]; $cTT?MIbǚIk:ĿH c(U`]a \Xj$FK6MI]&ɂzV m2d qɌ k.:$ w:FSԠqtTj+FX\53 LkLf E ڱ|Lxv%o4Kv\0O[:ܛ?5>yU&!.+P쾥N r{>îTN$l;uį}H ,]FH sY6_ȳ;Q]Ɨiy(`ĭ_wE>(HJTq ޹[!+u$"DMp`ڭWW[L'0n3P .*^ 4R?4O LK y\"rm6Q)FKVw?߰Q@OAپhT}sz9{+(p.fL _'kCį8$ysܒ@ϗ`o~uµt*8, <`|f[-Hh13Wvb5f=tޅ|0=𞸹%L}vBT?;=X;fh]7|%Z[WCw"=(r\2G^Z ĴH4plIC&Ynl?eD\̦4,K\㠳珟 s =MQ$" 0nʲ.^NPp|&-EuxvNFT|Rݘ2x_̈́+z8 TR7td%o&>== &W}n?^#¦QNyܾa~J^A 75Dҧlj/IgI3tw,8}BLvj&J0hjҮЃqcג%OǼDv!QpU jzo- 6E( xd0wfKU3]d:qwFUqݙ}/ISn8܂8)0:5GӜ" kO-')W!ݒ $X:QC~]P*i >Njl[ 6AyJN&Laqq^E]"8m*pZyyP8z_a<ظ$%B \MmWFǙ7z3泌f5\ **=_¾v,FCȣOQ g t6/scvC- t!,abȗJGd&s8mm5H}Y_]' R6;}d$ɂYB=੢2v݄-lAM u饠x>^(=ZhFV~VdslRW5-:?W iAa}XXOP*o }CJCV6>r=( ߫I1NrctBy Y`yl~^Xa51nbw.7SVݔ%c^ ͗^dkNj j2v) u6(=UfHa޺]!AR4c ܟpnQd+Y$Yٸ|S(|rVߎ "S^RVno\1N1]7dX/LY 슍(uZ-;L阾IHvd~#v0^QUj`b+JQCi5r:X}$gMEJJs \|FA[K2i\Gp{I3NI]sDvyU@wO4WOWHp6 6:-Sdܖu<{.t(22v  K]515BɥڨO>]̸3VHLR 勏$ףm5XkM+ 609_*eWQ+v컭{f!Zh8QY[LւUYlt:풀^P( ~/^P[5 @\0/J˒Lm3vh(̒QDz  _n@K鏌{7 ҐO$A,et(bV35_G+_)RҊْԨ O HJuOM'GLo 3SГ0D@׼Jad{Mj0#Y9{Wb&^"D.3j\~¾ %x&"vj h3l4=Gk63;DU+݆^hHaz.͙[XbyfF4e tFQ,K=I'ś{C9~hV4Npy5:Jˉ"f+)nDT&? r]ϻz[9Q38;oK8i:[AM]9ɸi9A^62qŇGǓz.8*锱@E 7%> 8ҁiTRdXF2 tѝ\!r~Tق ʱr4z֨Af2º {cO/|hmFt}:%:k;ErhO(w-3ˇJDE0 zRS'- ?z;2b({Ǧ(<1}kl@Q|]؁9^Xšc`mɸ+,auWwWaRXsGAfc'|JPܝ"؂̌!&=d@0_qCԳ;^8?#GE8sGMv'_ 8-ňsn[^1ԲC_Gxe>xa'x9xa"jl"(/s̔(FP{P'<'5QTjh e/U7d 򺀉o阅G\r QȊA)c`$Ϟm5}zXtHFB*垆t{Z+4b8ՇTkg3c1/廽m) DN_I&TKGy!ܑA'2'{\ԧ ~[L؎sC7EZscvda2NnMf,^ۃ{c=7jL^i(_@t],PtMP@ ̎j#*PtЗN+RDik^kL\iIR{ҋ_)tJ%+8>6)M0a EEMb˹)C<CsD^< @o4Hu:Ebwy5h5Cg[bE / ;$rƥ5Y_™m´D.|N2L`lYtȹ Zu'R s牖kONḋFH6ሇ>.߁{IL0΢'eW1s0HmLo%﻽N0li:x}>@cM|q 30nm[be:`y!m.qn8.9ddw/TwP輐'.Pdeb)LXɉ@H{:̕I!p:MV0PS\t 9KgWcIʿ> :㒪DJxkW"O*,B)ٳѭx&L5vwS%H&7z{AN{ˌ }%w;v S\>C^gj6Od^]Cޟz)2H0,*N^"2 aSqnpZ z 3y>@O.z$=Wߗ1 W/pKK \ X[FYX:OogM >bЛ׊=jSb]JOJ wUWWTκk¥륢aӵ+֬h_W',7-l9vjb>DJAj(Y$4;P H% lO %5{瘗Ѽu J t۱&!jZAsv sA:kefJ,psrJ"#W&vj1)"+G(]b'=zPzDՈ WUI,6ZaRA}z\`RWܐR"1%ZzhB1~-;rsJˬ-K&(^X.O Nk ~CⰉ\Ij=e.goָn,'W0+vY,  ]ك/2ZQeG8Ss?I/>W_JΩ܃5#-U/^U.&u(SW\+|i nU 5{8Q6so-E% 4N&j,Rx4'mZ#]|e|Qbx+.2ݦh\VFTnь!X2Y*ۀwmkȤ;f*mų39(ĩɐK̵ ةO2hD2 VJ?K=ФxyNI=N.<ET̀CKG\Ɂ[?ZgamSi edx!/Aw|Edϕ. ݕ52XHnX?Դl!R٢YKOEn"޻#dI#I5C Z8-y Rd,!G`j@AV1Y;n<|QA)hL4@u H,O[`~ʭyo{Xрʗ?Hj\Yb.Jb8M%{%(!8$e04”><^hs$ۘ~ G%p =+qhg]\~9]AJLBc;V:;ZoO/h yRIОBK\L!Vvg e_,ˣύ4AFo+K ^_|;k1neO=fAGד/~77pwL9fb g,bƷ3BAmZy^n~a{nH6JؤVvexj\{s |Byŕ$RwAH:hw n$\ݹ"OTlDތDLuU|b !)rVm)=;Xzh l kZDUґa *Tz}K #`H=@>q$"gbC!J$ ߙJ'5VW @siYC_ #1X9xP?;9si|CZUd9`CɖiYs¤ 6D"I2 zd~Img!b{ 2h70&~I7ۥ#e1: S0Ԇ:j^=iz"),ф9M罏`>&MAco{dy}}.*K(B[WN*>h h2hчWQkNBܳ_u>lF  h$ˬ)U;rEtTnnϜ} ߸U{MP2B-w ){B6Dk <JOvw4rھp~鮟K*ㅠZN%;T ˊW?qVg9qByWq0zK%dKsP)NG2s,^ȸSqqvhtJ4Ji|wņ-b #[4>1U<7!JTUyjaԳ^y)AFiQ aΓ.4[46H!an#(]ּappAܧo$z?eEzIH((>6KCqb5QDN@#ĨxZ; FG(>u}8S>y?eQ2P"\HGt:1EԷovZE8BcDG߄>H%/1@5oyں.!,X!;>4d`V<wkj 3Nnyu=iWn2n'Wz DZ3ֲaà',EпTsY8K)a=+80$)Tng`c~4ǧUl+pq&V {^K<šu[^۬;:+o k=䪲EB~4y ^5D Eޅ{t8C 40uKiz5Z +ޞZ>42\wqqt>%<P%ʍH!+(ȓ8jVaoj.dO絉8p0'? FB^@q;iQAw}Cp2 ^`_#H ;L[]KHj qqdk&{C?s`RT_ +*AA1H #*-DcI * ј4)imDa~8 mZafS-C _!vRC#r tC&d!K]t+@%Љ%g3ցăt;F$%G$ .ZL}b1VOF E°3vZ YŠZ'XfP+E㏕&Y_u)AH0NďOZZ3cd^xώx5*T82r (*eR^U!Tb8:Ӻ:ZjӴhX25H.xzX0UZ ,56y] \5"g' qyI uȴGA5h=6Hei@`o"/HëZnӘɣ&Po 4kx/ 4E$\M Uad rX.jG46]nپkM;F !IU5mN'aB'F g޹2b u B.wNlߓij5D$[,I#M!{zfsCX*sneF%gA%TGEV貵HTyѼDy ]Q4:4BzTXvMo/ZѭGG#'~tLV ])6TX/ъoѿCav8JC[ ;fZݨNVq$hS]M/!^'LYYv5*)[25ss̜2"௨9ƘX̏` K1 OOsVж::'d!+@Aix㫇g ȌRcڊX͢b_'eRf +Y\7sºg0V F7] M.z4L[[gi-x.槨&')oNXHtPoPl9j\_r+_N}6= P@yQɏO_ ȲW1ݹIeV-MLDqQ,djTJ2FPaj?dc7fѪK&d+otMsWK r= <j&nƻ"n]rM$=!t范/IEA_N,G^2~ ϝظ(NX[~?:M+7d.G?@3\xҧ*+2ICv"a,D8ʟt#AlM#Nb8Ѫ݄Xd3ێs#nN) VCptޥ\w2},fʋ p+3%cp_ OhALuM:S7ir̼٩%c)>pͤ0ҫJR4:/18>N08~*q(8 VVEbcJ`Ö7Ά)U~!^Xi>6 N|q5UqIXU`*QJ U}$x3sY-vV_hy? 4=CP֡-h;h94I*Uc[^!qDKn1:_lB-ǃ;FKUuQ] 1o%@lMJz[1O@룷v?=~XoweT)Z iXw~;C\⧀lj3ktѮ߷J5%LV\֍h10 $`fLpac&}VbMnPNlo锨+Cb&)3j(CX d`Foýt[nh>;æY)^w*5@F9c6z^y,U ÏCc5E-^MGs9-ٳ@p<+SH×jeODhӍsHfX(zp>Km\ |D^$-^L߽qJ[X*]7Йup{pHᜎ I[(ĭ֩p $e똆LߔȧMùFD& R !a qB5GzIΕ5޲R'*D [oHҙvnTԟSQg](?\ovRdΉT*9sJ7ˁZf*9-_LJ5T),lt(u3xIDi2 |ƛ +ލ|1ٲftP &Llײ}+8kDr=_.T9D̋TxT8!Fǂ]Cmj XwL/jPawa9,0vۣ{%FGåepAd0U':7`p65rB"sD?sJB؋(ʳ-p(#-, ~WO="2=>)8jr[i:Eܧ-Є'mb& - h 9_,b3DMFXnv]mz\U5:E83}P.i  }}$LxuZ:oo*vAG,9KCoq$TϟI uO `ȣWWOך 2-iG|:Oe+y HDu{.F>m|Trk(C|w9G [N\lڅ.j )2*5C>WuHL m| Ea壂 ҍrhJhOru\c Yn4*l#u:=HPyQ]*QeB֐U])|#/*6det06 %G4}NQHA|S j4}Q sd)"ِ7T}؝rU8g.t@oo2$#c vNzԞhT϶kFx=u6R+Ȍ/=4 z6CRm?Iclв%N0 c3خX >cD'K[ڋOޝLdh,uOimg$A҈冈MSOXyS=`:3[ b/2-' ТVڄ.ى1֔!r$B< VRC(Kz"[FWnn p{R`;.^x5)DpBkI%.A(`-l,ӹnBݲ'<62PgsƜ 4^xt=.ZPM8>TZy]U^de&{d@Gjx\k(VvID1QnS袗!#ez^xGP'԰_B _}0݁@g[֞:poIZ3ym&'oT-Pcu&lA\:%WLl<ۃ:nP6W0@WQ&ncDO$N\]wXll_Gm][9HU 3] @+yETw`~Zنن=m x`8S!R0spIڶ*KL) TMj[}sbr` A~`-䆦 JnC\,yUB]]\@JQ! W׊r`W08"Z&1qߙV;`"crѬf&,[qQ- Su$_^"yBMqnc),UeqQJoZ\Z hm>Nݔ[Ȯnt=P|䤇w ;r}`Sn b(:on{لU׻a缩g$ 8Rx+L_'/&$?LD7Dg^g-cq|OX)%nM5`j>N}6Oh RʂUt[U5=S*iy|/Gh3׀4,۾$uIc5V٥Kiȉ mcm"q\QX1 DSac,>`:tc@cB>c]dz5]DOqOEaܢh&cgX $ 5;͋g)M8 3JZ$8T#^e?m51$S+'\y[D;ķD" Nj!0B 11OBP&ux񶅑# D)NK/3Nʱs:lD6|x)73DhP7h٬jp,fzȂؗߚ5Ǧ%|Ƈm1m|p`1t!H:I1WҊ8H}ɤi% i5e.'"ȶ)r0_|ﰋv S'F*w.~]D30D[.ie.%Nsل49l. zΐM ZhKmj騌M9]{7z_Z7ȘX+ gk '-(Yٌ4Ch&flǯpSSnc#C곕!o}kNKͫCU o=ZIحKEjqDHB)7|PE i&Xt]z,4+7$cP1 Sa iεIiܖݴ.xIJ7^[՗hXbzbr~t}_: *$[}O8z\CbW !W/%E5H ĈM1';>x#sF%$⭢ڪ|FP? +9٥D?Rdou:xOGa?TrH®.a-><54FLšr˓[[LvB8]1ҾfqcJը)V@q&'_: ڬԹ6P Y>U6Ծ8aDvrR0"6`t=A4.P;LdS ͅB`K*oug?9)wȗT(΍ 8 Izc?c,Z\.3@?R*oj7@+rn'-P3ӁpJODM–ubz 1-)O^bnՙGE`LF@) ~2.wXp(Ƭ"МR7ϻgwLEY7U)..kR~{SC{aoLe(Q2ۃSlV=ѹ*ѣ7걗I݅)EYZ#\ȳ4HV3I)XD7&!D޵v%77H>a FI^6]&E tHdY[K[gΏٙ7ތ4,v} vn,a;9BT[?v!hS[Ls(@&7bPfY i.74/yz>9Ev!oBnyiyyNo5+.s;ϲa!zC=k  ?la Z\MEitNtt*(HxD2O~mQDXq(~׵Zmm]UB,$F ¨SmENΡuk6*%SKC R~ EPoAJj@;K䙧%Ay dSEj=4'io?Xs]r<0@鱣ϰ),x/M=k3.>S't ؆.?߉ZL, ֧j2)WV뭳imaNH&-^Q8xŭerɯ"Nq#L] W;v oBr=Ɯe(]TӈђENN2j9+J ꌒv(>2OJ7ϱehER82Zo e"h+䞪UC*J4gpitAb0K*=1Yk5N &+ QMyZD69_O4=(B֝q%ѱElE],9d^Jx ĝ8&ҵj*3`$1x?Uu7tOJ9:`4 )JOؼ WяXIg!q-eopE{~6ϺTd *A'4 R0L/kڽ\B䶥?ʴ79I-A.Z 9PDX7W'P cٶArStä9sW  o3HuO ܅(; `(iIg#]^5}!RGIn_C⍴9 hcĎ-LNL4hƾ~%'Y^&gC)Wvw 4bD1PhČל ;'e搹%Iivv[L~{uAUԥ'ߜ]t/$Ai}{Y(ĉ7.Ι?J^4zt&ylqĒ_dIDѡ TV٥p:-T 쌣|2B:eTiIliN{L@n8'a^~5(nevԠfd'w1_|;hoC(vpmO7vK76zQ-bpx lb4{@lk6.*15!kycJt>"{y.4S W^-p?5S*FO)IJ ȏg,#9f e 4c%63'ӿ^Rr*0Qɰ+o7:ykqSI"m/i k7l~Zvbêgr+q +;' :0ؽX*ޭ76M!OӮ*2ت%KK,rguS2N&}`tY&Og;+ؚ ؜KD+oJMQI)!AŐp}-~ng\l^|aef!ܿHh +x?xhٿv8Kr _`G%eR X[1YOSl%"%M["[ړ}jdCMFr_!6", ?Ȏ^B &*,MA#~? (;.!ZsPMe k'ds# .STٵ':V =&\L.'Mrܶ5j3oIo[m(T.crKH*r ٞ+G͋AZ[7o͈OHQ߭+Bty'ȶ@OTj'y'I,q 4"'6lpZ̶9.@pdr;ܚa]疦W㣶P?;5.گgQC@wi aaM"%g0M c8B9QL)wwF 7@oL)b: }6@ݥiZqw `v0p}`AD%Jd݅|8F<ܛ%WM>HSu3FS˨n%1͘B;=`mwCɂ }7ZLARxgƋ#R,+|\MWBz EZhA+Z;Zf7;ݴ  p~FZY(Y{)òV\aA<6%ps!v%>T}^ik;aLdY[M\eih ]2sa, 7(a-mũe H4hqﮚ/&Bkz@Yͽ ך읕S":[*x1[dVB9MZ ]UktV_ w0|MywRIӻYY5)X"xY휰;Q'O 2ΊYEּldHQk:E m5cS~a0{7$WQ8 j_xxZeZͽRSl=gx6OF3V@*_Vcyų}y')O,5"מ4pN@[ 47[n ӱnV&VH cMMve_qDcW0I٭;G` :xcnĒ )Z{d%H .+/|&Qg<*Si%u VAm ~5v#04nJ{˸'/akqkEڀݑtdCbi͙pEm3E/ +`C3:;vP0!k䔷DRd<)x]qce,v!s.T磱QЃ93Z5aNRx/ {eE' EyRVfɇ^]kHv-9tk QrVpbX-/$n.N{A`lN$}pWIc,L3:'o{/⠋iZRV.udZ*x @0amL%ְ6_ڕsi*f0Ϋo#>Sk -Ž=bԘ뺗 Ck[[X2XCBҫrvA4c/`\ l1r0m/]Z`ļGLE(bу-jCQN ` ^,KeY*Bm}M ވ^-gu{E3z9 :)%T$_r#`BI2DH4oJb, rQS ,d_phԴ`܆XW}O'jC7hqlK&xABM(`CS;{V'. Т4qJ]k<]mђ#c:cRH }qFL>{Fvh52%BumрsK){m2#+`>F2/)I'F3,Gk[HۥhNJr,Y)^p"rt%㵖@p0C"&%c!sV [8C#}Dˡr HEΑVŗ oTQ?"Hd^c%R[ЃckGl悏| ^G"jQq KH%ݒ+p0.jھn iqu׭d `zWO 6AYcq(%Nr K([mLusU<lIm ;SH,UقftX![ 2LDK"FfZ= 2y 5)  Xq>W-p 9Sj}|eƢ0}pl rj+d]Yop&H6kHkI0_6gӡrSgF!( /NһU)eFӡ8'RT" bңtN'/gQWT\/I 1:p j+}]?6bgĩ^a̤z$:.tjO)mX#My?I2މ's]3yBjAɦ"+b ܸ#XndU7C^گz9H;;ľ6,U#K` K_ٽڬE*[r`JC(")ޅPJM| OH⾣ V;Q'oPSL*\d\!# [ ,";ٌm ʯ;` '-+[7{iXP)F ;鿗eZhќ똟pō3 h}ԫ _Eeֿ;\X::#NHF/ʹ-#[tցJlUWG_x<(L-=K[ ; @p|t0K JZ#klacG^x`[v!I๣e~+X]NE.]0H.7ܺ x )Q wAqHE^*3!>C۷˓g _#:, $"?|4fҮ/#6IfUeIxwҁl1obUL^y0iP.w2z=L{z!?e܂AF6++}m&R (jmΡWox(xE9}SG0ڇw]АN| \Q` (ى Dˏי2 ~CVQ=^_f!o?Rw".oOsS^ܰFQWv_5[R@M2#cYvNwߏ5AS5ugu85B&49D%x |OG+HU!b)mY6aڱ6dL\oya~8A6 ٖ;ᝁ0TnΎNbm".P&tՅQ%HshsXY<4)2`uK563ʡvr)zd"R [(۶`uږ/4QtOX=UaHO ǴigW|b=[e= KW<0þT2M|"ma:@[]սSF#h ?=˾R3a^okJJbK ϭW;y c,_"o.kã=ZLO&!{8? ֆ#D _(17)0|0 A| v3B vͽWG1@NeؗB<_UNfnC4@ IC4eӝ6Drs}uRҐ8mۡ WW. EP !4%IV!KO3`+SaM9G[{K-MʬFfG]!69׸e BQwCT*ߢ1"O7OGk9l넺7`Mx{fkrK V]k]T諒wn$LH#s]jTvFU6 -k;/)S;P.{FN5 WU9ĒW8b6K_j 3"GPRb&MqOh-CcLJ&QF%KX \uwTtK119AoDl]銈nvhtJbFK\?R?úzKf93nQ` Nˆ#sb5ÿMՑcbd.8ȅP[wz'y<-lAC?cYDmz,a4NWF*C|л#u]6M}1^CXY,\uLھW.#w?jB Y0#fI(V\90I=V!€"`X$̸;\Z|S#$Zj*[Cր.ҦG8L]$S%׶< R&h ^7JvEtlwQ!qo߹ ?ޡI44;+Ex  @Т Ǫ͙!Gh*Q3}*)5Wi lvcG_­4݁qXh!J3ZJd3)r4\d(p{M"}$#ˆvUm&w-eO'+Tq\/#*. пIC]Қ^ a&@Ho?V 'CFPItxx67d^ ^U8'>U\#$vw/3WRZ/D“p(2rA R#d GU1tHQܣ!9kABa:&`tzTmf^1zb|@9tz_N ,ͽ.Ţ\9ƍ 42[:GIjnUMDXOkJs}kL_•i#}V"jK} LY_Ij~X@Wŕp6tB|wNMSpr"{k瘀\Q_3W\`ӰKH 8Kk3n]m8(/9ccI^ h'p wДLx<r)Preyj0I#Lm\=d{[9'dfoNhex"v+޲v#ӓk~=ckMO^_qC>6өS,[M arA8$!as&˖Ӑd-Ҩ)v\qy,MLxU]D?#Ћ"`sS$ a u6@Yme{wt pC4'?;Ɏ5q6YkHOF _guBANJ-A\< #y {8Uosx[\Ҥyg4F w:= mo978NT_l!F _=H(M )&k?*.BJcTלI &\d7~%PM!$Q^OmR}4:X$0~ zC(;Gg$y19,c-;(W>Wu=+MeQ\*7|?R&jY:U'pdbΧdAz2j<KŔɊhwSo\ =q;IH,{6_ Mj ] `˂\%02$+.0a/PB*L{%0י!-#QVq ǦWAxyO'Ky7FTxǢ ŔŢǵ>ͻ~^ ڒ >#+_΀%\aфn:dFFԣB !Jo{@dF.F E;ߏMYO@=ׯ=t|W<=#<:,/))m%2@ItjMSmEWN.QFlGh UU͟,{2WkTU?61Γj C귰b,#D #u4Mj0rF`ݰ@Fw6Az?%]m!!\?l`d#_κXB.E>Jo2/Tm8ނ*HZsRG]U jG3 dQ/G wC]xn)|. AsAƸ/q;^Ѫ=ԭ!gvorj\:ZƠ=k!xE3*ӺvZ`&||(1*J.U'k]XDgSuK8OB*|P[F*jlΏnCSSʽh T4~׎{= ^FuA;Q[j`Vk<7W7oz[%AnksU! Rqdۍ}.4d/T\gfųdP:Mܕ>oz ]1VirR,ɧd#)cܳu,ʈ-xͣTp,7W:=wâE?֘_ ڕvz&4;iD/ 4i u-%WĮLMn'c'ø O[zUT8k ߁qI H$vp"Xe}&^YgPpUԎ<H!cNכ_CL/D/Gb5Jaz?3Z8x 1R.B~ZoRe]C?h#$ur-XD_*PE |g+Dvj1E4I@~H7_mӉG- QaX0ݭ|8*x w;$_ D2!IdXNP8Tz/4 e,ϊ Jn\ }cRPRn~1M"ށq9^[fԿN>T0MllJ;Ҕ\=f*φ8R wDJTߧdW}s].,<nc|^+s{B2H~5zOG aER5tPl5c?S4qH۶ȡaoyJ\^*w2Qt1P6N4>kq yX!" U N.U~RB=-HgGҜ2%?>c4Ogz}y\m#!Z|rJK _ЁE ٰ&\섧ó; wځqXPnvv8Aa[khSI3~SJ&E*]x%ϨJRy&,!c?6oEvgF>><<1fY˱[\UJ #zrnDHKR v'p#&C%)ϰZnfd>?y|UTι._( o՝dt$ddgvs+<d+=֎rH-Jeid‹$Uiaӂp{Ӟ_͠ـ,dؤPN ȁZBIY3̑)>k80̷ [#G:m$&/iHʩI]+R0R[EW;_cR5!B}~ S&N7g8}r呲B2 h>pc`lЇ{b兩~xM3y-= L~4,~ 99~Ծ̤Hgl1'cQ-o7nlV1A9@+-aM~_pC zVv oV`L4d4 4=2"ç߼Sjgc`Κk|O쳲)@c)7n;@TDZ+_ N<[IGU j3'۬+)3Pk |:,zP^: wW[R>C6L mǓ5Tp kK`RߚHM %$C$LET &\V"qr%Syso4-u g|EtRBeD? 5*l;b}7KYQpu~DI>EI[-obB)n&©)ɛd/0Zby ߖV{:፱|K%o3|EW+R:%O~5DA7w{eHUɺ !JD9b~%/L!f~;8*$s'* }4ߩŐc߽^kݣ@IJ)1 80<]K+:sao0ݳ{AYD}DTkM|uᖎü`3`j``&`ugg4/&ۧ8R`Q;bu$Hdp#wO%;Yi!YaN@_ #<}[,JvXY[!>lO`Fe!`` ~[iwvqyTm6UYuB?skAMsld*̜ǣ#Nj<ȏ~ķ*N*؈ 0kbfфL'wUb/t޳ 4iB{e*qIO,šjהN-|?ܭ[솫O݅hMD"GI]>G(o< ɱ~6^aq]i'ok)y ҶF a^n/T'ix ?zzCssJ<2ʗ4 ᕓ^A@_[ 6Y8o& WѴ̙޶C/v͗[?*ReO]+<2nDg0h&8w 5|t=km)Un}o?{IiAacGK PGVGؿ3ށu.Lڡ>zO(!5+gWec.9h WE.u=ަ28)3|L= JδF3r zm9Ԧ` ܂*ECY3{k j:u5|Xm8[!|kxP S5$İ9ٟT7^QVXPlɿO|/SF?R4݆;GVkH+R jKĞ<9xٲ hu3NOtHUdڮAT& ho)z5Fho\+"" rL1i ؄'OH¶&{ܢ7\?ň}7kk#߾@.[F&w\iŕ9,Us&>!Ld Mk(\;ԎCܷ!h^q: kYZъiD%E | fL_h((`)*47xJd繺( jߌcC\/."аI)'^_jyd w:ko}k|"JGE$%P%{Cͥ+Z?qI%\q'ǏDb^> ǃsg'O#Uu+D*,K V"ݚ?驖|}&jS&Y#쿚$kD͆ ;8v(OXlUOoґ>.֐ءKԸqbr|N4ӞxoX<*UA;RYh/A}b)%sZ~Yv- kD@&Q2ӟk)d]LE|=}=G 0_V1w&acґb0M\`o/KEg*/(o !6vDE2g[n3W%.PwЧ\i!47s/,;gI(fH@-ieh,^!Ě[`Q饉/zwbugF(ʓYl$*19TOa{]Uc")b~N<^|;ד2mmJ9q\ i0i۫@U*'"C@Ag@ۿ?~2xyO ERӍ8Jso i%\3$ƈLnmzUS؟y$@]x5q]ۚ=4~`;&!ฟMc^86ӅWB##t1ug+vOa)DD&TFXgB%8+ %&`^ͬteZd"FѱR5"p.jjFo,w3xH7Ph`;$f*FS.c/C9W~,rlɮ?.d{])"ͥ474~WSx]ipce?M$0]2?kg9h ;*ˑC;PFs([F:kƊnhIH &od&K 8 A؄bT:^j] zϊG`$[b PW]_ *6qԢ=uLl# i\gWX?U|ogxEqvFyۃUAE@PH@-(1':62tեSNk΢Oq/J+g|]} b7IgxenC:|JoK]#k셨# (SXLQwۋ<nW%)L4M4v\u;MB2pWq%=*Q- :8)Vǎe^Un#H/IF|a9$~s>l_-}RPm" !K%5N*ss[Ef۪Sh} "^OۧR_,ol:Zm % dH8SG_A9qޛEBcR}R$A*?xqN|M3.h9=M6q" X7AaYE4 I'e;9:?:I%$'Eӹ֘m&($L;w@b`wKS UV˫_eh&\}~_ * i3/qYNneONj0ƾCr[ dI_n= Uw¯<M*c`m2붧bϬ+Chϱlv7|<ހ88kvxґkjY'l !<%Eف3gUS*Z|OeO:Wς5P$ѤfMܲn PӰ:wX}o\P62/AE Eec(]#]eJho֠>V:3F^H58`v=mTk*E;R K?jb,56ZGju]JqmzŞ(SxtfA8i^#b} 4F&'mOɤ V]+h i6%z G:k L m>YsNo/B֑kv vEqnYQ؄uAK%:b`0>l0;/Rl@0n%LWbe6r IAi(an^Ўܢ+Y}T oF8+nR!Ӕ2@sgmtO{sC[R/7*N 9pțI |MZ~LīKO{/&[+3҉ o0T2A-~ՖpIEWrЯldwл5,?݇`|w'3N0a!͆L2G!9,,;YT {I"#5Cg]ߧY}<1c1u>dU۽@8zbbys܄3.΍G)5ǣcT$ϩ^2{`֥ ]&=s\)ƎUW.AR{edn\K.1}#>E3=胑vִuz QAZ2W*ߴ1$rů$Eя"nY1ovMY*"/,ʘz<7E>^-~ve5z)j "=&_ '7q*F kqyyتI4_',,dV-x뀢mpJK|9aCQbm7ރa'j !Xʌy݇3.yߞy)mON scq1Bϐ'5p!Qf=*@UQ͞g(6ȥ,~+1+B ~M lVNAnO] Dsj/ 0BnUkN}sC3 ifaWrjuV y[Bn"X`gj]LA\L22 16FqpT: G6s1gc{>!hrMu檍%8Nd*}19d%qx y93ŰR&z`_va]C8T)|bUz6Z2VCj6U TkDBM<\=uAh} d*&_hoȃ>pJf$!c4Qҋqoy&!Wql,Mx7+aYZI Wty,9!Cm-MM-UCxvۙCĄn'Q.o;ZPS(D.z(ǽ d&}ga:V`T : eyJvC N|{JJb uJ=S^@ RxU]D(`'4u9SB5l?!FGHS @ !\PPrWw9U)qn$'0cUAHp4 ֓,idӍms {: 5 }NY@F:Ofhl1(;B81BLƇ.:m} 0`[,aXY^ r'_0s۳9M10>a?|>r&/->j"PClx*)">> ן)ݰ )Z䁮H}Tޤ>i{ʲ҆g4hq(&#Q ͻphE6#rgS4 0\*ql y:j_l ݫ2 Ob=gLC# lG mxns֨ 6X.؎u$Ψfn-&҉tf^"aQ+ ;c"XUr0Y6{4*xb!l$0̍K:i(/p[&FFnk>Fac~AU,q΄p$DH@"; d\ŪD_./D{T Ń(q:.xƀ b}r!~r loA3:U: <.նz+\B85uJp $cNсMDDv2T:Ϙ(,Kufsigd9'AѦmʽYx8gA^ǙfdTA7UaI/Y,||,ʾ,bO+b}Q[hQc 4WX!y8j.U+ǑV/aɝdL.??ъi!zQ,#D_l)*|Q`qTw jzC+ Ȗk5etqQyD?ɩ2xQŵiL["U^6\hvr"#@XwA, _+ ^đfYѾ>feTOvKZcӥS>6rU\ Nšbmw- ^/r6{fZC4=`.!*9KPqb> cQ5ʺо[IY~G\I0.ۘ'IDXVgw#' =w(?n^;g~٭uZ:PlX:%׌c7%~7̆yD%t{wcm߬wy8͜)fg,5>-eJAOxU` pzz!lXeMG>̃8OLQ*=1J<_}ڛŏ̀G |bl'ѩwΫDysgeWq?(ci^ӸEf쌾ZV t_~_" Ы7,`>+$2ԩRZG&X!rG=%:l9Ž #3RY\[aa<L&6}<&.pz9G6إbK/ rM+)%F>Zvlcy/{p] pFbFh*mHNA(s: 5Q갿3&LF$ d"R"v3@?Q0x@C%t@ahUOPi'åJfvIeL7x/5:YEѯ|%~yNJw7!R,+MJjBr 1[ T>K~^Q?4ɸSИӍ7[ZS^0}&sIE9K-!i&.(J >#Rvs{+\#fɔ,NOXJC-( KbבpR#!eaI ErNzL7VČ9KK>0XZ0}X_6 /[(]$$w8HvBwỏcNodN{i6ffQk"~V7x`ӄ\ * TYdȯ0=b/D>To]KQ ʖFFM(RwIY|ާ:fqDѩ Yaq >u̝-6hfhY|$H5qM:lJ2'ΧKT$-hN.lXMcvSvƇ,hE$fZCƯrl8gs(6Rz_xմ]DpBzj,WxK6r]Xtzr6WT^s;^vk{ՒA0kQqNZ@uRJܕ}jNdg,il<9ɨ R_Əo fޑu"[1$Y*28_ig.iQ:ECr<-,w߆IP`.,~_n݌rq$tS9iVs@]dʵE~L6RGG *@)~y)!}#zCw3p  ơlS#ц^dҟ%l:qC[Ӧ;??=Es@#u 7JC;<ލv ЋΦ"eL| E+JQ_dgAd؜ɀqy/9mÿjlL?FZ3Kɪk+%@CHSQy0M`Y|Vv&M;'?W(agF.&/O;Y: )Ll>xD;`[%Q&5AL]͌'a,̗u뢏B!XYƀTL.`Rbyݔ<O5ϮYK]CQys]ny־ \Ct,΍ f (6jq[|>]A_Dmo? a^] Bp:.]M#`Ur1n<8:6g+=JPwAQhIހ5z 񮁙T "^nRۚ'W3kI :v!kFiz~*NϥR/:rܬ*\'ɨzD/%^gQiY X5}ڄ37s53#8%!%(!YUw7bZn<8IQӊj,;yF.2Y.s&o}'Im;qsgi'ΘlMӑ_}IЩS5 GbAO| /ytb&۠y1n Fy5K ӊ e0[l">bCb?uhj~%(W*2D+ Eh.;%C|`KF#f ujb,klm 8Gi}rn,B9]B޽|m+uRàZÐC/dOoax,g|kpe.UWM/,ՋvbsӨnhliGD0ܥv?K5}\R^Q`i P*8UG"e9jRG~nĴO0 gkSqs<_;0Kzuw%h%N%l`oAm@2e;RDR r*2nI#v0R[n67b#`2O7K (q\+1TCֶhEU__GNmg[Hɞa0f3!ur'=d?@q'= &|/ sXJlId1@ *}07d?緼 | ,{=>/2PKe1" ޛjg =Jm+zWya(O5QJSih!;w4QQ8BAMaƮ5A+('q DMVq{-{@c4l`P(Am%S#Pђ, S1'g JWhChbn0ΚjR1$$ %kdH٨to JU2Mk%0{'W`Jw6^~:m F.qj6m-.]L>uN61T8wKy%y{7N j%uȖN}2mY!TpyL4;uflBw'+.nj|hj wWNQo\JJTF/ciq#$Lf:>pCsd 5*s̶nNxF8܏;ēa麮@~ S *װ8ٜ^p\&!M%ҠjQEXRgVmd_0:X 4@3'$o4ԇfw\ŸQR?)M)dJv`*J4߭9{-Sv?;A,&0/'PmIQ%27VŸR軖[#)_aCj:I+i;S6f_){uˬgW¯1osp"~}QR[E & "v|5@0OCap[יg@XЃ/Ywt.l/\ =2L6-R ֯l ;oD6*[2 G!A;% v$F F-ej3  y׭ƝE_4uA//ҲGE8E4_ⅴT5` . A5g% +>UYc p-%ݬ+Ν9AYQBRمK{1jOÕuZY,o3%Iwiԩ?^fc<`|ɠwut$s27~ީA 4gEafS<y)Fd3u ƃL{~ pwͺd nDJ#Z/oSe~TH^0v൯WcsH*NHpKJ{#x]0T,CǸ3 bsm:Tj&&;ilCE0C<&Ò)~`+M,O\j$7ˉH 9(/C=tf.8gyr=ht'(9f\W}RZQpW:^Nmp٦\T۷aME1RV-ī R7QuR5}jt@=8~nݐAn<"lrfe#*['3~V<Y؛&W_ZBdbx离͠M˩it/S }:` ozat JMGfr@\KMe"\&XV7=r2X~7}/y,L,wBsDZV1;ZUِZ^=fSMN7NG }}VjKJFu?zo\D\zzǚ-;ge{E*D?bc᥌̇- RTΨ`x}* dW;2#zˋO(ZiR-vR-UD4S `ۙtztءh`-RGA[VWB殢8p~]r (֞P5KnZV X?p 쐺&B* DlBF˟ATl v^ZL-Rb>:jݢ߇*e.hE^Fqˬg`?RYsMAHq|UwU,K|AN sŲ0#(}zڻǖh{\XN~$ Ut'xfZPL- AU 755OkIڑ\ɼ,5R ,~U> ,/oB<Ե&N?˺eJy,_t7f-VC*w7VTzW( y?mH/- ȈJ$@VH d ?b0"c!GXkJpz\O/ElN0L)B' xHi1zo+-4Mtq*=  Rg{?C } ( atettZlDb!26D"uM7&]fIۏ ԉ8 zbᣅea]Nh52!Ըt2a9l٬Z9a24Ik7$Br给U?f_?x!w+ta~l.v*{ΟS32@(Od.ϳ^rt44@Sywh3ђN@{w96$VZ9E:fW47_`)ua-)mhꃈIH4Va%̉.\$n]X`I$(Oy^zzq|͏}8VT!pL\QL98yЯoܠG,D>թ`k/2>$gώpR_If ŭ{pkQu-ՠ}Md.{q YU}𐐭h[(0͓[ö[rއ_ Kl/ϭPsf+~ƶb|]s;Ou,~ Rl尩znFrXfXcߝ))ᚨFPKb3/ى;R1CWdcAj$lz`7E yGj9"-^o b3w N dM6 f!lK $EKNch@:)ӻ7Odv{[`ge|O_M1N")xUF{[[&ᕳsrF,YboP:JHNd o+(њPNhfCRc ˕Y!4g^iS'v"7V%VW!GG(;OThZEdIX?oQq,!er_1b~iHyPicjNxQ{; 8|r3}>LHϩ_^vU}m(IDǾ6Wrz @Z?! zGlYh r7b]־giXoa}|LLtːigm<mVX>R7!hf;@\@!b36g1 84^4Kgy}ڻF=Bh?|0J._ZJثOA5#tbٖHEyQz mq6(HAF\-ɃpEƓ '$:_SJģe =;y,wH@c4v{0~>tόk,1HAR5T qo9c_ 9ʖճ۸Qf_;?45>˵j^b˸L'g LKBXѮ@@tȕyEBWf~f0( t^~5sJ rz>g(|d+@jdK]ۢ]+5ٲa_?BrNWZW*Q IS7)PfV&IJ-͔rzKd[SWΧ|>X{ {EdP'&+ MB)vŘG 0zlY.^0mp 2PWsu~$zD[?lE nOtJN;f2_,PZLe?ymʸrYp:?&mBP`'|9VC^䧼AW | B@ߍ|bkG"2aBB:MH]D[Cbm5[tgg^-ɍܰ10$Hy<swZ%*]hI(ȡh:am毂,q*?42a:x ow 7^xME#S.8) _0uYfyf%n XW.[pgrt^toq NjP.̄!b~mTɞea`3_pG|RZn 9Veil@ы|k8:>ϑ fr[["xdS-GrŽ:O*7rp1MsG~2l0t cA`R4ZCX_ۅ{mc쒹|R:5y?*AHPa13ٮvʬEUpvV9el/T73EԌmBp{!u$>T426 }R.F4V|![5ewghyya UbC,:TYE9m9&u'Crƚ шZȒ+˄{*#Z˝#P\WCBś>Z%B 8럚(䈱QqZwei5A)ihV_p|]ާˆ* YS;o< }!-dxT̄#wMޤ<.0!2cwVGV/ÒZ1 E$奓6YQD_;%i4i j\!42P67PK N~@NX (3-o룍F&nyGF2r~L|IgZminyJ#Q稂X?SnYL bI܃h#-n0ȵ=`sڼԼbXIWXWf8ؚ~ƳGK!.gj0FOxT\ .Iݨ!>-Ye{Γv- k >d!CH Lf FDͽ@z5D@hLn<Quޛ`> }C0dEI$q<(p{5(I1Y5-'Ѭd|+YhʄI J$$rsWsTmѡլjI;-[iZ}!m(N֬%3)AjF`.BrB@- ;M^<o ÷ֵ, VY&`بZhSclwl5_/J6lՆè)2s@0no_{TI#[2-#^P&a/4Y^q^YɚTW%M9:ae$&~s-}ߥkJʾob&tz3t#*\;q*JFqe!5at)0(7ۢ&j;'@)Jk5ڍvِU WJtgB %wGo#V;XDp [bn24Ljf5HȧhȪ߳,5o7ST 8۠' [iK0V͸"B(>h*<M6i (9ҁKS;`G%V 'DֶA:^2m Q \^f tn:tXn{[OG!YnI;#j~٦TT^}EܥjWJ7&l>H?\k|)>4惡Ѯ P ]-NƦh%ư;/]Ƀ#gƍ&Zr{+cQ!!TY Z_o[xb^l˘FS4>aAl!)8h8;Tj`Z%ub*ܝ5'ӊezDkOn@EҾ$7mfT6,"j#z4v⻉ܷ҄ sL4K9t疸+ F{@$wKOk8/A3*a T <{K#|7DCexxg k Ydzjϒk蠋^Qvj?XA7YNG*HqkƆzA45Y݃\lI6K.vYUERƪnaYI 6Ӹ&6\'~}'b|.|O`𓋢Βg?O-kEMyDM}]wz]^z4V븨޸`ꍯW0jqD~'";'=3cmrC-Դ)԰NZR8{hn@lXqMf>F 6r)+$㽎'|uIj׳3uEg )!’qI۸&e=~1XBJ\dN~B=h(~vLZ 6?Z /i..0H2W&%\ńPQ*A>d{(·X+^S*<$TM֜YB/ M,ØzME'/t,#X^*0ڭ{C2^ %C7P%ZJC\@1<-] jXg[{4EkD.]%d.U(E+؞}5t7RV㐯N%_a\4Ra^値,#AhNbO=6.I1 ;Sq\} '3ۯ+YKdD 3 ;O!h: 2蓎pwC$UCEXX2 d*x2 a2}U/.U6 A6<(rpI7]z)e*A&AG럷8M!Uzb@_b™4'< %:v1+%Y|jxDφ Cz %4L- {l"9wԡh90V] s;k.(_{8Fе QIT;}'R/#o$.\TO胳x>g%%{gׁ4'^yPrd֙nXF}Rri+!jg :Y饶7KOP2#VrI)~.K@2+/D)м\|/"G@G8v6?7u =^G>.<Mb(tYu;x(ˁ-eiduPQvL׭`T$V8\[kZ\;vP) Dl *)oL|g.$W)%bӄXF9W}i0{M8^.4Q߁W/RsPĔwX!|n'ha!t<~N9)Ձ1  ',OFa h:NP,jڣw SMsB= ]Ip)5޵2G&L^SeW^dg}ބߟǠNN SL# Mtصf].YoGF"eGNnw[ϤvV,|] zg$._&sA1F:j-8%SiR,$pХly Ĉ9t>ݻ!+ΆdzJKb7{-F>^ftIܸ+upp>{kDpEcoRnRz6 wK{T aG _'U)Ay)C7VuFI=k]WQig(ց`(ӫW, ]'{5!rnd3/ ΆA!9tCXadPT Z2&u^0/v%qxBHC+{{E٭`mM㡱 P%%xeAT]dQQV!_rE}:9%&#<,:!g9{U-=VۆX h (.~q|?޹ѩɶU$vkpǪ2!Rd>ъ=fs*A7}\x Yy=H*ƺųL_?L"@ gjrxRS&Y|춡KokF'K R@;M;ߜ$zf|=tzķ B6U8_O')S*H^؅;DdiDgL轌] b;e E(q~q2oĬ#Jq-o}6&:ϣHp̮/f8> e@_a#~^fOxQ}Pi[k7c c[̷MmA*,]% r?l[Wj% nN/.Nj d.HinUd_g0 3>l`Ud|߆% EGtUe6NcAWȵUCcu?l<Ǝ< " Ό9Tn r<:ЫkkoWi"'}x)|4ɇwKTG`QM[ρ^FiБj-n;3-w @l#v\̐{)詿Ry?3Vs'qO"irf3#: !@>4**=?:QbpPy=yN@\Y֦ 3jIJ2oзm~~)- ] ëEj |,|LM*Bب . u>02o?b qQ JƐ"zi,ݢؔS6' '4 W++<+V{;I9}Qd=/hlep1AYI6oF[Mi4}Kg^= snoSG.4. ]zl/a޻*y.MaK>^E}bh1Ny ,S Ǩk$^5g{>ݧfz} AN٥*1@dQsZ/"r+q?[ '3F-1M f|&ۀ31>G2g噠*ײeZ5vw@qe-S)*q[%iN_2(w r>9ʊϤ3qFP9-+>ӳt@}u6tPU" a[=41*E!(z;>e'f5yC@@,A2D eVnlp є藟IW xC1N HxV;;_\`Td[Ő xh,aN}41{;*:&iPnZ>⟚[""`wBT+D1d,Q^gh_$&woy$A(M+VPGˉ5W F_҉+\ %|ǏTȫ]CXy9<8,G |INut 2޲wKϳ,m[3.ڄ{4 ]c2YoQl[\ͳH\Xw ׻>2<j :2sMGpt:32ojp8. v8_;ADDޙTPd8!1P%%@ܯ7yFzāؿ냘). ^%E~$k R[UPEN_-UWA.g$]EI[]"lhZَ؀`\ $!ʮFjьcR~/ 8,L-a/aOĩ_;{DOA+b8sL/o2b{/+|9߉Gσa?)A7IǮ&,FnDӃR_$&:i=bYYIX_551q: `{9T4u'tWF9ߝ|j/(zJMc'M’ٟ7°j^)jkqzu؀&?cv-A4MQ*{ޔ]CI99TEG89mX kˆΜ`A"^_=!6r8OjX'1b8V6)8ׇ<wMOJM]X`L ;uE+O,C5g 6lDܭX\svmVfzF7fMb>p778c7=/)RmsB(-Mu?m)f 0P56ͪis+rZSZˑO6PI ߷t .=2J>xю>HČDܕaԙlXAWH2"eف\LKϸ]|G ۂ>5ʶ4@=&Zv<@쓮og3TyP`<Ͷ+m:k^anǦQ Wz^r}r'ݏ%ɫվ=YٝdH69v"tdX_ T~+dE^]|Cqj3 Z"9 6:遈z Z'Hy`][؆0GQFOnmڧ7 _ ˄[9K1C&{n"YyI:>1h <.[*)yF )y?.6ܞܽWVeɿqCG'8ݓjгym3P0S)s/lbHK0]i )zr{Kw(0RM41{|ç^<0?,C1'ɁJ>f-G.3Dd7M-a}΢d-f4&(bbn{"V~)-uI/hŹ|\B [I8^8"Х+=|`?:$rv lzߛ=%z`~F-wf9rB'ES5~=$SpmM s3M=w,k`d2|#ɸXOGߜb7/7'3,N 6[q{'L4Tis9Moa,vjK:xǷ-)d0 f Zw:Ȅg)^z.`b [=9StLGT)) Bvz &an׎&|[Kh$/phUm7tǒbhqbsʽ)iak |o^@0Fv:R<>8kk^#{7^v]a9"['~"J"}E/>JhͮRa},)*t{yp۶ZkU}sFrrk=pq *"`ȶ`'Ưqf9q7uy[-_66)MR~Kg*Vc,gqb]V䔻TQ/*ɲrq5jjEIU}sGIkHXmPaŽZk߃ ˀtlpnjo$)j7QVb)FWZݺOxew CXm!i Yqp9Ѷ$ vOAjjKewq_&ܮFsSH%SF?TR ǺAT.85`Fx)J1#0]5,2w35&{0Bٟ/ؤWepg&+;H 뤑{b?^|?J:^BE!Sӌ&gD#* lK6@kPeζ?_4r(/?{-.o6E(lm\w]9'fRtFBOJ$䤤n-Vi_ p6nʙIDGP֪P2}3:i fW\uwnNTEȋ;mdVKso\!BY #k@U^9[<~Q$5JmeCȄ"/`E0уܶ'f)`' o=v/U0K%.σ[^G^Pjd_.`)N+3lb*/uꑢ<n_̂ D]HG9Ѱ'{PK&4s>npS nd_ܚ#q9""Hܻ`ƑhCYw6va28aj>][٤6wI󩎇/bwD Z)n DN0h#~ް Jk!]e+A>ߤ_™T.)g[:ii$lwm{,X!S_`~Obkd.N9D-&d=U#3-f _Y9$##x#;`M>ZH&\XL8E/s7N+m)o+oH`M,Ø6}]f$AZMGRs-*R=ԟ`w(rv:o3Kt׼كuW-t5s,&\ %`(vݝO_۸r#>µnaJG=MbmB7LX0u)ʺ)yNީC7oMh^OkaXP`؎;^) Hw%i3kXldؤrt"?L((DEe}zwRŠ}Gί zxņ,"`,E1/z**6(g` 1npF#=~v}Zx8t\xP'i3r_Ww5 ;{uz "+&Xy.1κf-"c#֮qE5"/$aCiKhz5ʴNzd՚+FKיL&޳)g^?{Bjޅx֦: YhdMز-%26WQ*T,"~UX.4~;Zc@ XCѬ'_uv1|Zn~mqLGe:Ml$4EMl13V,M{Dx3o}@| %tj?KQ,!j5oօفċ6r+̝NfW<368xQ"NZձ lI:Of@ B=F}sqc,Q ׄ.O).ex0r4=5x^=%^5+G8l5qʌׯ\Cz>sD#׹M^Ɛd pU;` $1z9e`5BH3"3%A֯߃Ić[xZB]6@bP ؤd i6+VUfյ=G 9RdB&Q4o>KtY%a//FUKf)]U9(^ŏקyHE=5[)RL{AU)?bF+$e{D*/FB!:Y@D}rfG0H՛sxizED\`c~QpfG +G FzWQEaФ^ ] 8KTc67,/oFy3(k?]d18\Tw+[=_>5B `[8 G`^_MO4֣kyll!wNB"]#f9 ܥk~wfaUe'Y{ YmGN$;3,sT"$>|Fb+.xq|cJ=fͣHZ3K䶙VIYwD2pie 3)F5}H:b xd-%w/݊//i*8G7%NUCDE#[br#}֫ ! e&J]'=^դGKZ togC{"ܓ!wq WbYɞ|7dܱMD9\*ߵIT,sȵ @ !`'n}F0JdK-Xdu':%NƊvxpnHiXm2sǻ[W& [8gkXfWCׯ{DKsּ]M/SgwF9G?ڤΰҷ[{ 3]w%e)SLnh4]^Ln ǤjM˔fU4]n{{`N$glYjazREtj>-[v 4ND vH?g`4-ke ˕R| *m ɣ3 / "@ 0*xqaƱ-m_*`3sRzpS9.LcWslAHȽXB8$@:* ~FRl {9v ShZwկtz{)l됂S8suJ3Q4}1u@Gx~FAj[bkEq/0-P$4-k]b:˦M}[g߶XiRfn( WMF{[T ᖇKfHppzo߄$Ŋ^mSU.JyW9,c?&$xr"5bxP@t!:Kv\ Zc買):ͧtKA{΂,T %@58jկtx "nڨl bj!%5PPs^+,(H4BIb©ec^~@>k? L_;ӹ+T1~%ּ]_hC@11x!U4\81lVKxuP D*P%LU tI=C1`3(xk +~!I6:9#A:=ظr!B`Ȣ=DŮ?trdG{a¨!߶iTkX&%5[2cXȹR&b+"_ Qư m nYFh(`1r^_&@+fC}^h F*1<'=P(Q6CfeNpUSvOСm$=B3Vѡ~DަPoP"*Q@5\8 \tKfv|ԍB~ !mvzMN[)>;@"@q]e*O3Z@7J]͹NαJjZ%{SIZpy8aUo=Hs>,VEڸއ[C|fWձTρ!5㊆JG4:Mz@Ξu&~-TsLsWouc^7-Б|N$@ng/ F[}q^U~4jZ$VB>d?.Rf9 Ŕ6۟'bUXB=.4a%>{/HyJ{c.7fF$ PEvO|,LwջS6-vsk'+!Ic I.ǐUM>1#R/(Ye$DS^Ձ+6ľ |c#^%,N~L7ElϪ.!'@=*{T+Ykn{ԵA*g At(FJ>&-\@FO"9[܃ ʥt,$S5)jZ3nRfkܗU2  [kG #ߡ4p TIt{ԇ:@h Z *S>v}M{.+NG$>sQ8wUqرGKRNi6^@s^tL[}&5S~iɕ#ÿa'> cnv%E@*l8t߸'j{Y Vأ ,.ZS$s_ yM9 ` &dB~v n2=('ռ i E4:w[,f2.Ů?ztHBrl&1Q<I%2$%C~3~׫EK{Rap0F~Mja2 Ԭ\(}U}bAEɾ璢 iR^NїoH@Oó6lXI4rz#q5~^ղd2&*DOw:R ׶ir'2A'KaQƠ'/[Rc6$i(w۞ )Up9o‰';i֠TfMO]ͶR.?a,$8IC!\6ǠᠽU2iXw7۷-#9l Q9o8Hf2 ]sqKr2FGWa>vA=9Yx.3_f!)rh kk ߩ*fTJTYn'p]#Mف'_6e׆x@_mW]#d6 ՞ 2X( 5N,s~.OYm fz+WavşOAIFNk%7*hκ~ k: WdEs߂$]gM qL 6In0 Mv8 .D_>7] 9w~Iiǃ+6|@Pw_(xie-c( }3O} K7v.r0:*/'-OTZc|>H8u3um+ْe%IPs 9~_>%"$ :@)ZR8Lض/RB|m2K pҸձAA <ܯK7x* 6Y RhMy'F#n,^Os3r:Kb:9ORg!N Q+9mZA%/b ڮ^iULkh:4LNQ(n:72 C :J_ 0 iF)"q 5Ք'&4^q8\8Q ]wuzgͶ/1U$8â(t,6Eb%M*&`FEgOӁx%]@_OX2|E'ECHkø?^qcؠP^ԭ[.m_HOX/?'`<p jpؚB@=0.%[fmq{aY9d'7{~w2}*r1e|AVSN8miydx* ҕ [D3gA&ڼZW$ HEYx? 3M' wzd֌WϜlV.`=HerQqY7hu n*Xo:5,[oYԄe;,tiQE@PV4Z olN*Ү0d߫l2$5QJi %u%m{f.mG<&jr3ẙ pIjT6XX"aT$! 63u3۲I=2M]@#8Q:vdL:m|׀V51ƍVхx dڛE"8+Ѐ OlQ,EXBCW:LUAAuƔC)H>T_@k ڧY20BSc{iwݯW.\ Ti^◈߂c ӿYVFǘQy Kq+ = ]C3soȸ."F=@IPgx&U87f` # y2s$hwP3;mH }-w8q~. h\oq˃OK{lB-Yώ Y! FUe1o/N*dy1_G X/\a2nv ۨPH:ź9 *v{׻Lp,s[ctwOҾ h/ԋh~ ENyF2Xa[5_w|`lᨎ7EԅzIwz6ߝwFgp2nElzbTj֨~a xW?,"Q*~|,"*mu?` oG!T<{8SNvn@O:ͽqIQ!;3&|$+ھLOVv?1KB']éaae5GӪOf1FqK?_Hy4m "\8'#plCCrY&uwUM/~nl\IZK{S7-C>1$5FtP~Hc'_ $@ ]Xy"8Mh"`ۆ-pqƒT0)R .WųNnI e_Bsn=sRRŐ JLDq;WFJY-nΟVM==ڭAuA: 8ľOP3PmHb`9Ϊs o>r8"M^(EB4O mv[sgNOIM4?_T wQ\\DB쿁 eI) ¨ rI'VBe\OPa2Ww8D A=$8JZb̌Y"^i{$Q"[r0W|_~Ȩ18y vJO>Q"(?W m8, l­^~k:|(|O=U9! /_ω 72S;WpG~@H ;uNx>6; YRց "80mۗ!EuBzaYmhfT *SJƢ_ ຽ̜]GMA[IRPM8,0 9b /_,,ѿ$Klu|n=h.G\Z:pHz 럈3WK'(MZy8;T)Ê; I&tw86 L/Q<# `aܼ˧Y9 ;/(p Mֲ< D2#G5СQagP2 |nal`%GID! ۠j·/hc3ᡲ̀rdDʍ| `ģiRNI$u,JP&hhv㘔3ύD>1#QUdDŽ:.*q3GԲ|DŽ L=t| "G|'-/;OMV:#Ũ#̟Uo)%!!ޜӀCGIJעeTVYڨ)B[4踀`(Rz317gQ>Ox?[fc&\UV %9;[" r\U- r@-1@&zѦqjy|]gIYLj⨯ E8qxfc8jh6P +'}Z:a-4id]~S@u6Gk7S&Gz*LȔZ,Cs \T?,4OE?6_pS]ZWz6]3 & pHzV"40G7l'V卸sbF0z1`WJ9e/Q,3|ʆHXsv/n\]JMtŎVYN;2 Č('J* I<$ih :-D jjʳ E4Ə .o.fyQ,]d,R5Os۩^rv9"U!^x&l?wjF1v %|@Ş!HE!u=rS<ĞԺ r a y !sҶZ;scfl{:f-v{wL•|a(>}/߾TOclHeܴjHTcݍVKXOaAaMҷ# iI YhlŕKz3pw?*Tg5OֹcC0t3 ѫ 9)q<|۵61H4J JQJs/f BJc?F-I#l1,} V?W}ggw i2.9:}yT](doDxE7u%[PT#]x9ziI E[_i%ir_56` :{| :ng"(*a;8jQo*J@C$ƫ%}viK0d(~nyRdh{6ưvxh} ؉sP)c~蒦C2R'V@81Ĕ#"J )I?jBS1&[Dj&(?l^8[V`C"d ̡ToJ $,?00%`ҰC˜ HZϫ"7oa8z6 }ʒ₊ x{x afoy@W(h٦DDCUeaBy H)rDLk[qOb3tqn#&MjfiM.f01Jן@Ib F0g| G*☴TF5={9JQ^TO)u!/b~"ߠf|زH|XugSM>]ݵ#e,f^g{vRpXoRB'cƜ^Ӌ讂wu}q8dv-em";@_!@H;Qv֊APq?b#}T+_:,ŖpnL0 EdM1ug4G9LX+t)7ӜoD*CG0Tʛg]Uմ䍴HfYp|3t9s?M ds( as8lȉE~SCI ١6Teɪddn#aq$q;1C"@x g{YD7_{TY=͵#Hd4&u5g* cSA6޿"].\ +ⳏ=<mTYDjJ(aT֗*\cL1,][:ʶ/nv qËsQⳖ_cB])­O^/Ut )2?혿GYumP!<@> |e+`oWʧ-ңd-//u^g+C/K㳰)F񇖿 w.z<0'UN&K 46l7΋;2Ֆ,<- M%KXuxfb: riR.=a\BzB1{;xhu)n]իZG#48CRI\1xX7 Fsng3E,YJ^/IX$䐝Ԕf%l\L| &R5+Vm3rTT)F 5@h J': F:hP> ASyv( 1Y?E]ƣ%@|-D@DfC CPXn#)7Z%lG(:WDڲWr< ,y4C0Xi[NPTljuF["X/K)C~MӋ K"6y2vY~rIdL4bYD@v†|h 5a/ZBr5iǤbղ '\?ҷ4]2wfc{5Oݹ_^5lLZBAޤms #ZWclbLd4H=anX!O}> _/to|8){&pH3|bQL )]}V|x S\GQZtR{b}>Q ֒<Ф#}_o76Id0CS^ЪP^xp?v=3B 1nX3"W7Y!S[Y^__x1]Vȩ_5:ߑ{߉'}s{q=P܂uNUN9vCs:uhv"M %Xbf6Zŭ <%h]cPC=-uOVNIt}=a#f69xSD{{&cc 0گp[ {G0^єAZvt=fX sH^!Og;Quj{ 2qJԂ#q>x;n>TM}=x! |#+ 1v{kG-ZI7F-|u*@oo\7o*tg v2s gZ"ΐ+;sכUBƖJ)&cW*uA4nwբ[ ~( 쥪wO$;~sʃ!$,?F2/)N<ShgOxlgY_ ʶi+L,fқ<2+jFG2\(J3}'huJǁz|Y1ZV Fjis'F"o_Q:!MTs*KCfViFI%*E-]B`g1:=efn#iXeÒ˹V7U&uɒ?)9Q~Ec߰l묟I.knj.K'e.yJm;/[_SYG0A]l7F{<_3EL/riA6 -J/EVP?rqb83nN(܈NDG &]ݭ4Y*>:{ haet:Z:|GFGvTO{L4puqayԛgsLPTL.b (bO/Df˫0Q!szMO]Jgq^ig|@bǩ鸬APqD<ŸP5',͡\rk2Y8J:BdzF(:HIn(¡L@qNxI;" i%77;wKTLr{לi5qQ`OBL?wTwZPi`m咮N Zn(wK4k>U5pWA0^HMK[>81\F+" z:`r&`n%OCJOHJ*]yOȯVC5yuϢ;1D*Hj>6PcTJHJqYf$48AfpL`­C=h4Lh\+yj6L֜Ktb ?Dےz&w}^L@ D(XMU.>STFM |ĩ>3H[.5X{6}ls?5/`#rvc-;P6ky-}]pKoS ]p vczeZn%d m7x$2Z2b2t7<#]eCq|-Kb(F}l3 ST^uK@+BѾ>36T%hA *eԛYw,3b:boؔS!B*`9vEn%!zAaTk 澌 [?⏡ȀW'V -115U3뺳h9&e>; EAӵ#IJ=>_gKov)a*` H#ZKщ ^Osn/ J*-.?0~u\l} _!S(@HIBqČ8!jֳ[֤]jҊ@AJMn{Yq"+4d,[Y<`PnRq(.}̠4yZ2]s0cH,߸nQ_2 Nj sk X-]r%3YjDrSePTwI oUyv`һ:DW1Z h7yb\ӊ슜B|'C4O VǏ}Ϩ^&!cW>:/YaPGQBkT!YvtppFjlQDe{ȡ(nx4+ɖJ4IM!$-lLGf~yA"Bë^)na El5H.jk+fG;Br[=/W&UVF3[OFDcij]C(( T9UW +bO/jW[4Z`;D"bҢM3_']FL7?IM,9*-Ĩ ]LY7\ѸA KtY{~%"{ӁLмT;m#,剐 U'SYC#Vp) [y`91L7ب w/(v^!xEk3i㢻Hݎ` /YZ?03/ٴ;4R_Gm n,pkn>LJ^60AXT"j# ޡA5e3 #[}^o'tsūzK"ߎ$w~g=D/m'DNIiCSajPy9,ξw©xSug1kVp?.Q.,y?x_1>?SpCphN^lȨC]@JIZ3ULIԳ Kgݴkh,)ɜitYŇ9 /ngJwYM'\Ǧ 3K^W5;s񤻴@u1 _~jȅPnr 1ٝk2bܜJLkh~^!ԯLvAU;UbdRtj~MjB%ӥH pPBH6ja{%U+w[m,+Fw SZ^QvǐV0AQA1QLQfOYF?8|zgʤT㿅[HKNl}/Ҍc5Wyu}Cބ*hJ v氢R<-5XO {^~M|^72gɎtT{$u&w`;U":Bu,\طgO`L-е=Zb5s-)6bp _ qvH= ]A;M3~UffFnzbj *Sr\^yMK%_5[0ġ${`v|0Pb~ԓw%B" \JK,{W4x/&s* I\_frK@/އ1QzLoTWx57uĝo`ԃmڑ?v='riM{F ʞqMU=g^O<7RwGV֠=jjknrHaQhjaAUmLYJטCsʣ ߆z҇O  "s>?PkܑV*(; o { [ң<$%x^Z*aj1L$*eCfAE>Aws@!㲈ߞ9Tu%p^5D&_^qg4` yH|(eE.үcYC$heW$`x<5|^=(((a8yNL1͜9Fb4,|K]])x%FqD"wrbgњWq ̅xxefznp+HtD]7]FE{!5WgJ #}3ઃ9fZ#L9_gEitF8 Ҵ&V?$W!V6JBFF` l,!İRbs܊<7plJo)yz%x|D!kE`$w[+1U;N>d熷eۛXB̆zq:&4Añ$N3gѲ&zݱDdD1ݮ.ݱ:8O0ǣhOÄ[: p Q˒`ґ#G#? oqͰv* K9EbGq&FXFX.Ma!yqba zH^A@}ZTpy5~~I*Asd޵fb0[@#(]mJL-kY@LY}t'#|L@NoϞ0M>G&O|4]tJ}lâ5jԆԥv053XQ``SL09wP@@N\`tSe:}!A kg7yT ӏ\'۩MsQk}'n#r/P[$pիb`j+&ES0LHDw*dž|X4s$փMCAK_2l뿙}߹ǁ^Q-9fhYlSwT{ 3,k9%P`)(67yxGzBZ[=(V@8 CsĎ >.gx&)3o^hsI7 $Vb+4?+_kO +uVjܡ^GbཥS_@AJh5KSG΃RP"D S"Xǽ "YK@8k~Mx#øpC=ɚ"[=CvU[ Ø':kV#-ŜN.u,YI SPy+/`F4k[%7)YopզQ@ q YIdтVOI1|;}q\09c8A},{[,gyӳqmaoCuۗ%R*'8)qBb#1p ;DjҳYm>|B`ݮd5#1r09^u^ | \NmI?N"=ugW1Yu&$6h Z4q1hLo:6!?pqx$ee'}! I 7jPb*S}Žx7_Y#hb,?dِb=Е\.UJXB9ݯ5ۡ1Br5j@)ɟt9A?hĔjfwȻhr^ao=2ZvoWg+s`,*TF>A:(u)fg䟓U6|ofdnlo2eEEھ3sJ|v&d0(9&'o/}F7DVwހvΌ㩟887=Iw"ZoTt Cz}Ip]emTq`p$&G -g#B”UM=ÅEʫبsN?~>0JFD۩|X 3\.jhewi8" vNXpwCGaK^5@eS9~3l6ڗvET2-lTa{x4r<>97ӥ"δ/H^Ajݔcyq)G[JQ[(?m^ϫI8o2orB. s uĩ z.'K?82.ꀵb 5tiqj4z*,qКԿtpT_Z+PSU?[{_YpY I6?'{C;N(wWMsi[cK;oY}!6PVMި iH/ tZ/ϵ$%$Y"vˆ w>ېݽ]"xv.K񎴦8o lIicYD[Y *܊SW.j yGI%tWqz7|.S.pXKnߙ}VAT~U870Q@o(W_mcZyASs3aÓ5Xv& wc i]6+WSLUYʋPw>ꮱT_hNۡa'\昡>'/|g.?>Lc #($vv0Y'%`Nѫ6M,G%%6@Zad3>*fć@w=qK+Qpw yh&^.>ݞ*Q'.^Uyk޲f\s0Nוr/BK_]LމY埮E95KES3CulNPj9Ԉza@GޝAw^r VTu} wjE\  HP<)<`XڃVqdXxςwvP@n] 1YZ/$ I!Sb:)4v$ن#W:*#oQ~ݹ =V<;gYpl Fv_ W)t xxvTfX%(x_OiZvW̕e0o] N/oT*uD^u'3nUߞ&3 M)ЭO:bVDp 9ʱp9K'(2S4ojr{u.@gz`>PQZE̘m3a%i7j͹(}u i|Cztf;%"3su|+ vNJ;a dPuھTNR\GdWUNn-u2+]HNg9َqG<.vgӌK Om3el\zAŞ73fau:*ML(e|b_Zim U\ [(%PdJMŅlfx1}8ssFdeUڼ\!\aD\7!; Gᄐh0`hk%@ @yӈ%c&$@/!pX 5+UeH] e1:1a*y:$Ko&z;3a7-s?Z ce^57w4؆ؐzֿrRpk)~wdYw@v3c+\/zNwZotiNF|n3c1gV]n?Ts` Y?wcl"@8]NύUd~c  1Rǡq6ݙGV"k\ĘMXOmL/wdpdduC_m>M=.ٖl;~iZ`q鐰2l $f{_0X!Gu60Yƪd]G@U brVMqB'cla'{3#oT`W<1GYz%l"@ ۖ>)_S@)@fa]f 7273p0)$+. &9uT#Y@|Ī\$29~a?6NP6mDuЩnM|E"r:ꐌnEF3+E#c8 ŁM0/6͸lꋠIe ƣ0,rbЫ 2>[$KrPڍ@[2>Y-ɄuA,uns//ye]QJ@L6Nx1G%a jCp%Zu 6C9~:蘨~T6`>i>6/k77)6 g:Xldz5!Sl}d)_SB*;UtMR7 .֥Z2߮و9SM}6*OW%N}Q鰥\@2؋2J/nlvE܁.T:w)_c72t4ۂ] ܋}ABFYLU|yq$P@`4,E&|X1GȒu.%S/|8xbXTI1ݖmc/$-hg!tcR i8(׋+ ydrH^GmQqC& _/‘"w%ab+ I_{uUh䒀R=g2>8(Fc|͜XOӠܳ Gd;Ńy*R`Oy>]ϮQnx͇y&h! ͥis)$y}TLy;Ab|WAx[DZ:7^Qw@2-|GT V\lD]PZ^pU?HBmG&Ӄ]aW@FaDo~}j ^oŶHwRiPnIAB,>%ك\> Y(Kqw%!U~E-?i8ya_Si(@Mִ02exk-!HOf>C_&͵{Ll6Ls|6݂ "3Ǘul@;z/w*h &\^MNt? Z_3Omb!r<|Ff 9}3Yh66 B9Ay{>, &#K6msw7mQ٥c rԩrBD\]\pu $dΑ!bgO}A/& C WU׉;ymY;ҽ,sd ]t股ZېM&+/ߩ6 )"dž ^5ŞmH)Vԋ 8~Cw)sKP0ϥQNVZ&y_PS^;QzIi==CC^4Z5 KQ$ [{ ]g}zOp C$joۈ ]0h`N dvm]0WS0 }a^[q?;۽yTVIn(΃&D*O9M<%B\|3!Szq|kT]y79F/)Q`@Cj~ڜFCN FXӲՒyurPQാ!H+QXW5Y#7)96QVa}SẄ́NjCَ=BDe36'4Uѣ}/{Ęީ*jVQ}8}vstis.08!͜aäˢj#f:0\a?z`+oYci.b! uT;N&z qz=[+X[ס4>+ܓ (9'c/R}Pk< g2k&k\'s95gQ~l3}Pn#K_Ӏ[?6|m:*^p| 5?٪] ,& u![FX6r@}7Y Q3f߼Z)JrjϠ]LXEP'8#4 .oraC nC cEbc'GW:V='0[,tڐtGE-~I=P`d/E!|ylggC~ '%BA6 Ƹmi)ŒZy ĦwCK޼c(rc,_31cʜs(GEh "}uD%:Pm ()䮁>y׃LWp!SV财 0 mŊ9-fT2a!a\d} AHR2ɽYr1Ҫ ]$^vvyzƔ UG֐f ooI坘#CN܋h:4V^^0V=巸 :1g+-A*J9m]RZzOfX$/xf`q"gb$ )^jmΓp^ ܇Zmf#1b> ;"A;W^ ~^`J~LaXA=M##Q/])ۡ;&T'E !A˩>$V ƛà-\h6)9Eʷ%ŦwE:|=6t W[7fR4wLaqf/]-U4bB! Ϛu4f ĵO͆ۀ姫Y@>`(E|M@þO[ܡHEԂ&hDt$jFvqTaCU1[`F}u؋@!Q yʘի+mw?mg,l=]-Р ,wip]L\+puc!dY|JVFю }QoH-N*+s<fEQp4QX0 qP{ Zedܕ/-P슒:VV%X̲$@z"G5t Jh#GuUbNk8 m$juH{/VEppc^ h@0Sׁ#r<\xX5iv謍k`ӏc].HM(S"u8ArF D\ |wV{lZ&Bq<驨k1&\Owб'i &P  ~˙^j y[-7*?[T3}6lb +{5G[F"usަkr9 l|J"UK#_[B' I~eeVg}*)28z€aHs}*PL) t܇Nj*mH)TL Jah|N ,UBP.$jMn#=_= JBmJ賋cONJkM0Hd<*&`6QE0jhh6"#1QBv-K1 5B'kְm"xfl1Wd)?8p3Ȳ" $7gMFWUb)8c:#61P&۴]KE3e+(ufc\DHɯ(a{xrQFVPvAf59mJEެ ڛ)&yJa /l1E1K g3SE3pyJ1' ʼ'@f5ؚ0C!1O54^ V`:NPKukT}gI׳*tX` HCgNjЧdp+ӣlCEv̥,!ihr, 0[*\;^ ͋qxE&QOu;YAOh2a.ml>>.13iL% YiR.˃,_DaO>"%>" puR.*+QJ 8]', e\Xy".nYu- m5+1>p? R\xۉS40`6|O؁LRmx{ݸ2˦H,W0u ;`)6Ȏy4#orL'p@Hf v•8C\*VDe\(T4^^uwH* Y[z1aO5mx 9,+X>(֎GqB1=ms %Yg~, -W޳M+lh`Mʌ7 bpBxBH &P0&z5{ NaIUY'֝KjD<9jE)4Kba͸eyLlj~|0ȠvJLqx@NC{-iho.nyͷ|ԅ.ŵT})KɷFSOЕׯ1c7Ԯ.qW~^i30lTv JYI`[#6Z3yے {Ή$ύ'xD e#{ýl>!Uru~\) O#JÞ5\#hG}ʅJ[Ua]YcWDz*p0 5DsS.LKp1RU.9qZrL8x[Ę+KpG:4,Gqp"0VDPuV#,NWo.Ԧֽm}u{ȿ\e)ݓD=O},a;lH$efP͍ n;b739͇L[Dp?".< 24/ ̜ϖ}ҨͤyȰsX˳&CtXKr! A|X֛e+IgX˂9_(nrtc_쪷~AGk_?WzA n,`U貸rZipc B B+v2 Nt%5A=0D/]WgSCÓV2Y'n1*ea0.򿃄>-Ϸp.5Lbk8jj6 # 0Hm` RO|X=VRMd&0R3&c;"@ 1aBS)gTRT^6vf{7Ļz usMQ7F45 e$zޒ+a0}L402yMwUwe\<M[;!bRA\c"u՞0c(`<%^p_d?OQ4D! p=S#O+ñ໐8R1:y]ҲS5 sbE6t'+ҀI v(.!ycهgK#sxjړ/ٌB>$(/¹M"ʝW93SB*r[7rOЉG9]~Ic (KV ^HR( ݪ2Y01Pt0hC}d {mCpSx7ԖK~o#t^Ji++ʛaiBqAtINk"a i;#,ug iSЖFDA;+ěn2xS( @ ەU!Y_e}1<@Cz]㈞o.W^^ n;$ӆ*2R7aʚl3/)ASܿ$][_NK*1hްRqU31կaIa3,0tl#"/ю3>D)r03f80.rK 6oI`YYelu~Ǥwg|L0p:U" ?X$(C<Nfxg|k a>qq]%~MqT(_7Kz\g{L+Ҭ@58MԢ. ehżc6қpAK 1 U+uCS}Da:}ht:hҮ+It1b6S{0)-!Mz49d #(*xM a{9|:nGAIسkuQ_}L۵/R3+I\c4:iI=Ň/p~1|qWq!8K zA56^b[0MI&CGj24|7H$k tX&D Dxs!#S'&L 4[7crћԙU5s^Z#14P˚̣i X̏ōBKWI3 7'.Ef\Y jiqcs&j@["# UrekT8 rh$޶QaHVA ӯn$U!>QH(2A#=8:#Q} }2B> Aïˌn)1!9Hl=xp[UE"{dcqg3G|g*d !yrƲFOc 56vҭ܁t#SV;#ʟ~jl@- *WS࢓,z/W$Ѣh+gmb2{tk(u+qn׬X;aVk,D}XJC{ 5S?(Dcmwd1q_QtAH+GJԡ9 ?!l`dЩ=lSvY=}K>sYZ4YJ{h~-|BqjYTRªh#Cd8sd^0$@r_M'rmWv~NZ}W+MoVGq%u\0p3l3}ђ>O"k}O`Gf"jIFƓFceAyq6) '6H^>z&"43v0}IBۙ.Kʔ\ p qvю؜^٫;d $S')}< PJܯ2o9-{UY4?֊ X` w!4IJ(Me+u='Aڠx ~7 Jnp3Ŝ8=r?WhUۻqVtOtΗ;B)D0֣= ➿w+^Zy7VQMFGңF?9;E6@"}x@( mJ6^Yy<QCldt) pT錷Z @2Qk6J34l姁*,1n {xꁻЍ0tX8JY+n9 "@"uuF&'%lFB|m |dCҫC(%~'>ڍK|Cj`3s n}ffnmj\LXBI)(܌LI]Ijq_r9Q9)JA 1q\ʕdf=s_cM1-im>17tO!k=,vVcik7]Oҹ4",1 #žYZg"TzeB~Y9{ }r;Zotx:o'3[M)9)8-n-I3APdf]y wTR%XeS6#}IrG9]vZvۊ"mAlKuEyro{h)O[_: Zd7G ODFx]ͦ,`LpR+zJ1ZEB:Ax*4vkwԖ/.T-^ l!JERl'r Y-yi}C,?o;[zXҁM=h0! Wz rQ[ 8h~Rڊ >wxJȹX'mL –ޙ=9⎹P8{S ׺>o_q]l7?\""tѧ?=2?fWVd? GX{FߦWjTMp!s]_1Ư70̯}јX9 $9`y~{JqVfu>MT敵PWT&){ b(Cu<9jm+[?GTĒU)U:#'ٸBi}v(uϾN׬"&Os]^٪k$|zlԗP-C_ơg1a|gLV2+z3wkA%>,RRSpL 68`eD[eg݅bQ7kMvc#PQ 5JcEȦsALښb} ^`q*T>yr]?\zjLS-Tq*ZJkI4CgKZ fl,ƫZ.ds}z4xwN@h,k ;>cf nJ y9sDbPyqrzFl k2~zh}%P`;:`![\pwVJv W )cĻ4pYCFC䂊؎bO鸝4 Ö'R>7A6-g&[[&l b=? ԻA+CS/c0Ő]}ם$ I;kYd6(X2=r2XrdlS:#0Oyot C N(sǖdܗjH$^,a ~mQS6IFbtF )zrٝ*o#a_i:S O,[MC8 b!.oe2/#%,>/B GPsSP~{WDԪDcȵOlyB,D)]ۃR2Uqף}Dɴ);w I֎П]9 ? b8zؘ_\AkYZxx4-Ef#HK@&6􂗱W;KeR zC%M{df2X~X[nF4cMYƛr,qXHG1= @ xWh0mQ`u*GcuŃQP-s\$>dk0de/IA)UpLsH(YZ`*bNI_|Rh(ӷ~`獼EnQc,DX7} Fi7ف_a8 i]*MfY@DAj~88[xلPjClZB#?UQ\]&?;$(;N"F7;'Rzq7iX#f9{CQqCNh5WO/ff$Uʱbϱd;J|$<֓z;.6> ӽEm`v 9Nblt7#e@5Tkཿx7;Skds$q "ǹ!ޓ'2e55Xl]zaxW#q19D>,vӲ1S0D'oTnI(~$Q﫩}*Hh#F#~4Ec꽄F\Ǩ5~X~B8ZRQ>pZ`- @ޞXIp5rQ[/Bz!v7Ա 6nySCM-M* `Ըxk 8CqTIЍx3fO =K7^gqnQ1LOdc5!^ECnUǸե'Kq+za&mIpwx"T3&9Ǝw&NvC3Q]7h"hB: =aE@m !he$PaX Bw~E}OxK11W]!ń/)e25n>T6pf<O%)6 /w^Rƈ@&yj{i`U`0vsƚ~tJUŕ'6A!(PbU!&g\"-Qs[`rGTAD}j3 c -YI:Pa!4rJ#\wI(&I͙j@->)*`m@`V")YN:=c|}U&_)cLUQcŵY"J٣sێFWC3MMrJY-7ES]wS UB+V ⥏ּL{!d ^o/E꜏~`Q׻O&7B4ÿ,1w>҄=h:-g`c`3CB +:D!5_)>O- ('@#$&thآVhdggq ȈYEFmsCfdM17<{Wu5n81[ "Ӑ݊GݖPz8fm?͞f-Bᩈc$)t6 ,e? }S 9B%+NpθpRV0yӕCK4OF,Qv̒ (D.~`yJ">BΦ0r9pUEYÞדKPcCfE>aqB ztfGS4LW,>09~H:aA;ca?pX$& !բ1q^s`YWl36)T7 n)2/rm\9}Y.8,>`PG9q5ǵpWɶ {SǞfy? PUo.Soʯ^D,!(pT2^2x1wqېF\7z€h{3M6n`B;tÜʨİzA$bHG}H?y-5f,P6'Ohxynmەn*~_E*I k10@vBk6ޜsyCVu573J\l)bB(Tq6DcI[S\K}T/i֪'z3Mu0v:j刯J%2ƙg4t~lإ/r a} &u/ڇ~%7ju[O Ko`L^h]{BE%= 6Dr&AV'Ajeъ${O;vsB81>FɥdgjQ²P%?ןmT|礖 +ɽ<@9-ⴈ8i -̀Ju+wy{z:OD]sh$],-*k_ih \UaTLJ4K'~yO"Bfi`x)V&-ƠJeɹ?3/p3#ĉrO5P{#K0QnorLA2c%-ɣ (߼%Lu-d0HNj1#(kDpSt54U=qjGa I.\5: i>WS ^Fz]•̱2hˍ ?6b{1'[FG /GR@e3dxp^*K)M7SjLfܾJr<K>i╍RM-;tyemH>E7gk涖N*S75c*=Tm=,)ob*7␯),w/'nMʨ4X1V.SO{K$b'G>m&S"?ڇ4:ϒTo7p*~7e?q9]m#9!)C;B3Q8rZh-vcaaD`>i>/[$sj31f kZE@$8VΞJĿU߷-؞4j|#cy.Gpdg4wUMvGGmp&m03i'/mψ %UzK7*7/ewxeSUEo(L%V6v:Š"ZBH#(߃34BDm0㛒n(\QE0[-#m"4֖\^^Aml){bj$T\\/1ІQA 7#f1$BQПv\"R\F,^w||"?`&Mlߺ3YK(\uట!_4Md?v`%lGOԬ.%n$*d)|FHrTsc dQ};$R2C"iԉր3:7Y-#COaWܒ5-UB>)wɌ^jg%G>7/.16zglЎű܄ń/2*u FidV=`+7,I_]Bei7֫n%zH`Fk1y *»6Z ^D{R$s3:P(9Ӎc9ӘɺYjTo!ӱczz@s@m8DCYAGS 0Vr7P0?3i:+p oXk ׆7ڕbbޢ+`f磑L_72޽\R^`rQasb{x'6`y4lSI_fZ{`L7$HA(-2ή0Ovhk2Q_alOdD7lZtp׆ K|'=,w}U9rgI ewvT !PUx[KYNYƃ!@\ ~ Ãi%E$[rDc. iB#ikf0{t!%#@yK JFX̋ B*j*Xw/'#|&A麦X[Gl%yupT;V';1w{3gMH4D/O,ٓlrӪbrö}Խ* 2K[ۛy[U }>"7ƛEό+yHB =M_֌ }BMWamEfWdׯ%o .bX^ЗN_4KL`Hq@g v'GVhpx>&du|6Q"7EX*\YKfE4lr*X%n a)kI֢}GkԠLjs# a7ށ7(r+˫%D6DDH=f;izv\ 19 tq{AG #qɖ2'x-$93*M pj>_hb.*G|"M9Js*s+ˋkx7D&Z5%&+f^,Ss*s/U\AJjp7A}r4{򚩧T1$oO7Pwc_|d͛}:㍜g43!)p06835䙖謘[u ɔ~ji3Ov@! ^:yEs`Јll} 'zHG{UB,e!ڀ|#__޼n"wq^ jw Qމ^P98 WIZxŘ}qC jOPcؿs!psÏXD 3#o^"&YݟB: L`;dTiRw?-9ӽ]fAf]7FyI߸gB+{u8k$j\ͽc#fMHЗ~WXpv 48cDGw <_e%^+^J%{:zUT3{5>__\]Є`W{*@v'o9\m|X.ɬl0|Ԝv@ͺ2OeÍ Ep#┴/R(7 /?HRc~ik`k/*#%ߋtQxT:n\]DV5`` #踜LDz7"Q_w-I=NN|ȃJ3]?얳I_N'D֓0UCM,u18$|F^RNbN+E|~вIFA*Iq^$Bt<~ʬB3?#l4ܚo 5 t\ge`++o9D,RiWFtqP#`5&ٵA$ krq,1(/fN *2& W}Ųy.hj̷kKַRuI bLGONz^v_9$ϝq9>O] ^yxM8UЋ9)E{E ,Y aY;*,XZ'pԼX9Fӫ*5OޫJwcĹ 9Ϙ/kwJK{}MRAԤ>Q_2*:LnlXr.iRWԇk\Ț ySf nRuBʕ2^W=XuGFo3/x%mmodD7[8o ҡz:qc4ubֳؑ^'&"W7UaZO2vw΀\J$Ey@OpYDM<=5)=\]ඔVD&UAx.5@ %ATԡ-(l X5i˔"5+oero/¥Jg-D\>Jj8f1qT|B __mKH*XKKڡa/]/zFHH`-u-&,{[柖JVUPfKYdS Q41&^uD|JëbqHR*؉Dq۔H1hy7?3t9s!T0,H^B,Aؽf0PJf}_JU2 q0pM='a/~^2/3%)v$5sۚwa|$uA1b۶ D'Gõga`*|5hՓ sEC02'3 aC R{k#5&  Rb-2;P⌥XÑaе OHP髥$+h16kb_ʸzqĝȋom,92ȴHBQƃ,Ȭ, \,Qfùn,[wS*;[Q{Ud&nD5GtH)`B^&Ǫ|EH7-xVXh1Q\E\uYa#ZokN "S"*w WxvYsMWcOσ0Js/.Y8 v"jz^.o}T]sq4~%{i|Rl{ƠħίpݪZ?=Ƶ{\X]xVW:9wg8ˀ[v3qEmŞMͷ XCatZ}%u֬d/S\ {.r  @$jHXi|MP\7^e_*Y~ uwq$\9-/wώLAqpU= v!75YUM߆|p 1Z󫲄2R3:R 046Uws^ԗ42ד7榯cE?ʞ0 ݱ&p5k,YKRNIm8u +`4+Pɟ1LeVY$~ᢿjIU:WۗZEY}®Z p*bH`5t$nT3pq }%zȊðn"lAu2/л=d#"Z $;A2k~X<;8wFqI& QV|ҲB ` =Ðg8A]aegW%)c#c{>P_KBLf3rN$ix ,G-Y"/x>WWNX7M͗'%k%"pc"*S <*lVnm㔢 ,bT;wƷdnYb>Z6g+9Ɇb^ˤ} xeT3 3DžHs*}>q:3guWZʉhN0wq;;juXB;6j՟K DBS딫󁽙KqsFT2<3؎2EUm)bsYA&4H(xn!ie{}4"N[N7*aYѸV90%$ q0+No~g'2,&v[-PŒS7?$K_HG9s"1mnK$M5,"uh|2յ{ F?4NH HBF]5B}iEn۷#D $cǯEt&8 P1ْs}3 s}8#|n[nf$9jgsT6 {V-' FߺZbJQז۩{J+Ia Xh \.ߏʎuQo'PM'u NM흫J};KB>=B9Z*N•pUf4zNx;'FڪT\MK _DܗЏ~v.='IXk/^qdaB3hJ@#$r?sѦ!rǭ}WN p9}JV˘ā9P/b]176]룘:S+XL/EHb[eWrjCN񤸯WAz˹5JPC5JƉy>#42o= ;2rKLW]/~ϡeK8;OpJHya0h N8oޗqS51Yx?2ю\Ez-;)w KH`ACcwb[GNrqJe\CPa특q baêcki*&OOƼAU5_zҶ#F"ԣNE>2p ɄLPc)8;Zuڥ*66CZDkgAֺBc[9-Tmΐ}(V"*P{Acgc{A8KhN$d0V@NgIDjtd!Ѷ4y٠4_/o l%}g .aw>ڎ7CfXéRPu(ܸ{bE0~x DRP{bqd˜.Q-Jz@`9X| or*kO߲܇w"5;'L : ~$Aj:d  5B;γdh47ceU|3bbeo~,1uݹYibԼʘd*P4u1.$W&k &'piIQzi0F*`_5T K`?l +¯nG|BM@,H[MA KybTQ)&]"zB RV9Znkg1~JXUÐ0.Yڼ4 .~`^$;r|Djb5X )Z}]"r:+G[Rt,f$P!9߳iIeμm^%߻-4O84#:s`|TG%6~1*W';AUiWUYE,dL8KCcCͽJ,Λ(_*ZL3}I9$;HXz(ӓκt `sdTgԀ, PuQG)Uq%8 m'#sy\D\Z /M8LW .V|{c .YV7igߊ&l[u*`)sk`t`vNz`?bqvM&VF~-L2%>na26~ިT"10{0t BQqȲ+Bs݆J8hFJF/wzTmAPSf.JtQ^ݳ4h/iCީh~Us*z6/o2Oʤ,鲁90b8$:Ux8=n +(q#?مԀrbDʖ= `0JXta ŭ! ϜX4ȯl(d9ҁ;tZ5"u#4}\|<@h%FCw(g- ; Ѽp]cRf ˖Er +ax XlVN <7m z.fhKd:6Kn+x I(K OvcEwKt=ZJ?V%W:NQzoՀv^ڬru`;I.^GrZ%M=GL4\a9X׹{U*0=',.ʔ)̿x]!ͤ) YɑwB{P(]g=gT&nDq; > 2 ʹqY|j> 8РuWx9;F ~4ي*Lۜ0SBa@zDd@2`oLڡui9w|dIyL |9 ,c\#usɹ6ɻzYexg vJ z8 obgqNK'9D=Z۹SFƱ+9QʴS",\Ej.h^SڎXzV=B0ƈ\N| EҮ'"(/0+Pr3Dg*[y._։ fw? Fbgc%5/p~ta<^yW};S˽Mo^kYܚs;de]kWD78J&M֛INlCɯuHEg,,w:sVENL'ʂHmlh^ 8Fy*G =L븛HU(?t=ɫT #m 䳳&7ͼؐhǁwzO[֏behޓ yG4g_J7*= 1?Z&5ԏX*zS )o 6AsMt4keM4!ăѕS=P1RC(oZ%ȥ?y?;UMP`L:KuI Q5bTk/2(yQx) * u{4^lB+#2w(ğ\ 1'!UcFO&)S´=~Zff<{?m`3KVk!o-(*ۊwtLܑ@1˸t6Q""?6 pLOe@ʲ@=Ң c;+! `dfIyB (A>>dwRaB{Bƞ8jLgojNbpcнp.Q#p`F s)Sa~jM6Hm~ jB QB RB4?$(o#G B@/%< ^zciD#_K4](SFo ָx{QGd&i @b]&JB1rFWΎ(y^JxҖp :5 Soͥog4lsvw4eQojj(;\Ţ?w4hl m",shu7v,_B1IBdfm z,D- duRTI󅺉 pEl?J {w[jNRF!^Z& Zϧ;}-?jF.*|!R̤G\⻊)Zhո㙭 ;o"f©X%"Ŋ܁cQ|˾&~Zwj%نs1.y;C;SQ_r{WI ˴cCFa_FPoiYcF.1D\dk0Ҹ͗ *rr}Z5Ջ4>vӽw-VCϙ3қץp}*Q H^tdH.1\n'cssg-|VJdǠyzu"wtwLPA| M>)ay?T],Yz[%‰Go'ǔvA\*5\ۉ/{ΫJdx4>wOWDzҠL)-R!)'pŤF>ɍEzdطvWuHy'RE܄urF-`t@[./gz|l(ի2?Ag?JBq'9 T\FYTC&r{^y+p߯Jbo#(93t)_MwL2!+Y=Y`zi]*c}RS .wag_[Ü{Xm*HڀSD' xO{m&C:Qr Ct{G( q%͂R+SSmN#Ew֛,q:uHd= 5p(Zcss a‰HiF2ȥZP<}2bv~vV\|^K/k3cǀ:@%YvDxv?IlϟaųŢ..)!i' B^o{s\uR LmY"$Սa{Mdx#K:Jǐ|ؕqv)rMTu?P#Xs!B$_X텰hD e$d8]Y2WYf3^Fm [m<8` !O%8{~٦nӕ} e}xXj`K7"ڃ:9gMUMUy=;TiU]>8h/7Cp7q`*6l걹 ۜ̈5D5"vb*HSrYzQe Ce!'A3=MyGqSLlw2 ͫ:U4SP̓쥖Kt'Q80#3,jI' W[Z -~+qhN˺ "9ߡ*|&7?n0ǥ(jH~S=஝l$,coūnEo ! qY0&RX ]E@[g`)pT@쑬q# T ى̈́A#7ʃ+ˍjbr_|9 VҳAu]VRR+}3/CWi[4;8y?u($`4.ˎ> Oedφ IQ5JB庰ee~dxU[@R^17W:`=O.,u)mJ-ܼe$s8yuHGƊpy?FI c:fȎ?|4G Vo .1J!ZWCw[h<{5=7OB7\K@5Laj)t7ddȇVYn)>dK5lq1kڐ z|  DV}bM9ĩFϮTSXt,FA>ć+ r\RDhN/uƒN[[=') n?X9XHYCyjUbcxfGQa1zAzCD*% 8S<Tӻ|6^uδkG9?^[ njl8 dy$q3( *tГ0ҙE$m/hT>} XA:)VKLF eD'IynJGwo'-_6>J#aTnǠy 5t8U&IfKGߚ)%6,A#.(k%XK@‘Չ^ GSC+OV|읳"T-N#&LaN\JqqF䋤ږ)co(rc ɖ&哗TG8-C*D{QeXNX^6㺅o BD 2o1*g|$:5ȧU.cgkWղ_>>,t1Êm`܇9n(`q}@T+4 02ƍ0irSIq@eF^SX^Wϫɖfrމ*S-B ŕZ'CHY{ ŖIR]QH|=N$!w,s˓{0r,u.%i07Gˬ>W]Nη|P^Flv# .b\[KC=YԕRgd' iAwQ*ldSp8fXaهJ"  .pM&bdB4?4ZKr=q#9W+o G\'"x_XuE)P5Q/6wDWTӁS#y=ڤtdhJM~x oi]UI cd8x5[QȇzE,j7_&WH6jYB ,~hY40/Е9r9_0e&= }z.zS`]sҊLZ꧈RYķM tIשt5TxW+ )ٜ駀w>)bT{@p=,:}U <+*->SX?Oef 7 b!)r4vԿE!L`lpM׭YrHMKi~ :ڇkҰMHY-ZC$g#*A\ xT_ܟ*?؏/L JZQg\zuk_VH}2G<-A7Y\/#q+{U`u 㹭*҆1]$P>,݁T۪rn(s/EeWyE7eU1pYUԽdxn,z[ޟ= A+M+lɂ A@]M阰H?SZ;`2a1׎&u:\\+;ֵ$Gn;Fa$sp e!kK:|ErxhQƢm 'a2s3/x;@wƖ͋dLT/Y]l3^Y>o|`|-AIp '0QSIP[+Gr03p->ȞMQf׶p9B6N)6kFzd ^nPv%?2reExK Qs4G8ڊ|4=71My\W/LwGŘ^! E`gc(GBbZP0pTpBl]t`IvԟbP<]G#2| 9zwZ-j.1igdD_+;C5rm |QZ&H )eCt߻rsT_j2Pg{ #[2_ Kn@ҨxWM_r`iFRҢc HF;fL gHg+k1TV=^`Na 4jĨ..w/KCrfY$)0qsDY4^(GW;fТS-!c j|ra=V*S ME:4%LgjXn:(VN <3ړnKހ wHM(KpY\A0Fys{V/*ms^Tj?= <>ʤVzQJvI-XHQ8xGwz(Ljua8gَhBk/߼/^\SN4'U=,-2 z(6I߇4[RaB1l Ȥۗ~a@3l"_]T! Dy Pڦ 5< ;э_+,J`~$"JX#yXG-KĖ9EC89pL ύz+!OvA(qOeǁw|)Po: Kd.੹8IfΝBy%:)7\H% 'zy&Tg&THunvϽ-V9\6PԫB`F$LD8ŷ`t7*取A r9\qd?T@a+^K[;\=#"H}B.* !Ln yD/${Z;ּh޷MӭiAVѮ,E3GF(ˉvv*H=62c`xj"&=ꭼt.=6gL2\9f ƙC̝,%Mt__ 11GƕN\um>uiMzbI0D9aks@^M(`DX3p⳨^iަ~y^ӓk'8iҙ.B<(u~k bz(_h@]q=vqlUo'*je>|;Qz꧊z>e֡.xwE_Pp#@~vg5aI,nץR+-dXPaSb(8JQQS9\fw BKT׋0YKp[_lqh-Ona\3fG7&'͐ySC})'I4,ӛiOZH~[HPݶ Blfbrn0 #Jɜf'ׇqS!x%v<0X[p&+ߟ2K^KC~!m4K (օYHPmB^œ8Yf8 lUTW/IMk튀tzI-^hJm֚oXsXLjQc-mym&JX 15f*;}vKan#T&̉+Tw^)Js*ΠCT #s`ƴOܰ{큒ѩ`ĿHF@7B E9bk_Ng_(mMn\[nsvUa^ݒ: 9 L&,f&L_f#TZ\C\FLf`{UFö zÌ%]@BՖhP [7qJ8bqR;#ȢEڛJY'wi 9O{JfupɕQ[g1!fRVj|zC:\V4Ӓ=7wU g0 w0WXc@¦^\LxbgV, TbٺŸ$"QX LqJQ^x?{ P lK~Ë[ 1^t}ω3瀡Q<綋@6މ-oyɍ|$SbZ1AvyywOà DX0j3bïe8H pvMs(m_M6gI~Tp9huE-ypI56XNi{GGVFX"fޮйǙg_r4XMƺΒ 'eЗc~+ӌ$g>B:PNv,9w;ƈBh^HQD;:r#bj۞.?$T4©XbM#Y׌H@EB;0lv >CEW5;d1ǵyjטG'_M?W-\ŸͤPD 62ӳR%Dn3+Y,`NL8J/hnUݚ_ nޒz1,<V av#_jcSoBf1}~$ Ak!T!C\ 0G2J* n ٥'1l+NySFJѸޅS/#~YHiipDx^DŽt_  >-U3G!z5|O#cbcpSnkCs4 X}3\j4$%ޜe~v:`$B#r= A*b7`0MGXm8{2=ӫ:BTF.;rb ksKcs{_Ċ'',_(ᮃ%!ŜSw~{6[0*[ w3v0K!fmƠtX.* xHlUs\+lØ&5'oWu|MixIX 2~9E+KgJ&颜DE s2X+l a,ﳇQGFʲU="6RqyX@jicSWՁ ^3 K=nפv/ApzPvDѦ[ eWSěh~h_Ra)'淨vSjQWg@Q{>RC`'-d^Xc7^/XY# i&!E،+GJKH?sS 'rMVF~uRnnk!#JF&&4;"rP`!{:>8Mwh)X>3S&o\h#Ңڏs7J=g*)?-SQһN~g@G&dF_"WLu\"]-~e; Z TM5<7^K;HG]:NAUАC8ё+Qny+$ ߜ3(j(yPa3fcRف {h |Gge_GeJ^0O$,/Օ|f1aWnU iEAE<Ҡ̕o 74/f}!OYSXˋz--Pw)q b5)x;iTO~JG}heA.GTY*qn,AT,X)$zH*CcQ8Zm5P|hn/l# BwKJGf0?R⏹5yS@p,A~'Ꞃg!$+P~PPMwc=/:72 Dí"45, IA͈YpEʣlyJW6i!RaO٫ny),{Wŋd؇5鋜,b0mQ wm~1ΆBi %<9Ut_>f3s\U5x?m?f1L<kϗ$}O7?SEi`fl"p*24a!1[OUʓ#&O Iԕ'aJC9L s[MZm;P&`h7e`iqt_@2[ ԍUDO ʍ`z|ۉkB ̒ǽ~9h;_.g*7FHzx|/t`6 s9ܳUhfAuL%-9{o L<ßlJH>7B,gԆܰᩯ%W+;54޴at YZ60X}ie`;YLG)-O_:y=gH7 O^~NɤButk+NnU `S95LNf3u̳s 'o簣2eg5{ҎEVeT=aȸM$~oy3ܐǮG&b"L֏w.7"?=jVK#?I[h,&7J%hYh϶]">iˁ8ژBƌ1ѭNj/kЯ8`"SF$0;wQʰ1#W ~2}WSOV]$Sbp#  .A3E'{<}%7M";Hx.;P/w"7SXmJBV8_DPQ;c_T=!BkyG.ׯD# \8zݎ {{W`hT5qK6"zZ(ނ1{}8XW#̏$gc;=``= ׇQvSWAjq}O Tf\:>隖!5\|'MJA37n (㳺. ׹v aw E#k#ۮrɳs}B5oXur{Ʋy};`PB<^K"n:.THM)rϭoankY)W(5t֯V@v.|{4aNhVP ī[g;T^:ogA&ș F0P{k͡-3<{)ѻW9[[3⫃|D xeؙJ\HI{jXENPaY}tH["BZeCX팵|g$Xi3 ӹL>]&ÎH Z $g ޥR=Ć{~EScqml7I# >YdsOW~VElb"J)X]'xS(z^> b&[:dM,y4̉r6qYNmHA.Gn ltuLS 'x?j hn6_`^`?H "{cU7+D\. ?X޼m e%ps|h.;]x汩@" 1uxn, eO0kKJAt"dX)|$<#.^Xrc %2Zlj#&$U DB@d=?XY@,*SƅŰG/`˥Sl%s1=y;y^H-CQD1r p- ?aߓ Kez݅q^:~J냊O:%i*]s.; N׆@1,l<*Iz}'_$(B$;nmgA`]ɛv)ϓdb.7XrCɈ0(m5W]+5 #6M%@hdFyQ+~=N|4aws尮z#Ա9WG~՚,[w1+Un#Kl>Ǚ咧&KUXFJ?ʁY~鈉I?2WFT]E0-Rd]uнwg ^ |VLQb{A$I64c@^ф>`@lKgXA>1#nÑ5[ I?ozu"fbAY/#:ql4bGAPq0(S]VTߩ3tLa+01:B@ *rT2}c&-p+'f, o`}]VY+Bc |C̈dӀ p%4?[q%|wa{:2<ZpD 2ds`s.My)Qȝ!~rdckְn+}$g]A(ag5ndZxnȅ)zGKlUc>烂:߰k6E_=.lXُf6FW]<6M߶=44U"oP{ad&?:kthccA|tyv8,ңT8H!MI)Q~ۜ`*~Θf( )+eO8'p4 KF= F~#y@Tn%Ngq,PNffSnG{t­V9o9u%ƛ:*^;K/!'_MD 3oZK$]y+%B蚆J߁mW rEl~T>H/Di9NBY mPzw%CzhGDv">T2XNQp-!)F ~CXG%ӓΣ׸?=#Q ɒDL&&h:¾|94;[e/jgqJ7R*ОAFΆ2aCo% B[\&aV2(6wZ䩻Df)ØC-(sOW9K2mSh {&kgtz=D5ōgFns%ø g^ĺ~$ݹSBZݼcZ׻ӫ*WR'JOظ4Ci8|/X-GǮ0(%_{|\yD&X9#+^/~>:Bs 9 t;}f +|FXrZ]& 牔FsH>UGWU2^אgCz8@lt͏;oZA''H=mQx4f56i $lɨ8\sJiru?ۊq s1u`7(`s<֬Pk5(ZuT,Jʱ4`)y),1/HUI??hik~z@yz+Zz@:D̸A1pDjR"fX'7'Ī #Q$4"Hd䮪j$KQOk: 1OqLvwüD(HZ~{u8߲%hy4h>4"A%u9WnDI5E~ຏ2Dn`$&feX%Fӕx45)կ3[al2yȑA VWFކ#P4o5K >uLvŒ=?+3 P-xe8RZtDWLT c\Lֲ09iXMXd8GTJA(E^-|Cށ1_vݡ|W|p% 54d˪ngU]پ'¿N J هnPi #6=(5^UIJ)Kq 8a6B>98[DnYa;h3X6iWF,wHɦ~V mxk\)hփy>%nKR2 9JFk71ayəm+Lla\uL:gj;^@+S9(r9kz~4^u~!xaUՈ7 ;0U"Gtӻ-'| >C[$ ǝ8GMOɭ%vqg,TIEV(t)]zFF7N>(8 i5?uEX?TK}t^)(P$Q|I@ǧ*V\ 7HSVF5Hk; $dY#8T"Z+`b2_2  –qRh.\N .EO Y̰݅}vB~,?s7N)$/M ߠ\Y) kX .S7TX=(Yt*bu^]j)b tc$blh4R"$ۀTŗ?uO;Iwm V0 ئôXqlБT&p$/uHSip*~sF?Vi !)ġX'=n~8T6~" b tw XfJJ/u͞ :pۘZt'=-MaH>պ췻~粨R Vt6*{o&"X܄mLmm9b e{L"P6舱k1@_5sxHfKO0@\_р/8l~]5FM(W6Z`pٰ qj ˵}vA|uݙO+F% Ik>2O-=n|vEy'~\ b ׋棖c]%'(@W㫚晡.WgDhj5`#~-GnE@2G4xG< }V}537Ă1b482Wz1/Y*o;W4۴9^w*]`3Ȭ]f't.p` {<u!~]1QsCi޾i{ש0#[Vxa/$,hY0%>AI3նԇ9\+xꐗhƂg!SVo`36J,Ԫai69Q5v)' 4=*b= ۜM]N(\_x7I|~My݁v]?-KJ V21.{ܹƠ.k=)= 8jn":3'ͦmrEOt&ytAAdBd Dbl~ E;m-=xnۦ=kz#i5?(.~3 bw4mV\?GX0|tx_wH#)0 }_ucH*ζE^`eȉ6c| xՈ$~I^~'$kN+sh2!)_I[u-th)w3@BH9 w^حsi { ;Sd%Up'쪯?V%"m=;QV_sklXlybt$;NH4^(0d=ἠor*TAY"斣tbل^.D|'YQ]-Ƙi Lr`LwC5>$=cozI6amU/8"r?4awr*UޥX4r!v7yEE*u[#`G=(BչQ%[Udҿ^m+ G9 |uȌԱ hdE B`B%1oX(iH46 h#A\Q3qK8[CO !S:WkDԉQ|aX*]D<ɲ-ki2{."᭬q2$xNiזDQ>dr`K|c8!H9YwiT %$-'oI!&˂tLd}k W'XE!JoKX{XM:JTxM^!4]FN+[B%=q)ޙTUz+ڳۍRSnIqJc~%2XAU.D=f@P0O S eXcj>Q 6nOLa], b"C@-|II&}v Y|n Me?=QZA!Y=ҏﱼRn8J\;73HduKA 9 mpq]XC1jY&Srsd<ҏ/:sr* C\'MrfZ0et@8?Nɦ[fLppLA{.薆OͅxB?k܅?VxCK tqeb,9=b mĕSt\F^hIneVL nO oqG 9}|g'CHv>& mE,O0W~ᗲ$"ATbs,ɞJ>%+&yIuT<{5}f! !WHm&g񛙹, PY3nO,uZ;LW9,5@[Y,:״6]i܌FV29j[$.KgIq2q vt00{ d̄b )T*]=.-nvQ)HЪev{0C!ngB#1{Y hx ÖF-̏LqYe88?a-jIQbG@pRuI?}WW9ڋcow+z 8Qol-V/ kը9ou# =@HyT^ͯwXIGJջ!$rrS5\KZDwgr+CY z\7ì8ibW,ɹ(a׶1[I[h7w?NH;SfmwAǖNFXr DE}n M|47n1>X~:bq_vnw5qr 'Щ,P=tM&.ЦT+x߮-{08f^wjI*2q vyD<`<`(&y=OLRƼ`rGE]~nml.R.LOJ*{Sȶ}_]thiL$AKmxLoq"8ci\ ,Mz¢d&fzVp. rN2{_% nE'z#tm$aT0RjF[]&y1$b#Zhw{/G6)KǿtJ(;{+J6}Ld7fenc5uhxŁ;0js3x)\Z^Ts|)W^@(^FU[]kJMզ:V"H.(} vL՜8QvDjp=n] ]F&O WWDAk"RB v߶A޸nQb3+w J.9`uy%Z@(g#H=Yf|&< ?ā򫟱XZj*e}vѿ NfըTڂ.ttM;$fQM&?@=#! sfͧ7Mm1R_ՠ|A $G&f2_bS( ,0~~YJ;;.".yHؾC2R5﹈,GN/#{lA%tFK:͊uqH?X*%λsa2Q4IiVAb;"6o~#*0(+7T| {u?ǁ+y6 VSy$Lߟ_*|U wRLoׅ"vJ8mgopz z f,? f[)Z0@Sܠ8x{0r(̙@dBme@ %:]tzl]xE$+tQ4_v⌉,b:T1)]o+s -Ği#9tsN@X|1dwJu!{/[ȷW]%62M̦"zO /;T?s:H-/iY4OY]݁Ms!\~~jX^3sc9*[5H6Rڋ'副^KfjQAL!,ΡTMrCz%g{‹;)#Z7B .|ǫ83P HRrǛa26{DZrt59@_|AV<- Z()@Uc\]|'OŪJ Cޡ]bɼI8EAqk =dU6DODf)䐱ςC y1&8wK7bi%gWs]j΋~OU[hB(˚> =l4|7?7_pCH!UA| ,~F]\QG (&%}0k{_57O4kHKbc&--QꂒŌHk3C&DKWrqTŷN[][Mլhq@ѧ0 ܈lu߭yT5|wY_9JhJZA!Z+\ s<84on!cFvp4 I_+/L$"*U(v!'b)ЏMJP<K*|1AYV3.3NH*> ŧkS{|Γ}JLbo4؟b"}Q*va0 [?MRQR>.ܳܠ'Zz~cpS׋һ@x~뀮E&B)j򝙼ۏl9ێՓb/$cpX7d9'yZ(Xou>mz@ًFЊ;YTr1IPT׺4XfXvP=A@$mQҮ-[V‡RޚP?Gœb'zxȾpp'\4,M@M9)D鲶S@)Dmb-TO慂&c[E^cΖ=|`0e_u/@4'9 M#Z`[N;X ,u⢛!_^"Yջ`;;TpByL|lus ԍ6~ d/eB˒/mOPL!7U.3j;r!OIBJ!*B֥ES,#eʿ%-0)Qs"}&ӁWBLEDAB:QZ+ӣ/ qnMk%ہ{n7h">L<c1 }#OD@U?dq2,&j՞82e$np)X A H]iyc1 Q>n|yZ@3[T .kw&-sOAm CG` ]~K_Ѣ 'EMR>&_װKIZ6 ɐrFHo4U.t[UAi0U-@j3_h@3|g.A_̛AqV3QjZR%ͷK5WWtm<"Ne8"N|Nk!#S=5\^*<*c8}JRj6v92U\Pj:[AC]i{C;юt(8O5E v%17>ddAXhװN'Nkm3t/Lp^!!|`j?!)ǽ Qu݃ ![ ][rr~4Mrz(xWeI 1DUC)33`<'9 Um|Ş8{X]5Lg7w1ٴ{==j@0n(p3Nvr߀GFA gga3@%'%EU4;Jw*(/z(BjL0?Dd%7'I&y<1$ǩw,+?b#qIƈUo(ν1vnT$$S;93!+Zo53,^coDIftQ'(*?3DozLZh J4(XNy.FPMWrm Q DgO&W7!U7"QYuM6s[2`U=뻼GbIof}>lN[]vctRܛ&en6;L[wĢX˚Ztm ̊ݽXD:[v`iGDijZgQC()6BXtc p%!/hȇFs ϰ(.X?钠.Ap˚_u>y>v<r%0<{OD' D|;&mbnM? I)ϯPcM(:1HW Mɹăi_DbJ\(ԘoRAEP~s_=M4rKj 1 .`~B*]jb`م|Lכi6!-*-\H領!L!@(_/ ]%H|O&% 8J]*٫,2T3_^ BX%^.w`98a>y[>6\,PC>K(R@"H*_ֹ32gʟ:o3.aSd"?e@`m9x}aJ?eWVfU'^}|ɄfN䜜]YGsG"*XN vΞ,1,78]hCf5֚yH;1MuOXth8pîokUGͥ^?cppٰƘ-د½J)^'ŖÀ%h2|h[} {*+)YLmp9Vhݺ,T14lP$ 궈0X H7]eG%B5"QpI.ߍL0aD f[v>ē3USo u `'s͘Hk`),_qQ Xi"[ys+>Va##&I-}/{1gT3 3=yj,vY:Y"#b.n7Y3K6eBy'8/C a؎(=FNq]$nBk$A`FՂHXz-uNѵQ„#LàI.νO\,`R͗uQ]a6#V? J`:x~#Fe6r[{iZM4 z.gSFsk׉:Ixބ_zTswAB:F)rfHw,kBÕ<9\ [ӏyxNU`sN%ïqk_MhhӾx +W?f[|iڧch]{᜗h5הXEd*7 FdNx.ڣhPKJ%J{82V h)Ǟf[Hg4Q1ь]aHBrBl3h&fil,*}7aY] ϧhcw)$Z# AەE"hNrf )=mw,vN0z~,]Eoh4g7mI j:<8lw%蝝ͳJ(FBSj9|FS3pROf*EX jSZoʳg6N?KxHRǪ6tĨer Nws׬DYײ˻t. %#o| RcK4Kϥ9f;χDFkuaӳ8TR~0umLbWX ~W-t v3@P(E14;lGo|~=\|SԼ9Fԓ\"q~ {Dd-\D <^TfjDB>HRm77*-g0)@X3o+dEi rMr"ԌB =$V6IB%Ni`D(svfLç^c OQwC9ܜZX `&䮡(jqwX[<8U&jni{KGK 8a~yHAs=rV"m{;*N\=#?m1(U1pa ^p%PR8Te;VXc~`oTA߰IGeJgzhun2 *doB_WmtHLn%ד_8;[VY }2Ҋ7#~/4Ћ<sE,5 X (Q񒡧 >ee}R'] j޲#K,PhSWGQhߪ mZ]J?4ںCO #>e%:+^tˌyQ.̘6{ɚE]/6~y ~T@h6l-~X`R??+e~Li0 9 ]xihғF Uؚ/y{ Upm:*3W4Ch0ޮGhE5PT?ADpAxn}qb`qgGUֹH(x]bL// iaXڃ nࣤmϰh~@@;]3&7@yjp-GɴmAlku I̒~R-S eY( Mj3L``], g;$G1ٞQRCTq''aA ZBΏ~V!#/d-Ϫ %U8:r?rg&biZhCG20t?$@n_}PR ɔRDAܝH/z6G[`P_ġz|amNIFL_Q%Mm.kݲ9#!Zͩ?SG>(]n#l8L HE"%xY0ve9+kW:h|W124\z$ V+3-Aא=7WHfS.1uqJ?g&6.;%uA7OW񳠞zO(3dⰧ=4^?u^}F L"+)PvjR4P߰%nM&W6; )6Ͳ.ZD`sagUpTr^*v2䕇|~7rBc1[ $ɘмSHuC"⟧!U ZwJ&`z}[gxCM;Nj~'-Ta#E -ɡ2yb˅HS3w5.^lVnGĸ[Igج><끏>|'zQl? Gn!bEDe2e;Dz{ O= -DnTWrcvTapj1z~m'gk2O-[Pd_m̨}AmQ҆y[Ƀ*  &yKM# j 6=:^v,[Ïo?)}sj1 +1qEYo;+iѾPSC1"WQ2^ԋ{sh{b8TuQ `s ,*vf_. w>`XBaوU~QOc gھ qa2S͕BxhzN WK ,£jmi!͂:'JiuVWhhENAs'{Az"dZ[ly5ۣU5-Gsud;M(3o}(_߫xb ѠE.>x?܎, ~ ,Ek,Xp0LA LPFnN7=I=>Wډ>RtU<sS؏gɅܷ220\gUw"ސYeM㯴Ȣ)~""-+i޲fr_UBWl"olpӹ\$M<\I)Ɛ+zs…w%VA~_P}F$*L^&tɥ,SI?t `OZ2ZKpEY1*U^,ڃG~TŔc4}50\1S IWBGaD7[Orkci-yaE8 G􎘜/s,.^L+7GUoPJ?P[1;(HIxQ5XEwgО-垘FgYJV0 :'L;O>pq pє* Q%R&:O[B_R|6;`s})+kxlCSSx]fHNQC`sW͊<]M 4Y|H[vKhHǨLb6IJDS+@;0NDg/ʿ9~C l\6Iͨt8&@>W_|Sh:~WD8U ᒳpwxae`EWl2"I>B vTlłSvuK"c H=\}. g LLJH&iޖ9`%fU0z 4RsJo>ObMBDD/tT8Τ !§N2`CbV%3=xdDO,kj7흰f{Oiwlb ZljHJKK }creS3~xzG{kS~&oeGU/.UEwOe0ZțmwRAxnFo[?9Ж}JT߫I:0նMn^7{̜BuVvR 4Ф[3{1}f!xI+=CӝN>@,L.uKVPTuZ lm ( f Te`"*X姝#z9AREe:j ˥NHF bbHM5ҋh!AU W K~4IsrnV29<5VQd.$EM?N#h&]|5=[/g${>J2ڢ(^EY#؎$\Jъ`Oǡi~x$ʻU(ᛔ`}1ZP۠jy^zF1w4pQbRJptS9ݩJ:Ȓ՘8IĎXAT=V&HofLVQӿ!wK@Zbt{Pn8y8[juEo )K*fDb@Q$Gj ,%qy}/͜]yLi5Y<˞5t5v1ZZf _KP ’hc ): 0}VLR3:TQ3 9 Y}[ $ LZ켸fs舳؇FykxplfvV(9Tc=c~ȗ-a#]\;xhv%iFs8:~.cxq=!i8q5߀5Eǟ'F uًurd*Bх pT!_j,兏VU9PC5!pr=r~sw\Na3$:q@] "Ǜpm,S:vÌOT՘6gymtz>FK]b G5B m{I,3\z[DpVTF[T~2Vqf8׬x؈bJ%itrszAefJ(eu.XJ9 "jMXC'DhFҟd5`u^yW| `v^rڬ7{݁`esYviEu]fY[co|1s ыJCU8o L\gU4b,} 0/ ;fI8-v\²C[̈? Gq'%'6W`hI#^8:\Տwq,rsqVΕ>>Lܾsu0ZZ>F; z |A IDV:>2gV6= Q*wFˎ37 vJ^vgh{cNgcܪO5G<ͦO}7?0ZJ0HBNaa: Pp BG16Ja`,GMՎ4&",o:rl'@&%@)LuY=[3]f{(F 7Qg'Wy#X752&NO<;B9J"*0eKLu]籹68Z&z^Wi{xb-K H iwip͑t4bms瀪\*8NNISobх$f(ݠM5Qb>,Hkڤ0"FL`<~g40<-E?OˇHw,ۏT) ;T_Lo/$DBƠʊ;Hj'?Se*h><3Rkղ\.yOi1`=گ`= `GBS46 Tmxn=n߰auK~mC 0ş64hkHdGdNIW'̫S}_B\.S4^ZYzSoɎȫYax/B}aF|eUy9Нf1tY⺓GQ]b8} pQA3qS?(V:Α{%*Qqi^GX?<$,\ZpVHAyqiX)&x"W$, 4yR#])vbHeK~bг(YnmO=.nOVC@r ɎjF1Q)lEz-&t/HN)q1Z./;:zOyoj4-2 ’c EQ:[ /|cy3NIlev<? r3xW?X{o$O x}cPM^-%#ޒD(([?džs+kbuTةMxKP_PyW˓P2e?7&ſ$%P\|HG \葊[O_}tEC40)ߏ'k cjh4a<#@q/T (݉M~/UÌxש.A+`_A LNj;ؚީAGoU=564(.3l:ě!F,NN# K_oJG:;F Z8k/A9鑎5` +lA|ڋ^Si@Z6„vNχ"|_;KN[2|eY/ z~3k7 #g$S|\!(-7}&]#`X+|9ι4İ 8ʢVyKЄƒ:Synp#|EY.IQ[}n]K[s?;h,i%b'DYI!l@c"`@맒Vb5 Z亥Bc:V?ش$5DkKo^ʗR&4ki*q-3ዞ-^9>l̜*)3ĴX ˑQ"\ (N޳[|hUat{!>YR+3F%}?uhUA#J,6Bjx 2ʳvLf/*t̼g@pD#.%9?@ө PX>`Y˱ymq2FR [wLPZ}brVW+Ϻ`Nif'f &/:}B߇Qdٝ_{4]4IB/۽3`At)½,dVR_kn AǣJ`5)xrVީ6iª;.η }64&rl~$MI".S(ERUY`XfuԿ}NT&n5 wj}@!aFRܯ8o{t @kh\co[0 asN.>Q1^1::k L9P̋1 g{A +,һ\VJCpKWN U0*Tr搹9YцZ9D?W 6\/(WD3 oUsk)EMb <+7aZξUm zДId?JcXl_Fs,J[qvOBǮ|vEҲ DK,vvjB΍5We+)7͸97ŝ۞0O):tuu0hGSotOcnIx)|Zdw[-i5Do P)+ɰ,-7C$w%כ1r=; h3x5 wQCG6)`Bkyqׇ_l0^vgPfaD.Zszw!SSjc^ln!_-QwݎłLg]Uι`: FJnmqRu/:ZV)I(F%_GX֭-zGF *M)z@}VrEzvB3bzx1p%FNos*9V~^6+qI`+""f)q@ein/QwkY DA6,(bQbY*eTbh.6&a8A:](=33uk/@w1wO0x෩zH]x&K{@Kř]~+y( 9BCp%b xit&]ȊoMU0 U@wOs-c3 o%TҹBfT'J#Ad5V!aV$P0 ŅW \ad'{Ĉr>T;9t@Y j 컞, ;y vp&YS~WpgzDgRls^$v!HM؃dn z?ensì^=-Z BE^-Ɍ?7,eȮ" ;#JO1ӷfE2 jfV$)^۾akѨO\J AwEy$@T$w5ˑǏRĔ?J0_ͤQ!J tTRTf{V5Y_2 <(_-+EVSYOef51ND7agl M;#+@U9)W#J?m[!k N(FC*DC|%@]W:dž/"j6QյDvy2+W(yG,B)-$VW@=qҕK8ЕJ7Uz51xɇ8Nfu-FNaP@!@Y"uy">]j{ daC4MwYݹ`M2feG::ö3TF1mzD!IڔqN`7}hvPw';eW\ +%yu 'hWz'DªmpG& K<9;1xJeΝev>fi'( 9==Μ=.bTh0FtrK:x|_kW4IEw ,#M`f)ATi*|R><wC;Zw$&ݜ5Y%!}8wgJA4K5}O,ǻЭwȟk TXt!i)&d3Q\D@^w.3i]rvUV,Aԑpu;v-KI'Ț FVu܍HXYC&B0 (w,2_F@D(5L j0~kJ+uwLCn $33i7)sUM|Mc<9ܲ砗帶')$Ӈq`C/ۡ|:d^*J BKKS9ԼLɗg>mH7Dҗ^%ƣ˱t| nJV, 23K!pmcPYp*ӑu{`$M+Vp/F媊[==oEwT(ϫ.Z Z E"?ʸS?~ao@F\4q-Y~t}{ZSV >M ,y%0;>!3暵srD+(nҘf8Ʋe= x-T)*k=jq-}h\sl}^|t'${`v-+oW l5Ǫ\db(őa\̇,3i-gVIε݅kZ\XVg*/|MCY߬$RhW K$OGPc'lVVObvHRaRW9UQ,+ dC\&La ĬZOmyw xGB(.|,J*@1}iO1'[w&QS<.2~=&X5t3zw\e(+~("V6j0)d[~hϾüGGRrȱD*HS?v$ӛ"fK@!5j'r5p5wiP$%S˫`=!cC Is^ "\c8{~Ȗ6I^'5ƥ] DzfEO' f[a`9Q)ӭȕ\yxX?辘 WWұ^jUȋq`|{rcvZW>اVGPrK˰bɖI/;^pz_)Erx; F2k. mt%HDhm@F6\ F-(e*=ϲDV;GMc.+DBCP丷H6?ф!^#c)|)ֽz\sOc$GY2 9i%P'Ӆ2o#՗a\f uk7B%+׫".rg,f'PWR^˱(*7%۲;!Ԩ>lB*suI}QJ!N,e0iԗl؅̴)gR &|c}$'}Ղ)'E[ ]tYm- pDCn`8{ZL_!Rg 8Wkfθo| 4aYq"<5@ցut& ikk`={؁-?pg o|DfI ` !gO:'৪q?_wƢc3?@/Yrz0B,Ap}y:jMZ N)9pT?IRWo#;B &h~ޟddQqߛEfBʧƌ=7]BnrR;}H<\0QA_~Y؊%|'iI{)1WS''CxPA ;NC1^hB*gSۊCytˍ.ߪǣ%E@oH[>ٜQZ& cI欹 n q:k`.F#xiDžT&V=TMq78۟F ˓3Թ1 yF@8"Jw84>@e <Ryԙ:"^nh_ ԗ3wY`P R%Lƿ7bç\|}uJ^Hg>g}"^-AVmW_تL$5?@+(Vd+-F9N}@O˵ Y7f@_Qm;FrLtp:JY;PgC]xBiP;d;>+lb$V >^k";-ynsP&u[[ڔ331uwӇOY{#?/w`m ;$ຊBƨZpΔq =I}4}B}qҼ9d9BН%<4|E"E|ˑKټxSz{Ȣ@\6)OYeM&paca$:yLШ ]a]3Sŏ?sVbGш2BݘSV6dz欣ӊ3~˿O3!@D/H=±U_N)aad$>0m{'J0:{IӧzQ`=r7KNio{ خyG;|[#d]k/Ʌ3 7% Hq/귅W2S?$605\.`6lePWE4IenÁ[cr`U3!(p&Jd=$=;I e8u, >' 9Hߪ.jdu1)JZe^e}9ѕW7=3ͱBey׺_[{"N2J=QaCjl>3f\>\ѦoJh˕zm>1Cu?QT|4ǻ杒 @R[ $QIQW!iwM<@tOKT i(Ʈ 66vhj(N9[RM`~zL bb=y1Y=fу!;L@Y<>C jmGezsڢF bem@kW8QVٰȓzwA) qZ ,CǶWP$8#oCQҵ0`*S(NpRn &ќ16aì{]ҐP; 79DB5 055P[E|x!eBqS0mThq&:n΄QwIuعj١MNc%zBͨԗKܻỵc Ȳ~BGLz*]eҊ<-Dds .$'"VjcWw\[*|q~QXs1vW0H[:rDŽ]`ԩG<ۧ;Vޑ81Ug\#_bϚ%b[,x~M>o Y!7ט\z3fI]&-ߑx8`p Ϊ[lfm{ GaĞr5貅%ZDWGGKN]юv->K3ګ6W*xW8\'d4T%EܬD{&%z\H 8dcpNR)Z@TߛhE(#H4`-ǟH&o1GOP IwC4Cy'j)d=!UAhrK/W&1d6^uAVOEJ7J>؞4 k(Za>JkgǏi??|\jfmdJnZnrD[*Slte˧# ZD 7\5)p/r@C w ᶰ'[a6q*'ì46`_#bWxd྾p 3e=BQ,Y)L%,N ' _i2@s;q3A}'9?L0=KNNࠂI hx㫙}' R+8;#~4tIs ΀oZ@E( -6*nt ?5SN~)>f]W&dAe$Rfv\@8,Q].RR0}kCI#f3v7]0@*8g/} } žOOV/K8:ԾHZn EW2 XXx|FDլTZM{8mD+ǞmՂR>6۱2Ilcr!ϡĂSq}HQY'ks S~k^BbHзj_zAx~uu0KzMVx9qx0A*Hp;'FMɲu\MLHXk}Ge^)36!c# v/tuP>tΉ̶if5Cѥ6=*"aRa*?;R ט- ҏk1%1pg<[sfT9BۤdށP&Ҕyg\'M cFVS' [FSthÄ2WW])naMI(!5/@&ya@gAjez\z&©d b Ȉ+ܗ2 b6J$(hU Zt8G'IިNF9"`s)<"2|FEquF{[s;%2^ NE$wo<{hD**uOݳXR~rٌ3bw+v?0ۇ5=]X4c)Ԗ=Z)6q@[XV /ޕ0Q%,hݭ1k+xW ͫVaXeûAЊaRB5L8lV$!vFpܡʂ|c9{)4A7 #dv?iÚ`5M0e[ȫ!e6ClpW=@ !'Cj\ךq`vu߯;Vi愾y(]ݞ M~7= ;0?j>c5-RZ*{V hA֥83@jϷĶ׉;KEw0=6^4`0;sKIdL=7 'mM=R[wglǃ^i" iGl[Tdh*sadt.XxAu38\Ysah ~eس*ɬ'}O-XQn tc4 XH/JtqڒVv"{gʯJ.x؍ۢ ƋK;7?(2J,Bi!Z 7)a >;K4{E Zg2NLu casI#K  Q,!;$R/\FWKˈ(4aJȂe (ҝq8Ѷ?LGkN ć0,+_Ea[/+gt# ǴrCy4كZ){ ԋAne|ei.?HgX뒸ԦSrԩW% w$-v^/~ݸi3dQi f&OCT)O}n!s&v;&}_z%ػEKq,q)Afru5fyBJ|+ ˠ0 299s3~[E !yU=TJ4&<w&'tbĸ`2|L3=N٣QǵDKV6Z}rg7ӍBdOjd`](-QX=˶x 32 =JyڃP5 qgaJ158tn串xN1kѲ%ZH^ 0)HWTp=*}Zi~6$S)-ۢ7M:=a?(A*%7%`}3+暽dO QVށ@:n$qnky<)ߩI%,^W':꟤,M 8~֒kroGXPONQEx2P<ɥ,sJ~?97J 1+7RXφ/:G H  d .[3}o3|Ymmu T(AAZ {.|HyxIJAG3Iǎ͗5-*o>|uuxuwe)iS;?G_W7m9aԤC[igBXERDM6N/=Z M>pW/yd0Y:`5#ݒg@A ch#|n!UjR uSgar3- fSjřa|J$,8jF_5]RFS%zǓ!{g,Mwg<Eܹp+EtF3GCMm_'srJ49p޾}`XŔ+91%k} yk5/QAz yϫJ eTɶ+"v{BµgT|Ypɉ.wwւTqZ drw'&da-@MX7;BoV2ɍe0/ZwsCzП} $r&gq,K.Ey $66VfߜC2EF9ZAmB!^?2wb4CGM 3&0O"o)3]*0Fa,?4㚘4cdWk2yVGP[$Nc;'B(]6jovŜHeC%Sa ? fS Kr 9q(a"!3h_8Z2O&^-} 9 kP7,.YiɽxYC0)0P1Lq;j 3;γU+,.o-@w/xCC2N^FEy={q} 64Iтkllj޶_:8}fD4<8紒Lgalpof~N N;v `dc醴.=h]()=g ̩6oUZJ1r-[ͼ~nޙQ;ZN*[L7{C=8Z71<_@֫2~>쩆] W|@ ݝ_Yrf [;a~ v13mEXI(h%sG̈́s&fؙ7b0RWĿxx;XhVP,t >\,p)ڛk -}p[ 5)DC^OI7^g ~|9/ kSCfzDbnIYP,m$\ys1,?xneUAY4Fh=Cߌ ;2t?)9zo_=:[:묕j61`U@Q9A")%9WңbB QTw.[sEwKmtRv秿~&p$|oHjEQNlnZ\6' 4$Bө*VAKE =a@WpJNtp5錮'|-ͳܑƶG@,ݠye2R'A嵛*Vɋ?fc+}uCQ4 dUbD[싆?o9_oiNKo꯻2M ̋SlC)^lܣg"iTC?IhQ3A"@=@ tsgz`;XkZVpOk5~/Qya+V4`a?1iB Ңd,Ϸ]@tPJQKȃmY7\C>y lz=iԇPɜA ~5lsF2[WuX20CJ΁Phzk'glэGV|l }>m]t+Bzv=E7aBn޿QJ[J9Uud"883 2g*2@5 96H≒FX$W2Rh#4d$4I6tQU"]";2twGu,!Xo]L0D|\'*D|{e =o.M.T`sױ@ٷvյ Pƍ`l%5q齕95 \(_VC9p!V$ )x;2.H4`ƒw?2V%uP9IQxcW6~|,wS˳cd^&. 8yWmƖB>Pcwٔ r2͈rIةgq{pl2vIxrΗlkGWёokB׏S΂&eʠ3Ro0Hػ0/9~z2?#JN?^0Ž--Ln7Ǹ`v f$!>P1K , OuضKEɃp8sdx[^!3@ZFb={3y m޲eoYSSȶ{\ʅ\ͦ_ti{o|M#PFG P sg(v-ehw~'מϔ3X}h u9U|L_c.*(OuL:+nPuC%Sh^8P.:Wt<[EGF{#+gp?Pe/MVG۩"'1BϟG]Asj F4J u MydqIZ]+̻G”-3y`v..prd:VqBG"QyLT}kˎšmv'&1ҺNڼ cLlc$% fSG4nťm27d]zGOS(-;pfڳk$W|PhPi!mKf KOjykzY1w3ِ?? ˩ck-cA$&;*`s=FHw޹"n[;( ?}ѾezI%!B fb@Kuk c`{1/tD$ О Z!U#|j !`%_TlPTIG@!_wѢb&vh5$߇B6m|e'V_4h ­y Z!2|)?q;ay=TCIdl}I0^_f$LK2dV8ɧXppt̚u=1;v>Jp*tq^nZY^vqЈc!l & td.QJ\wBUCȡT 51Ï[ZgB]{z(//Z=Pǵh}Ay/M^Y:FAY;qxєYmC\a~Wtn#TF^8Ad:6y+>];ĦCjsmyEMey}+`_p䲬LkNn[ `؞SQK5 _?ԻdnphTMN$p' .dm$UaѢ%5p65,},lkki!#[jmtO9O^tR7ѢP="g+V6,&Qjg#CLM1ڀzFD(x/l~Zo &B.ȃzm7B>: xɲ{P0ߥ=dRiF2-cԧ=O Kj~;r(l܏)zs wj>_5#Y켩 6ZLE1^qCb?;F}zp~[#,Ѱ=* ͐YyaaJEJ鄛ʕqS}PrC#.379̭:H,4W5B[)*m%.,ma[|;=C DHPTw1!:`V@Z"ޤ|xiYYӏs<ЛNх&I;;6İ@EUxOa)Wf9 (&F۫娷0oVtwYbϱ 7#IA#="E %j<9Thq9aC\@m[&v]c0j k{y$`1q9%38>X>)~Zlç$&Auvm'0#?|-#tZ/0G.gJd3K9|Zl:7}ReLx3gC;ݓ cOD_)eW (#ǧ>T>߱J\,_\/o͆IɎb$WSƳsCFKex0G-$,ؾi a;w:Ul޼7=Y9qjfPE)=:p#GQݾvR.KC=t|o;U$j=ۙ={f*97 77KdJM acl⸢;D gX8T廪ohd~1*K.d֍OغփXعQA w6 *.s Q;O%48dX1^B(,6kj:U";kׁp[ j=X DEV_tW{3 My %RG_EӮ@g bUgB1A৽f El|=L)F~>2LU*Rsͻ];}b4.yqуk`8w$JT|:Ƃފ8h:`g}s]#W>QrzWLXsI)=t-,Ke@Ӝ򌬍튪Sں_vJENJ;HF!ߊ;N`f2lQc]n:Cޤ@tC[I4YӞ]>vʛЩ1$d(O>\$UQ͓22cpRKH^xm8'P ֓K*+8d-2] < 'qǴ/z&R+7HM]W AټV8 yĵJMv0evsX$zIS35Sd#18w~M\.+?z\s;'4#-z׎e:ۆ~H,0 :=*rCfRیh[vp !ԏ'ҐIf&Hur>GŘ/ guMP6`DW5SY7 1c⎶e/7]gu/} qMߝ]2'/KYnh>ؗNi交 5W\bȞfK4(yb Kjl|^YU"[U%yᛃ\=pE5h0?z3 G=V} 7W^+6V.4QHly۰vʖ/=rl]([Fh Xݕڎ~ o/_ّq&|NGGXv4JX/ARxHs ؑ,Ta&0vO%!}Gw)фxC?63K)|.ԕJon(ߎaPp?־ztIFKCjh25=;m!nwU(ڟD8Ah},1٥<9d35tCS,dx6' K@^}P]Eһ!9?d;)v5ޞ~:cb_,av."9DE=13b|_^ 0oV<xpAawk<%w:?%<\ od.U*AQ!S-eqB4AlSe 'leݦ}Zو\A[an 1fvi|֜g6D- O!w[6=PU)mw]Tj<^b|qF8y:9 Gl'i4\ѧQSAzsU8Q5=U=F%uB f67kZ!ҿ?6gơr˕ ^#* $n$z\YvzO-BVf&MAרocg0*:bx`E%iw(3K5.hC{Mbp`O`Ub̩@G!Q(/D2\-T GW"IF% `4_B.B7 r>^GNs{YHh B)q{0f5 ?hNi<ɹ`y<|V lBvz2P:&=Wnj) {vd>3]g-0!怉 +4Nvɛ>';uJK"C[q_1qDԃ)0 cߒ `㾱zK}0-ˆ;;t I]ߔ 5^nBɐ:\KL J?CO7q}4alQ47 +}k8M8Xtn}9q04#gT .KwKi j?#nQ!}ƒWqղ Udd2p v:fSXZwڰ tj٫bi۷öHR#kYz!)\X(& Q +"fK<e2|жN=; KsAa`cE_oDO]0o{KJ.r7.5{vEr*:>~9]xI?>ᣭ[o@Po֍Qr͎/GV_uv٥uMt%t?F;\6*sqROJ`a yZD_Jw|_v":"\0>1s^qQE\ב.Z@k [3}P'D,ՙImZ4Js2ʲ(WP0]TtwƉIRt\GPZߺIKiZG5]T]e9Ӝ1 QQPZ 2WH5*IFekh7J^*dvM~z^v\ZGy>#zLJ_I@;PrȣKZCȠB_oSh4 ϲe7PnL~s1.RvcTpR }4n?THxZ9\S>3?:ѼB:6ۿ̼]8= V%Kռ">A[X~֓\y ʀ)o1,,*![\>-`K{gw}󴍉F:A_N#j xBwlu7~ɓͳeΩ@jÓ߄H"wo? zɽ FS`kDvJN nkcy |RPp]ԸZ_zR#*<=<@U&uL8; w I<ϓi+S;Q[i0G$KA>t-JG@űD5wf$?}OF {Xgi<ͽm+Dqyt«Ȍs`-}S? dkUyNrr ȓ"횈 h^y&r͗=DJ5sFu92:(}JK3`K{r[ƳŌ_Xދs>Sb`= RwԢii=!,#1ٌ:ճ_m4^TGWé8jT_4e)`_*!/[nxK?D-,!}uEO_z>-3.BjNE4-?3 1z13z:!#UqB]jZAea}ɴ #_a5@Ȟad Ho~%(ՐBX-7""5n7ȷ͵) "06aHj1ι2sӡ*ޕv4[p40 )d4j:h9ҝaTpo$S4X^?K`J+w4= _"EP5pQk.݉.H`~c"R=Ɉ j & e쁘¹<#H@]V${#ȄK7#4o|2`UO,lgTtP6ש#Ɩ[1T+P+@oE'fp rbdYT,2r --7ӜVʛJZėNF%>CnhPmgq >!WR|&Ci i-oH=eX80^ڝL􇚁w}P(+AUbU$$hz3;V,UI|q3FL)oѧ^9$YH0٤[g@FGԠ涀-kC$b=>q@'qKT_!ۑ: C_e5X x9\2]b #0ᕓ B; $xfA#CKwak=T|DAFڤ(AWm$m7Ox8 rJDP9GSoۊ$ vQ{zg uMG`O-4%.ٸrƍ Y_a(veD̖ss a7wx:ZVu[A=*'y֕FOS6r@ ]|Pհ9m`G ݏx kNKhDkVfםDU`X _ { FۗƮ!'1*Td0._)ɈcRVI MѼ"JMCw|S *3Tdjv%k)m;vNȳ%gG#I7iYn>e()a'6]oF r{1]hQWxnSݗ"2eyM8eYԁk={P7L06"STEDu1~%VIޯ!`#wK]7̄Mf%O=ڨkₚ/uhE31>QJK*>_N\}W߃B.kF7)T]ʫh^°4z7TMG)8dam=o˅6Z;5ڠD3(Iɺ9+NslC3i 0r~OeʇK/`6G?{'+qU 5?M5G`y?QyW*=ț#t0&w =*CkV =H=C1 &yqDRJm!`Vj:+7[U|y0?X ]04iب~s/єw/3*[0ñ3-n#J]xUFmusc s'ȁ'mJ`&q$#LCz91 3}~+"~Š !"hߑW, *b`Sk~6 ueЋ.N##qf+OO8=|[>5M8|E$f X!=ꕉ1|$ŵ:}E-O{w-Rl.*$ Ow|ռOO^fVgH&V>yB~ J6$ׂ=*0#nu/.0I R8ֽJF,j*sz!IQjg>6 )EW4G?2{qi~O79 -}Ӎ{lJ$=Ӫ v~.&.GP$].$@0Dr6x=D=8-K3/mnA9MS8‹%/Q{.Xo):*cWlHGX|^+T`ds1il/*(~e[.eEN= `EJ2aIXwޝG,5@&q,%1tdp|iR1&l0_64Eڃ{TN ^wi- }J;N4Ѓ6`"1p eMr 2BѬA: /IReu-YfTCpKlھ8%W}Dn mhjZA^Iw"E O~#l;v6uwЋKf +a(IaZJi\wF-?$*P_1ssK|)3\^M" ]#{epkEgg8^<`oOv,S9WJ!]'t\:@c2IyݸVb}/aҒ5Qkcku>l)_мOqN<T%M+dZJ>| ork|_҄U Nܸ ljSmB&`B!HrV& /8Di#1D,#4X:[D(Z~I+uPJ."ZIC4ptݡ:k&0Gvg:{/.E62O]7/DLܢ 7伦R= 1<_*+.mEY~Q H†qpԚjdݠ-g:g45@ -kF` nYGQ0'IQ䆟2 uj:LIMdql2+WZW奇xLi^af.#tgzTC pDgV|s΄_=-͇Aܳ]rvjO5aOG^vOjWGu醕 @Ki<'U[{/B40ݮ+{h %&,:gL*~ʌ~sU85k\6Om?(/W۟sKC p.,hw< F|ȼ9\-ɝ+XEN r|+Df%Zܡo𲪴V XvTJ8:tJ*UD,3 s31A`|NtrqLOw"{F?=rJj/OeD9"EGKyْgS)NBRIwX zs0EFa!!?~ '|㟙{LF J;|P~[Y.!_O6$j^*,w.ҟK{%2ў92zY`W'3ț>7O%|3K~~rf; ET!^[?(cXE\bc& ,e.sj:E2&(mnv»:Kf{Ÿ?8t#q@sgLQee HuK>nAAy2n#l$2c;\D`L]}lZS{Mqeg'-Llٓ8 ^uҪY<O>%sjؔJń[\SUi1@5F<@%:!ngmqkm׋4tH݋w ?Lǘ HaAÜoh)2`;ׁ9aw\!H N*(& .cB|ޡOh7V:9pHMDPPLA:|w{g*1Zȿ|8GI6s[W.9hհsXb#JX 1D Kh>)nu,ڈOMUh|71Bh^Jvҋhmsf~E_~ղ6'ž2!y\]_PV>IHWm8AE,v)bBѯl`NCHnDQzC ̩o_cl|VEJ^UHZYiO;XT %nQLujw_i5Y pZ8)p8>IUmO [ :3>eP ><(_e7%QvtM!4#"{#~5իǽ{9*SGl!"{#DmHoɖg>} B nu:TbmݝN|\7{P\*J("Xs 2Q;*BGp]KQ^}7?_.˓AD}}4zvYA~oB [ B2L:di(J'ɉ=^nM_=ϰN^]M瀄R4[ l8Qd+ǰ'ls+Vg%fxQ7(z@ z 6ԂNen4$_0Cӱ$\Ճ ƠE "ZX@ DNwCu~c{5W4+ݽ63z:e[uSӜ*XeՆ8Lu4ƪ)WJŅ/~[.ڴQBTJ ߱Rrш| : ¢kj H&DV]/8BU~rHW5:4[bASzX݋^53)u}Q|aau1{0JhmchT93%g,ۯ7=9Wsr# 0r9Uo8@REfDL蠤eZ,}W۷zHLD-ZseJwd.лς\=ddHIzq|tlS9 <4.-& 7?] p "Ӽ)2 8dg-^|uUQ/tN19^F X?bPrJ&9VtOefV9azP/Yxh{w9-/atR":ZYNj@ Ut^̯qmd' " 72x|.FX -vDm] FrL証uOɉ@j=.O>=ApMR"]Y:}YkPK~lZM|3dT]Qt֥#v.tUܻVAd,鲋8 Pb1.q.*݂R1y>ld`XJ7Q CP}_HXƍv{I˞l1h/[}ڭDf_l`堤07}-W4 T'xsl^#Za2&(0Cǒ1X?`Xn/48hب ykE x~ku6dBrj'۪V)T(>XndLPh *I"zlˁdiy|b!ϴϸÁBr-hN$ʰ tG$HM/E9?fQćBċzQpNزlذ[is@Fq㌵YI%W)jY,@`{W0¬Fsk=[b,Vڹ[Tf|n!5 %n@/BCΐ,Ig_a,HH[<ftϬD : vp^Xp(RDbT&]{NCf_[1BW5V/H]LS^;9Ԝr$-M{PHtAzh9:o4Cűl 3 j(+xD4$6"_pHB d]>{;'sYkn:gA+ Z P!P#TvIoŦHa-7?)%m]JtL )o+>?ӬW$ DZQ ]p2 vC mK.@q`/WEmdi^v ڥb9nVBʏM<+=sBmMjS=Dfr|c pqJ E:Cbqy[˅ n\v92MdzUZhrp8?y%}(!xQ1*UAQa `X96BQ"b`I_  Q|8JhwC˦n!j>ӉRPKhbШI$03-Jdn>56 3Q3;G#TᾖGXg&.bDI) v9:kN:tJMq;Se\)>6@7L1 =QF˩6/~aN*ƕ*X)@zЪ>~r>pX6v^"ՃRt3 26CN{IzNDpz !$Ah #OȒ[1qj\F۵zQݮ4sʺhbtb ŀqCUyr{YzKs sռpeMP9<>;HڨM:;L(#}(`g" ZY j"X/8+P"3<_}{9Ʊ&R|@]h1\;Eً$>>L1c%;꧜ $qiDOm5"lB:~Nqn| [gtYzm_.\o<EmYW&׻h\_J)|U$o s+Ҩ= }pP~)LdЖF;e:z>4X&O#UJu=CbN#se:J뤦qHaE,T#dTă"Y*A 1kqrlP fN i*#NJ2s]lj|pY?&Ի )Blypw-`_~A$Ji` (6@ d?'Ϡ}0~e"D5xdQ$"RUӧ'$ h%IEA,^{i`q[5Ņy?m^ 0vAGvHC?w٧fh#w1lTlc#dr:<'‹s9J*?$j΄.zY\[J3iB  7 eI1-Du't<^seqzeMFh *1SZE[b#)僒!B|_9bx쾗}Au=t}ȑt:flcÒ:[Zey tχUm=6lI=.1V'M4jOl+eH$lSQ^@y .CSp ỷ ob3P1|Cj( @rBzQevbt*njnᇐ+ L{G[5.řaE*HC}f=.n7;{I U =+ W1da:{{|'GR>Ryg쿷0_̪ic+1CQYqY/2Z%!MFu8FN븧 z'6Qxs+JQdS]镞hԇP"e~rip 24\BH:x7Uߢzi**BJLT~"mZrGWGo 9VI,!j'KFFQ<քu+znAajYquyzPuKߣozpn ?Aas?c_? qPOEӂTx+߹FW8CC9nȱo^LI\Rj ^A9SSdת1f TͯeP)sbt\-4i^&!:KsD@e 9oAr:~KK5Y9L΄L?+l/c @X>0Nz!lMYlՔ)tǯގU7܌AN!u:=~>^uÆB^vTQݣ#C;lIvhKRWne5,ra ~vMɳN8H; ȿWK;n' md/Ef!;mB2qW'=Q6,S4Ԭ/v;D/ؿ bU=Zf(S)">֩I~E'~IxN c*;3\V\,u4:߽@*g.i!p~DσyK'}`ːNT[S9%99@ vh>,+}D/y4J+go"S8#w0LXm;KF83cPC\VeB/=^@n.Kmզotn9=zEqK}?OFZS-$#hDW1PUw(-wYYteLsǰ@ji潁THi7˷U68㎭8>7]D`VsO3@,̪]9dՠdx2_=UbP-U=DZM/Jr悟W,1L7Y3OV l-K1$»Mgc&!|7_(H[ w ~;m{ tիK=_H%;I|ib!\z'F%\m`3xpPUl2a!^J_a#$Y<]M|n5a~^L!8}жt*;mH{a"lCr39\E8!OhQgFd<.WᚎQY͊-Nm1T~8=Y`z2c]LA' ={Bb"~v ːyǶ)ܣ= LP SB0}d 9{w({Ih`Ч+vuu 5[L%&e~cgKݗɿ-t]vGPI^Mx&Ѳv#RU—/\,(W\=`FHKȠ:iG.g~(zqC՗>k'LdѸ^[ h@ (ShVK.&}(VEkA8-Gu#~o@In>D=|+kn[pkk3@h*)z} <ozI}jF \+ݿv}\QgFZ;/j6>9צ9sO;w1mc>5])R0pĀhpCtڟx)qS+%i)) ?y<4)DvcvՔ?Bpw- @.;{-T T+ųQ_,D8IT(8YTscs8ջгmF|54Ӓ}KAJFD5J2x{S{6Ugy:4s a n!omn8^HеZ]j9UtD) . V<ͽL+Mߋg{пkdat71(Jwa^oVbÊ[yl/o =ȜD>9bﭛP}V*AXVMW 6A~D8eYr @#z%$ y6 rLnL &G+=hܒbwK w1JesC1jSQ+?,E;aR*|}4GFD%0F|$˜yǣ@{IPonTJu뻤v~g^UU#kΦ3 ۍr+o~`tҒ+LLb*Z / ~|OHD)qqs9UEtR) Y _37R~f4]77;=1Ҡ}*jOT㋚x {Q}ɲL;U9[ұz!(pZot zmxPuWV*Be_J`vw|; #j} b^)eҧțH}T)X5PBf{jDu5U|>t?=/zemѽ+7Ë@BOÂRӔ2/tAg÷aD(9X3~ɕ17co«нA%A@E38@pq~Rh׫\U}W2ʋ_޾3΁hk^|[%מҌ (j[`~K-aJO<%6($LE:Wn(GeM=.>: Wos!}4[~n2mP'Yәz &AXMnnA@R>ي$}oUƳFEu$&>`ѧ]ᔛtdan=A).[:o~0dtьK#nyHpB0;2}܎Pn!+sdyaǷu0 QG1{RQ{vO3?JrdmzAb曰Q|ۓ(k=,{XGj]:HFzҰ~u0:jr^x^PR81?h]-V}0ѳ  qG| 5O; }ybz/.X#Нy߻#Ov PWx%'iB!Bܖb·;sH K6 -wsk\:M$QfMh\:}js{BO"8rdՐ_gX\~-D+4w]4觕6x&K6#Vm' L*HwnՁxt݌#!xI&RXN0yDzZyU#,TSkf.m;|YnrxZqm}uRR4>-ddmdi>EF;{l<:~-4!J p ZHV.:h8nͫrďo4?j$TV}ۡ0kرpc$iƷ2O'h3ŝU=n^9pB^v91j5ZL2o^px_@xΥyDKd} K6qztU\9 >IM5n[d!h]j䗛с[ũ E(G'E ~\PR`2j#Sԭ|6&N쌮+:=_Lp T(D"=@Ӄo ?98L1/uK/G!JuYZEĿI.} M[nh湖Eܢ=G};VJ/ڒY]AcζC"h'9cA='\lVk2]nn"H~IuR`ip͜4G޴?^W]ELibX2#= z\;ne?չh[;gvcnguM$EZri94ؗӊzpXI\Ԍc§+aR|*Fg`)BZ7-al`,{>jڙ ) 1v# V+MujgS.SD"#)nd ]D!;cpt9|;T}_!k̩P+,:2QH(KZ" PXK׭F3_iꦴroߣ=OgYKvظ$dQufK+AӀ% %YGE}땶`->S:NYT풶 gVu;9PzWӪBHxo' h[Q5xa`'4ߟ_^G1KiJ~Ҥg#ȵ^<%*SiX,es7쯋hw)?uQ~j۟rnY5;aU(ǔim%T~η3 ] \}v S%x =!lhv Ji4A o9g0,6\̀;g$=e߅^,Q' ^xCCI S<9לwvNv医l{\wP N|3WT7\Êz!.L4bHلK¼F^0NX*;}髨S%o`oZ<飙oXdA&_j;\?Ol9=aOX75eΒe1|$>%pW |ȥ?<*5,hȀ=bwlu|0qc:+,MH֢Gו\:~a[1vDL3hJ3F a<@Vx,[cG 7U5cov~lXֆ",unc"/Pe\}ZoMbP@ ߔ]KMFW 2ЬKur2Poн]#WD}Ls#v<,Ķv6S,/bQI9lM=:Dg[xRE\e6}M|;/}V(g C׮YWDoC\L5Յ{rwL mMhݔxzi -4ʷ={IH4}jmEouyȢ+ P jؙmH0 gXWj3%'{>ۀ#ힼD<>:V:oo~wt!y HBX׫[l(LdE5ubJ=uW:?7 .cޱʗ+8{?J^T7Wuӿ2IMmI.qN{$r@=v [ƀ.D-Ԏ!7hkx!04DY~3}; Em>n/: ~v{g SݗaN&5?NZ%r7*WE.1TZcs'4G}se0qDZl%Mm;%0{OHԋ_AϨL,4r1 .lCjD߹|J7ĕB?8A?P^.#h2 m*e<;xHEL W IF ˤ 0>*V;v=!*UM~공Fw} =!Njq׆ì6s'oQ6y5SNb@jJN0@ I xUOo^>\y qcN5 $X2#)q)GҡFIT:toF{7B k(ԋZHSd<$9?h0>h W2~u$icؖ2ABXA+}w;EŽu/xhPՅ.,9iA>fenmLFM0e:tF,33:;8{ W0sh>dn1N0D6{ q@30k'<͠>  ?idR*t evp#tԮSudL%"h6P?֋攁\ȃR q<'ߤduf).PvFŷEhgO[wRszY`p!*6jMNU2BcK[cS/ڐH$pWJc$ZoG_(&; KjEEcO똧Lщ>kVTpMx~~D@[Qx:v'J,),ž23-(zx'b6Hlƥ {'!ȺC(0uЖ2Պ$ ɼи:|(l% RsFAC.WiQMGEɘV jg4_JV 9'<$\!`'".7ѓ)`:s NLj~6 e Nxf 'oT$IF>:SR\1޹V{%R+N=_3k1ҨS B:L DL;׷9__ &:`sKCeqJm]qyn4$=?kpAH:Z@K=oS>yMw9s[:O :gApfmLAliD59]y'D<Бɜju ѳR0s#a۱862FipƼK/*FGr?+Â-~!^ʦ؄pVjOL5&wj+B8t_hrKF)._7xji!iDO@`g4t-5"yЀ 1O{4/CvQS["owER3d;=PJ ~V A v%=A)){ƙb]J.-+}BucU$GP3F[}=0ѮP7do*'}`P2)ueXPIPH"k&xAe= "43Dz V\݃?N+82D>~@׆$#?g.h_WKԣYh܁:Tsr 2nM奢͵RS1W1M5CM]Zn 1CғvOTzLC&2熻L̹Bf-'9yD`ML8oZ򝗺,py`h[tVo^?Lim'6w'ϰi@(ґ ȺA `ClU.VPd<3F4 0ĈhBűMgX4/bV}:=?' a?*2 %V!c6Z($tK%xUiqF;Wu0,d,ϓx_#ˋڙp5dI: ԙK7>E\9ʂMG=v`y4K;zJ1o-$fLK,O*I~jkJ<8x͑Vr&ri"'})6>&K;kDVBhkmc,EbM;a6]z\"2l*FMauJJv>HUpƫ4<> n-I[X%!̙_A1X%%%/sה/Y|kR48o# ԟǥ=Y< d'yT(ȆXNR\jwlټ렺sv_D":&ƧWA|>Ζs%zc];ИUe2\PN.mח ?yWYhhҌH[ڮEnAAC[,\}ssx,RpYʻ$P(c:{D?`^)aBVVcx|%5Mߐ RɆ>/ȍTu{,ɛMzˈ%Bt3p.k+[TbXݛtxƃOO`tW9J2'ƒTWeBz*Bg .`\cSXo][hrP15^>8]c4&G9/sdјŀA E: cW$t%9W,Br_6]QR!Zdr>(ߨUTa!eO-̤#TbAJs_IRSy:l LWA_}d`MMfݦitSIxYp$l<´kHPyuuSJiyh>i{ZS{*@B>Efۦ- 3Stـ{x]G*oeJv^75lٶV]{_N٦'ٟ-x+z4N7ȭ@*gkzTM $Zpr(me*&Pz=vTE!NgudDյ^{zێtX2?Vi˝"دAwx]~zhڪ,ǜlҨ.oKF P M#a3X_D!h#c=LdGrZ@ShؾbWhwe¶f&:MD=2=Sr?SXn[BQB< 无*lO^֪/#?5LrNvLQ(8mHzbfpN&zҬ4_u$GSD7Ea"Ū൧[G_aE֡\߅1Iڍ wІF p0 `l7)X/vt:҉QMvDI16~JL6GM [m1Y:BkIh_,Є{c)LzY;y<@FpgF,vsXHRit|m ~qԊKhBL >#wd90*@8ȃ&)q0d󢇯34#B\zEm w0ڃwAip/}ς.n?'VݕGѪЩX)G{`hS ~^OWHHt T{ a,!|H]"9rbA{XT֜3ZA_[ ZʮE+n,& 9uk._5}Qmҍh4REe79@кBK'D!nif :-n brd.XD'3Nm/S= Y\*JN/!^_Cٻ] tZMDah]^bJyzԘ}W_I~9|*w#NmݸY̊5~(k ͪ C+яyt򦯻,vquk}4ZY|`UFָ\y>=yPS2IlAҭ3 *&Y.w\6u-/)*[&$OIxM@ @49nhI ${H219@v`u8_)@SQo_FsH&9UXEdZs;Ru%X 5 ^+Sh7g7uϣT[:ud|oVVv , JsK[ZPb ۩lWDCOX)ic1m~TuK-C'7Hp* .lO}@Vd.} ?J-7o(=P߇&Yicy,q;g|6?V [G@%T(tCVϙ'§b9EQi aA˛9HL$?fԱ:l* W1byK1[΅#ڞ< 7D`P4< F!U qRORt7cȡq+Ss%4P1֒wz:Ǵ\ݮaһj{n~$ DUbZG.h\Ks[dbjG_m\PvMBJvSs#%3)>IċI0 ~ެ0  EL3P3dH7{{`㟉fQZkji7_R{߼'QSV7ROWh^U7yVzvQ쀵u$c$ٷ?U&o}6.3@U=@]<^ݣ OY95#0jO$x2h-🔪*&(Eo8aeZVD%#K֖Qͤߒ%x~S!6q8QkpGZ憝Xu 6C[Roi}p0ViZqǥC5/^|pn5sfn=|€`[a4jÔmEǶ)ӑFPEK״ Ʊu.v lN2y~fJCvr;NY :5d\B?cQ<1!4G(]??]/?a)ٌiO]zF0Ҳ$983 Үp`pWgI{RS$8Ѐ\uUXx]f{G <-V'{x0kuwʌ:jTBDw.jÎ&`uXv雑\, pkd,sEQM[_}4{ח3S)G֭[yĥ$m71!)v}=aճguEUSɈ7p6;^@BrB->Lu/~P2͆ vqT3ڭp?u4"3mՆKSǐ˟wwŢ{sh`& 8W_@ijbb j^yp2aKV 'T+1MG^"AQ?@w]dI}<$}I3`zK2*LO>AF[Fd._G~{T r"5e:DHvȠX0_#nCZܼ:&yN4|},=rd( XvY۾gnI!ޜ;P6K6SXyv$nY6sr r&U8;63fh&E l$h>)Kijz!Y.8~m4ffVxqwd!P9APcI `v (z[x= do |+6iĐӠ/VrwTlѕ aD Vz*X=X(֪!Gdh;]x[4@.HT7+sنۀ"8za׉Q;*Q(]C);/6,XW$Y<r= TkB[NrP~-Q*̢DY`T(jHӕLUyY(r kCF{Œ]A;s~ZSB4:m`~@w4H([K׼Yjȟ>hyP'W0̅9PJyk:p}HTӬg&Rh&<`6>H:A! G ٯM#ǽ,/w< V:tTŵiţ?({:E u$ 'PMԿ8VȡACN7h:mB5bz7\PL{;OX Ÿ<ߣ7ӑXxʪĭWCO̡RBMbD%KVD9N OrRdH9V(~B sy|{FZsVB}FL~ TdR40uaEWsg]ebi4$ (Af\I@:u;`f9GU[TjPgYr=Y,DbSL@ۡ*~'U v[p(2拇: A}Aר%Ŷ܎jտ:`]o@Nr%KֺXZlC[) R=` S ZdE=;Gw1HwhXc`"Q?L"Ąl B{` Nn^4+;PM1y>A5 ã ղF'gD%› ɻN)IV 6[9+KབྷVRv8=HPk#O\Oq 䥭U)8ha͡_?mV?T)()0x|77P$vHdzihK†>7BVl&_%A<>dȓGc1$Wg&\rT0eW#E+:Іu;~OkX UXvqmhHlucno \XN y?]/N® 3 rPpEt0a${<Jx=8(;}V_ӑXefFW3 `esͣתE5]W_YO 60bN+R܎зp!Uz c#}mݸ,ISm÷OhXWfϷo(9ͮ6ն-s0fm~Jw$QFz[&hgh':-UATh:=Wa ><7z/icrW]Aq(e$eCqN}rXA['^F7oOYQG7&!Om$V\W~O# ĥ˴~9-1n6qV˅wMj-wt߾N24pgIh #gĸ pJgUQ5ǖnvGxDj4u qC4ם1_i'ݨ( ΧT}^J;m9z񛃑wѹ_mԯli[Mj9fswʔO]d#QU-ޕ43;yCI]U fO3o /B5LBtl!@X4~ PIwMcqYmh^Tk9M+S:b̓>#aJ0>Q!ٸӟ*V/(OMt|`GŞд  ĥ߿Br_G"kb+&o!烉 Joϩ-s&Ίhd~yv`k7⪝#oң{-ƾt4'{CTdyh;́j!ƥ7@y XA)6t_L=ڡCϯıά}" Lσ"W:;Gk1`16.O>5pdt @ʥ/}s$y#OQ[oMշ k?-n̘|ꖆ|c;E+VćDzbF`Ҝ28:^K|R zE_ʵOP:ߚk'$Qw x)/&<'ɰJVpQM?'g/K<\鷌YC^KLkx<%V()lt/bG8&:r$@doI៰P=A v ]QR ׆8t9[mtރ oe%X=g_pGK!=^-v 4Rd.e]ֵF]TsmEW ֖K|l6e.i[{}309KN4f0.õV+(a2y*PϠXn f!)Wu5Ef|}Y0;nauIH>tFطk!k쎇,zn+]ȪCR h) (?m`8lp<2C*x25c̪v,yz$ј D,^]v[SݟT8BS(?dò>hDGJ=g!. Pϩ^C3įƠ?}KڲG| s\ {[(ɴ]7uVR>@zeV09V(b'Z7&K1' /wIWH^F&11D$u_N:a5EIߕ膷hf|SQ&{hƎ6:7\S(XQN 'lٻSX J]/Ջ{]%.>&@YW"Yb:0Fn]ВC[xpdcؿ={VߞE%JٕJ>bh`*•d&i~j^A~9{\5dRuOK}G`7U`CË :dAieQp [*\J?r=|LP0 qcϗcbb_]9&9 8a{&u͛ ?t S<%`w??ie=tlk3G5"uQXz,ퟯm/AV,Rt5.Fup.;"t9?W.o̝Hȶx Z^c, wG{+X*xyF*.!~[٣ Wxi*#;RqtdG {\oP+ܘ4.Ie- ϾF&FDݎI*{[0h(_a @E)G=FLlg+Q2lbF%$T]Ls_TM9 mOU5uhH:]4uxQ4e-T?itf!^ U<ʝA(#ng^]o"x*Qn ě=`%m;J]M{VrgmƉx a%9C̸v棧u첚uZ iKn(n$߰/7Q1-2K-" 4]& X>˛y% O"7[ی ia҄@w dYŎ"z:Q+{T$a\cyf*V1uu@UtsM($l;o~I0F%NWj}UVɧ&xzYBˤk)9>j![nd~d0ԑX(r2O݇9#@>轟i_f.X+ꎚ dNfotUx%Å/o̪sS_B?<G*+y_^te&cLPlB[wluGBDI>s*0C0y~ ).Zٔ5E&?mM~`ɡJTL!E:Ӿ!|gXH>>vHB^&Pqˢ1>󂙴Q=q,_m_D ΐ"#Jwf]tk4)rXVu86cb,e}+MAc#a@p@L'{[c~l!Ilp+A݀Lcv@_2}q7 ϻPC\dKu%\oS#F2½$K6灈of'1 POdL[Y*D7ڢ$H=JdWiSE?ϒHgJDZ?H,dJJ !GQ9 |dAxSXH0'ћ&wŘ(Az&KW;PP2>tFOl|dV-놈؛gz('95HfP,ܹYvm]MuS+=OtߜFSn8DΞЇ2S@?NcsA:|R *l4*5'ΉwyևbRxM*Cǧ=o΍0nu՞-ToX$1骽\Pt:#q'gA\O=/'*Loĥour'VE!7ދSGhrcftsGkhHؘJ҉>J 5L![$9'I]\Oq15@,x֏E'+3;w Bul<7%!u,+!z=D>] BH=0)?h5*uoV'fA\3iҟ>߻~MG*N`|uxϩǾ oagŞ^c=ptCVɹO҆ @Du cu}r>Jml@{cBy(AjyXq!3g1g hlj)Db.P(7=(Gt8#e{%L",yox<1,r@## I@cЩZcTvX9VyLV+ >/t#S6Cz޲;:>aW]zw3Siz.n?yKi$YcS$UL̺?+>3Ғze$I ychli-!Xmo݈ǦP3}= YwqWTzgl;c G`Zvǫ|4܌S \3 -)!ȃ芇~b&X0]?/;QFFZ*BcZwkAKq"ƻ6 4r- >% a6\ȃӡtOgҤ;ң˦ˡDDFQn>0Jp %Hh/.H+"zmoXW-%/xC 9U:Hܰ*#ZjmEb;03}C[gd_i4tVlTjF<8g!\H>#Z~Xre+й%8^ BA%,0i`G,(FfնQ?uЮa!qbU^Cb,e2Ew4!zJۖґ=Dϒ=p0%Sc{ ?g@YRٝ&Ћg8.nkg5%yE>|ΓB1C6i,~.gwx _cȀM@BhYe+7 G5DL]MCء!qgVVrmrƦ+D0$ ,i#[xcn?xs0v[IDKeK   D[7-o4}=dg;+Y3j.LFoRI-1&j|brʟF~n|7 .#5 "1O+ lxzRkr@ 7a;gE p.p)#̉?A>WfG؆3]]n,.5XX57ap0()| zK> ?oj'Ի/Z^iR%.[?IlO`Ze>,< :D9,["L+FmS> vbgiB3HJ52Vi^VS2b);tt 4E•cpAO(88S愙C9U3>Mͳc!)o(0w>;RIf]iT cO,냰;"& >GK@56Ki~^ !r̢6B@A0Go>G "QǣFΑpv.#,zmU-6R\8|IK)H~k>&3JcNU@S drt/^moY'^pc*__V|@WF)yTl:/fUvoEB싷;YdjOmSܹbפ6NQ.,yC_1Nr3Z^yMeH獋OA"TWJJL&6O96^38_PM39\M}K D?*D p̰:j~ iAe>UGs>4JA zCzL|ә烁Kx Pak!N@ėMHփ;9;D {B 1{Ș?GV@oћ5Z7i[ oxveq)BK}gJ>5`9pĕJe}SYDrqs)YI1|\QTQʚ%B21+QK'Ti bK¨}ԏHt[VylCu"߽/$4X3dQAanA1BQ$m1*_ ,U[Y)1kÜ;֑@SR,k/TJ/yűdrLhXsAV0=evN&UVMT ή{7@Br, }d rOc-b g ,x j݈TP5hkIR>1Ia]mڧﰙ.Pz t\~tsIEGr{͔qWЮ$n4eT3!Ȅnh=_@齨f2#:Wg}/ lY@Zr}&oz08QܶAJ!蔦;IY T6~n(D>eJ*\κgVzM@FPNWf- 5dHh1G [oԒAfv7LV'@Ìj>2Sņ?R(&klm#BPXMzLg2QlbEVDkŅ[$$gP#٠X7W7M[2@A 'ۗ%ȍ-Δqy%r[멙M-r 9lW8Y;57R"51Bx!|ʥ읃b. Ar6.8>5 ,*fGsa1Hd+3 / a̧Dߕ W+gkHt17,zATMK.H`]q i-ux^ƿhfEdoVo4 !Vu"Ls 3KS6\kk9{ʇMlhը-t$ cײ|HKTSM `Lp7BEsDG% |WȃN쟝W)#ݞo)>N0zg=`Cizuroxl* ! n_= 13}L&q;Kbhc blr/K )pYTn'BYnZM>j%By!yM}/a ΁yLN𻼐v+Xǵ J72;[yI8[/<e L$eqK'[G6iO Q\ҕ0C=aIZڪФ`~[ ,_,Bc.IbzϱA*Z,]0\h0!*@k(Jgo)8.}^\ٶHe@[$$֦Wjq w_.-SUSD.p&OXF'spwQw9M.{"6 A9L? !C]<" l/~n(`3gHls@&;Y3꘽|2:ap Ac@cCY >o<.Yz{(5.@dpniH 5p%jMp q2!Ķ;m|Z^Ps|,|$0 S şy:+ѣnIo ޲c|ЛϛU+:;Wpb^BP`蒘f:L<%r+a\Sa$39<鵥 Q/RΖ[9O1TW3$8TrnƫgYo2V>(v0[+y :w(ՉFf>.E@L~_wݗ˹3T)/vX\hLYMY ۅ7#+f:Z $?ޒ@=)5+8j7C3io:OuK _s$FF,_ 49XSm{Ԝ'gEJЏypQ|tp;P&$Z&?4DC"p,2mۗТ$> l=r.">aY8g3x*xyMwBAA# V2!>t/JVо=X)SUܺ>\.BZۈ{8 To!|6kT}5rVTLU]r>l=7¸5!J}P%!~q)=t@`irSI^8nPG-^IyqG#& X;Û9;;EMO)S^F8VJKҾyXK| 2 ftPk 󻺯|f}$ntOh۪}rƑifp)N 'K0^l5{P$'1Cc ˨>}]ͥ$;4ĨcYaT/`(VcnJ50c15mqj"?_o =e3[A{/ZӐ J#[h^~$B@-8e C>q͘=S"U.f:J9#RNMA 8A-UgGBf!lZ=/ `ʊQ'n07Ёt SQ( Yi2N5B#ōpνE1}-l:?KX>b';jd%ri0ŁS& 4,gB?KJ\5Mxc#mS@ `ҿL [rX )s0\Y]~a+= ;9F-с Q`J~ܟ:lLԙ sHUb.ʖ~2R*~?gh `lv&uB"zD{F!D(y4QfvR:| v#}EY,}|%oπ|JhQV{rn~;^!ܑi4Q+ɝ"ɫm%1nهrr\tUA\zqz2wa6+`wiʭ R0S8_b#0IxR9. +.2?B +f]MO,'qc4m$Q t Neޞeϰ^.$lmEDjHЗF B =(yUH?Kz#Z?FcР,&En`s\nZAt: ~ռi(R@ i@:8หm(m$^qbҠY~G. 3{'rJY[ށ4DmM=[DjG]~Sp~hOz0-ӗyn=$"By~i ]y5Wԁ¼X !m[C m4roD ӭu$_Kw۽z`n~U&d޿&QBc4W@>\5l`Y…=嫓!A]F]IϞ{U&2ߚ"G/B <',<] Jf-VT=[x)C;oHZȴh1H9 SH:"fǜ_eb=V&p-~O0S>"F)[8ImנF ܺ, '~_am.*?<.3_ J[̊~ Y`,~e6N sR>'D)Fe ⓸zslVR7U'_{seU̙PEPnRʖ*@MGTyC 5,(9} >O\ 6ήAE nj4k,O…zP2ݕ3~N &m1W jM = c[Nӥ f^>:(iQGإ- Q݄.QhNШ+)Un&NN#T?sZR,()e\YjZc(Jt>ID/2M2ν覢lfte |?i٨?^b+dR'"0_qqV֦c3'KVEP觢&v no#*32pWwlߺϽ~;RS;`:`0@nYE?UDB1*D3h6^?V4bLw` Y8s跀vF2I$ݸqfq(_FN9Q?e V(6cFok %[[0j-f='cLOB^V~;]%*r6 tV6(-`s_lƒX6z:oÊgʺ*~1ƀGpHȾL鼏(8tK{Db~sR)} EayIgdXP⢶-5#C5? 5\m-6 L*55,TԽpm2<>G2h~tXwQznrfNWM=ub#͸|ARVFN&_9tC@TuZ͘O@R PVNrsAG!Z=GoEE pxڑAfTB!tR" ]U|{1sKx"1hYts4L-ock!Q :Tu/VPDv%juw;=$)k7Fuf3'$>-@%^ K:N+)Ȳe*Ӹcc-C2!VlE3Q%5< NTBknVwo,9fZF;Aѻg#G5B4-:؂OY36{ZCxlFw̥9_ߨiS;9nӳmN;n`=[Y2g`0L{Orko9s'LA:L=5| ~D:!ńa uF N+>w4LmeApk:o(ulǹ69ƨK}-6{Ia6|.=7EX`L9?(*B0ByLi˻s" ݝ$M " <_.*MI1td>I,b/WS lF00TK0)cl_hN%lke[XMH5aOm!izr@w(XuJwLXt=|ӍY懐ʀ@I@m< $z/a3,D.j\(mԅ3cxOt}z[Q!Mr;)7OHV8cp(Ȱ Nhts{q]'uBۛglwp9ᇹr¤+<۝Ǩq wAw0hU=«4vApitOwH]L1Sz-HߟB/sLs+۱D,朋!A_ӿ$qdljRΠwdǽhе*?6ZQ]8riҴf+ZBi;7=&f;JwR6r;.+%Wty*FZhRYF=XF5ۗ8n7ZbnG=A"'L7JܑKT`RڛÚ`9\ Z;(n(S/޻!t'iY]z5 Q~6nZ,G0\̯6Q ! hϹ"vs֤^xJL eC%chDp 60C6wꔅdn>_Tp*~ǐ$d.*˗gSr=#+aYbti~̢lӷH#Hf[a(חo?8: k&9{z:mN3+GQnGgaJZ1t4;|˽w0zӎ!8 !e#[8O>Ɗvp‚QsBq^ {po:fRs|G^3RF/; l$Qݎ{o ! @ ngPWn2ck ]}X$1ezs,=r"E{^kS45bGC~neYkA8d, lo|yWUGEp4Yb;̇%tIC7%=r rOcCs Z\rޡ x-Bq &}dƙy 1#Rˈ0"$Z >l7ԏe*5߉JR<~4V+y]C.raıEqHnբ[aqS6n͗DN1}28 ,|?B}L* v@ _l'o8Qy^j6}~0BHbzȚ vUnd󰹤Rg;` |qa"ZQN/sH"RF5;bw[p~Ph@w_9'qOx/:mt8k?e nia덮{6gP60|°3VeGA0o=b5s6[ "`*-$pxSlrK#ns&:LFw g>@^"䧐vb&^a@VW<}SH8%ܠs\jƚ>yqGsm߇0E8@>W9/]HxA` -g mm}?dZ({Bs+ %}~@S ez2Loy AǼKAw`h)ŕI3=bsِ[=.g[7R5bO  \Xxp Y%N&6㻻ȓBXp2 8٥&F=|ʈ6_=hot7 &£w]gjS k8gWavdUE:%D͝32aMʃM^6*-$GY"'8_A`d ]T-O"U__b{t/^y6tO_"glh/ԧwC8@O v_H* _CbA+hM[a` IoYl29R~gn[=ixIT5>SE4yUBv偷yd)l\& A@ ɔ7Cs ,!Xz]pPE vGĈ fȥJŸ:PuPuh'LO|'J) a9$m؁ROvZ8b1D+v.~g/++ VS|¤Vi럾9M }5xgej7i/Tܫ3Mt4+gdN?mu7f&R{ceGp/@`/~wƻJ8G| ];Us>iv 8r01fhwb`^@dl8Dఋ=+ Ewۏk־Zݤ%N R!ɶ\t03ƹWCBއ9 yl׎["Dv$b8@N'qu=aZ}?g@G>8.i[ʕgq0a1?=s$!OV`iaRCsvX2?c\]FQ"FycpܿkVRC,Ƒ>N^q{vI)9sc  k n6#Y:uҥ.}G}@oҲL%t\ܦWī $K$uI_9t(Q?4g()pGۥ6VĴd)X>(כDoA1Lر27ƥa6SN2;t^X|neS+> Kj~nQ$aGGۓ-\Ruxp=5 },$Os4endDAuxQ1“5 ucN_},nxOx[֏ltxBH~H# eȤMub?I.Lh\02$$m.Ee+e ;p7?^`)ߗT98=vY @ RP }fu -f,#3{ʍX.r(I= ‡K;ڐ|E v7vZ-1qohm yv*e6 CU3a_LLQ:r:oi:ItIq;aCUiҎ>锶35'HYB@/p"ϷRz)@c %b6;|֑o 2{g#. X873tgBoW,Փ9vGV.y' ܶ^Y:R{z) J;Ms6ɴsmΚ¿TKg s\* |nFraQ- zϞ ϻ?e`dn2BAA@L(Ʀ/AҸ3k( hBĚ8:uw5:tT _AzQ\u&Fӊ^ W=ػUX$Tܣe#l療;5HFǴ&NQBh2m\z86߼yr;TgrgKrO0Fof"n H'-^zȵ::E d [ +4Vaܫå e~.M7(*$(R?j(c/>֛ Ν?̲N`'Vf.(K3 KℕvrORjP8;hNr-WzC} o½]nO ebcO8.m"jp$OɖFq[y)h#/W ,n߾TC]ztbKurZP_BPJY!obpWe﬜Hݪw$(bQg@Duf^xLPkvr[ffBv/a׏B|g?bZ("Tey|9ȗ Pg*hx W5R5pӡc@ TzA&߿5BR$l`7]ӆh~=WZRʷLqe[?AxIy NҥjE>P30NWf˶6ļXSh6lQr`Vs Bzj;KDž㏠Jv_WT8da7 _lUSsjUίwg֫^_aw:x7nNrŠ0E ed5߂+&_swQ'{k lB#\6̽Y<> f㢸/X.T KW8FR+U+3ןnCʆ.fNf'}b2[:.T=Yt"˷J3S?&ſ?~5oߐ 80GX>( wuS츜'դXzlKV\NA1%AuBFψ[{5hB4r~=r.$ME4pȨ'IdÙ'pshJ)WvۊE8jӄxZVA!heOxC70(g-JU<%Yvj6$Rp F/Jsm=ǻ>5׮JDy|Ef1w|_#8:3 [}!5!r6KF<?6iㅥWE,IE-s-wpsGkUqĺ~X7an4Vԁ%܍CJS]tB4ykv CG_|JFW _Pբp,Q1q#`. uEœuT[ZWjr^ /P02 mH~, ;*D.'~=v#;ؒ1#.}É#r6_-;}p#LD2Я]c[-!zI&dNKw8!V=(g\)da@ib&{RZ'-%/l恿"JG ʪW VKb{Kڶ2d:+C"i1q+(/X?@df3p!qm@ЗX§tl<ȦE`2PY&oՈ A`b1w3x^|im^+8bCasO~TS9} VqL4@ ;&sQޕ t{F0" 3w6}]{|"a1!+XV.6@`OW_t 8O0s.;f>]sk'(s£*B>*0܆!#|V;q#|ɍ[G%Vt2BM1@ٙOf@x7 f7,bKl' K3Aō FPQ:Bs-Oki^xav[|WPD37^Ƴ&Գ P,t۷-b0߄>~푝>7gpSq%E蔶 '~]oBF-x"4=cYfҡs1u¶9DB,M+hT夎5Lv~g[3Q w}r{5'Cv:|d9Lɾ (Aa@`:N O_(m_AlҺrغv-[$埨1pb Sy5ҥ+-†ȀDgwhHB&tKOX>cYX \[[K?.(FTrUZz+*+>~Ine#ROC8y-ŠM"mz zvA|ɞ'V2R8]Uk?6 ,z08;@=!NTKwUlvZWX+ѱ3&Zkkk, zYdZ,iͤqR[%?ۇq/SG /)J-=SCMw)ﴙ v˳u7tl ~L>`v I`-cImnH38F|:dŽ]n ŶKZ*zpL$AHHpi'-KEla 4d~_5W`E>"%|isܗgK> ius6 S48E8'U.pAi1i>Oϫ0Nʊ6pOV&CZNe뒴H!ȿt0jB >qb @h 8ڏ㤍@JTp9A4pՂV=1*sצYqR9hIgT;봻q ISOlB39hЧ?ܑ]&WhC]0ӫD(6y*$sQ;?6ݍVAe+vrlJ>knq<F30jIL֩Hv]z(# '=as'3B$ax'm=!zM}~4 U^ d8Mxb3['=9WH$B潓3B!TC5]n@Ro0|NӃHl# &'8+wR$Iidp_0fSM!hnLi{ʣk];Cw'S47p1vppۅ[zf`ĶHz91``PC3+&A޹K7wƀIAmc*!D;s?AyA4z2NYgl2|S7aֵm>ȏ:?03.%51g;"/^A9IJ>>b2HiׇXsr{ox KO40/`xz9T6# "_ {k{?{|9*Bě%. 9EuPXM%Wvƥ=0q̠JuSBfkμT!kkj>2z[>Q9 &dPaX81 D|)bNv AdtSg <>U46'R v5#+,Dq,g{TUs{DEkTѷ5 dnJF*Ƭz4hҷ]g$0hXs&'J)M*yr[-*]lΰ1&+̞hlXŭL߯]wUm91- @׫6I̐|S5>טwcF=Wd}r5MhTRwT8iFZo_Ќ-Xx 0C^H~kqu: sޕT?SPY3P,X*Da7icժ;i}7 ]KDtMF!m|!u϶{ڝ[ij6c>W6SNFH`}9^cX'@iQŖʣ0~vQJԟ.g ЕЬ"Nη[ k[?&m႖ޠF5`_94 @ŮPڼf<6q\ኯ*vߘ+Uh C/存CGc[4*@@w,,8VSU)b^qh njރH6> F2ì?| >t3IX@HxjܾˤRRfǞ'ُBor}n*H:a'Ģ4 X#u-IZw10 OZ?!f G,ů?p7تf( ռXqx!#y,$|\zI9LX^ x< uVҔ\]əz3鵌I  v=Mz5DS%+U9-匑mT'oEJlt·Me4:Sه+> #sF&Ţ26k( w;Ci:=id@zU!1IKcjBmlZ\Py8-a4Esr̡n[{Uj ZSrB{cyك\$"PR)/'[Uҕ^:9 48YyggY~ Z;8+?%xu3qy`RB%*"@h`cߜ)D:Lȩh˯w] Mɴ̇Tæ~5 @r/|%_D!d l9Q,z_c GxBwFTf̓|EQ\ghϐP a@%9ܦVns;-;V6]?mYlCsP)?"ѵ>䪆kfP HO0u- *qp O7ox`'\N+ɐrF}ߓ9V|qB0du+Guoc!)%[LiaφB7%`V)wtvEOn9✬ѕY:( @1x+>bcɬ֣q#A8c])fwQ) A.'"0~~%OtmPV ̘E bv1?ӑp G> .a7҃|ߍӸO (eb iv IzT& f9ц`AjFڗ.xῐ9\?t_BS{8W¥pja΋{)3 ^_X#g8Iӌfy.w:U4bϝgQd]FI?hg O x08ZݾbVs4x< G7~mMW@)CG-6AYs2fYͤz̺Ztt8 d &)cĎZB6kP\xPVZAP4Mnk3cm|]O;6f Ril9Gmq\c5 R6CsH2^#{2 F‚W]kҵ˧ HsrwȺwp(@2W>; A #zH(P5Ao EU8TEfҴC䪉,v72=x ؚ%O{yme҈>>FB F x]xYU_pE?OMs~GY"zJњ*1{Rh1 Ex{sLVm^]DOԘ`E{nDOf Œ_=cmϯzmfsTcJ9ד ah(/ܴU38ԤeyymӍ*j1t>.pt"yauA)VF*|W CY#:b{ߡ2]4zSV@NBewY"MUZh2VIL3nώl3f)a0YT:RrrW®ߧxp=@^ .&GUKd+_KFܠ;fMӴKyǙh31&̗%>> 94/"p{w~1iʞ =YjOŢr'k 'y."2D7O=]qsPFh*ۨH0Mx?J\Qܛϰ .F{*wL*،N8 7- L*mjS[ln10BDqSRmFޚ$)"U ANpF?qNm<}/*$>S􃲫%cPo8U@]5I١ب KO&OdmPĬFƖz*B}6€MCTbTsw,3x|F\ljAzFt(sDb]ݨRvB`lRQn}em)0YG{"6D)|A"O:2C8Rffc( 7zcLҹiʼnJ'1 ;@P^w]Ery*}껻hf俎2G IasK s$w4yp6M 2VAjhRNEg|j[4Z6$ZBxZWGazXQO q>BTΟ+\tio*ϑ&Auv ԓg4M "56=qhQ?3 ÿG5PfltU$ʠ0y'6m0>a6ﲨd@^ YGb\M*4D5R"})>~Fi5+5 of>Ǒx"*vTѰC!(nFwKS0o\&7[<LIPC5ry,t Y5^B f5gJ؅Փ:tE,{tx{⟶L{J<.钣ip~d剾%ƞRJwek할YְrN'-BTmUJVxi襾%@Ső(3^U=:m {cEt|8u"]L1  J4 f钇yk.>?1/C'D~'[oOmBBI&\ [i+)*.w45% [Id(]\IH 8H*w1fmW`.Ox7HY K1ɭm6)lDpe~X-p?7~ `/M]Jtomiró?7la($/O2Exҭ ʱX5<8xxQ# ќN& '/ ZBW{$FOSZYi/"Q]IYѱeG@E۝( z~c4Њs*)Wb ~l zDMi &~)+ٷog[f&b% ޡ@(|]u ҹOb6N&#XR56d\w]͜% yoT 56:!mAp۴l YRS}! X^л;Bhﶠ}j u~k3S_p/*?5 Mc* %x]KˋFK c@v]U~J$Ԟqɬj},0YWՊ%IGWXŻP̶{ )aa`I+k5P8qK>P\@p8;'WB~M&f -E'@#w%+vȍsf?P# r)\:OQ @cIٵۃԺV/ڇHN-S~YՐtzU<ӽ`U [*">\4 ÑANshCߠ8e.& )]I-d2q]Z&W(esȆF"&&n$^.;aEfY'j_gJvZblpbfl[#nܜ.e3WBXJE Ď[kV\XeƇdRӁ0MY?O4 9(fm; 3b٘&Wq˹Cvxݮq4z<"#et y$|F "MKnu\{A=&(iֱNAR+âj3&Ӗ,BAp 2S+d6OwzܨsC}dcCz7FIFTԓAlSrM,ڹƲo^L,"Dy)7J%dz%U{R:qJ廥G:J]:-'R4dzȮ1B6q1Y198*;LLe' 9˔i!$=@?%spX#_n{Go8 f3E3GZ@\*iCeUa jE3[Q{2ٺj9A)V}T6hK!=T52)9sE6T\rrH^#!7<ŅT&'FEaD{+FҁURy%񾪏ܑ12iiz;=5wy?\#C9z ݸc` yXXuY5y1a=ɪsIT}(H5RKs B 7FHtbQU-VG.VA\!ڐ!JX>vKJպH䟋K9gYEF]SYrR*n(I4}_qtkf9 .:39 B̆|O s# &sVg6ڷoof86dIkbi:`Rd(ϵSQ:kdiъv[6ɹz8eK<+9wj/z ؕq)2Ll_WyH?c8 m̏i$G * !6%w˶6b  ALR~?b[othk_sycM?h~{)iS9 ڶ_5`n؞)}G19JB !142rS!M`iؙ|7V$z\bh\Pmsr-6/b2E0$]s{(6d&I_8 vmvYRʝj:Nq S5"V-JZ8}AlRiUVNFZ׫sANr>@Uk2oZl8B.'6to%.f-|q"ˉܯ 6sjtjPD)u^]Ĭs}j f,ZaQi?e[^J<PxSs0SNzReඓ3Dm!V8BJ`vcZUI' +tIZ> 9g _6i]$XuOׂ5$Kԫ@0~M7 ?%4|:9Z8r`:aoL`Y)HyTFޮw^B4Ae2@N9XixmipJrbQBZB$ݙs ĭU 2υHcn`;ƌ]Lݟ&гmYc髐/(X|Y{!:q?S-ӮJ]58ڑD.kS7)s,&@]vѮDQG=^dxX$sr=;%ϒGԍbSS.lW 8̠Oyy7Ѕq[23FY`v9jRKY3QyU(BdvȬ4 !.㫖yܾzkhID3 Qa=y:Yg an4w2^/2#ks_ ddFkاHߔZuՆO)iO,HU4 />&=U'L g`T"Wa71E/'ig#K4B+ME+y^wMB>r29J:K\eG'pC0".,Vh4>5;8զ$OiE39hBS' bO. :YlQh$PZrXS}HemO++3Y]cvۊuNf%fsَI CS0كa$% *1;ty5+rSg{v^+Z4C5ZǵF,*$bIjIܕ:u-6wZ6x' '@J,`cXKRӾ#Y eL&}5`Hǘ4 \3tM2lg1IsK'@2ĎYPm-׽WM&2%&wxv1BnoڮgLS6{ =t|T!I)u_d̚ ֑r}΃Ye 'L=F[%dݓ qI zL ∦fxFj1D@U@~*qs>B֗.Dm<*aL$mFc'F!\2)d = }w&)Uw0\Au7/*GSt{bqZݸ(4M]v Yߦ 6: s~8a+&c?}z$B6W!m>r{]ĈXƒAF4f|'2pgxf&DK*Ew>ˡrF\bF?Qw% Sw$)$;A+xw"l|f΃ R."{M\O΂s=E8M: yNކڣ0f6)`:;Ę/"90+Ho? 8ŝ'V!m9tjّu3>~iN)=bh^I炣um2*3%zJwz+Jmx\_&crNmlY.WFS$Rw1x;޶A˭|ST;5A[}dwlwն71`Y;QZ-*Tps۸>3Q^~Gd_&`C7(bDw6EG7B|Gz텴5`fJζL]iX'snGՂWa+al1݉~R ;)Uhɔ6;92^Bct+nI3L ) Qo04 'GEz_?;mpdEaUr:,E=&Df^w,vg/k! <FN"QE-s "i z 2QWK4 oՈ/uDcdb#O'vazUxD ;qX 9^-{?pyr%>Tr UI4%ë1(3ՙti{Oufg5g 0Hb?4؞&K|3cMLeq\5j_&X!|UYҢ`k7P*}樎8cǣ4'8p\ĄrLH=l2)p8-`T6Jǯj9aE!moE(zvw-4VŠGKiڟrs{rՆgS1Bh}+;AB~-Ֆ cdg:r=bty?^f(Ɏ$# IcTpXY}R>qkhF& 'GFg{KASS + NS`_G{uN8>Yn"M#g+lb-*e]1gWj1wC{-RK"htNRk'w~+p $Zw!es lEM'2"ֵWcV2[U5-^hX -8)ظȄOhx1~~g|:RNDfIt iYg){%^8GӒO8 Tk.pcfY52(V֨Tڡrs$vU@Qv"2 ]c8]!ӢJYcA4i E_q q>^3drF"  &V Y9t8Ua-x"x L/ͮK"L>X4oš%J|]{ַX[$7Pprjkr$Ƒ^LF9?4t^I #Sf,%YG@)pnNz`;"U_`Q gOR]%2K/–Yo.$Z)5Ll= 2l/jQ_/.>p]]IZy~qy\Y07rf( n5,az7r0V :aIU푔[(hȷfUŘIXp-v;+Kpqd#{3>-j[7#rzK~P2 쎎_~Cu<24 ͅ0Kövv`hGÑ; #u]ƈnrgώP# 2A߃ xEϣ^^.›|C CX':5ى8N'NQz7OƈhDɸNinH5]$~$W`Z)勰Z Ņ*C=#1LftjH&-W-[Y/6W +FBS_MrNG}hGD<8VRU-SU9Nk? j>ED#Ʀ' AJ,l P FX_34aKf$:fGZ?,©-7tR<݈ٛ{e˹zQOMc=hr>>~ 7Pe:j!ŗ ?;5<㲡&NK]gcY=lʆ#AI|4T%4.23>ReϱնlbprĥL.uKP]|G6F:OG%R_f!݅0&  J*&Bs;3DYJLBAx_\qjaܢ^j* ̕:.W@aH?"KCɑ0Lwi!4LHVBt9r@ Z|2(sP!ȷ ktٹ[WTNd8D;R+AM/\bpm[D4_y:;/JT ܠwY =Ip V 73RI =ۊi`FPZ nbXבtae$YzhEPʊ!*U+q=ΦXi* ,00kM#G8RTFU=EDT/1 Qyt#3Q30AfX=e[msJR!7fsyIESK"e(yfPHJ9-8` oF|g("\L0$)!Xm_2ꠁ2)[ƨZ+AmS+aO}2ʬ4WMp@ݮC% -v?r߇tSL~^&j8wROS(n4(''ɨJ!wFEtŏ\߼WQpPlY#_跶 ]o^3J;|lgg 6*+qoطr^qƥm`/BWշU#݁؉<ʗ5Mj ŧS{wp:}]Ħ TL^Va25P vhaVV.9k%~[!9~:!ž%^ڦp71zNf‹@pvZ&,Z-c`.Sl,֍xG,NV zx)ʂ/j߂ɭ(hwYn35zaD.FBN!1Zi-r33v%AC Nc|N@qozн.:|#R{BySdpn\uz s0Fc69:)![d ;ɤeiAU| 8jWĻ P *fDNyk8jLu^iPWv,܂vv2|)%Ev*<-@ɑ`5٘RP!So'SӃ-?#̲F}|1Oxšg ݷ{ 8ms#t hPPMƾjAutS19lnYȚݯK "<AKoA u rr&VE/hu6ZkJ~Rgz" !ݰEYYp1 Q041:;Yr3M(/1,}RLwSρOc܆0~wDyXX98srBvy=l1:εaS6a,z׆p Ib;oHed?XWʙf~25 NiZ[C T_HH1iB7Q}H-yD{iŃCFX!5'΁FwYG-wɷi3>Pc>QQLeK!.xc :MbouG[hrAu箺!O )G85y j(l܎+(+P;|1M +c_O)UD%ďeMt؝l]Uxկ;b?FԖޘ'k{\Fr7 7eU( 2n2nbp"=a q1h5=CkPOA`P) 6 1Tܔ"Bcf/aiXgM'1*?<43e3w#SٕAe9311MZ̄ynhPR S&SsYO:fw2sCG1J e'zbҟ?ך @݌*FXٹMDXe,cAe @K<WC4+ɃѣNMԽֹC ^A=ZuH\Z|iyaCvm- 1WGxMY*R҃Y ko<8 3b'kTLry_iX+ZH1\ c Q'-Vj`-LSU +<8}vq$ʒu'd5]$AaUz1Ett@kekSτ5Qy:mHU&ϝǷіP7\·c&yku"zr9F .Br28RO@) JꉣyU4NKzPˊi\GxyΏ4lʺf,UۆJxV[GgV݌M&H6a)(|.O@m^r$lC Ћ&{f^ܢT-ɠ!C5Ƭ)pLw$~%! E^o@ADSK>x(gz[$;{ J|t%,I/qSńtF^g,{^+%~kƲ).—&Plۀ'A ssOZw{i-P-`1,B=GM6gGlwf2Ϭ|mdcSp/gՂ{σwؚ'9꯹/UͶjFKu[$"#]۸R `e(C~3\[ү"&7yTy-kLn6,N*l;D3˩w > нu쮖qqX,+=aa;6 5M@@U mˈ/ѐi %Hf2ZƄj>WJ1}e:,IlDzbQev;0hYF6   #%,v\i=C/̜iu yq'%PZqt{׿^ӁݫKg{eux^1AEt°..+X, mĽm"^Ο%/hrP=m$PQK|G>~h ;GnUwIWVongs[uQjYͅ(@'~A#wLBԎ mSxMt`<;m5i]GU@WCC! <3B!BT;sUHY KCbaVfumatCg_gY3/qվR:]n"58q >qXC\53OM)ď7Y_H큤fFq_BOsU:ܼਚ1d[st4l4bVN:ǺX蔣)T$*OH?]_1n0$m;J&+Pk'xc;;j~ j0` Fi7yA5WqLk&]~QԳ^^esoJ%O,sQSB&E@:~DZ&vWKn3O9$Z /v|lhȯP/çӏ2Mi1FT%x#G&+#V[ɛl쵾 1\`Exجte-jfwxP▛sqVK]u^zxE/B/ }\/%'{\©  *eq8IϐvVD4ޙ} W%Ƅk΋ "DQ6>@Jdqcp7j?? nTI0iM^ꩲz0ǍLq^wMT 7 (8W0kEߺ wӹI!է>w =!A6 }_x ?v,;+iš^#rjt*r$9ֶPR]i,e% ZH_mʝ&NPtB;؃s#f׻.Oa$#6l?6˿v}4?v DpuTh;IrV%HɂXЈzvT9+ؕ~6v! " CLThYyW)mٯBe 39ێ8#1YJvo5J+Ҩes75wq79{1]dj*1z|,(Fq$ V>04jAr1]dM]|a#֪/e 1~v^gC:6i%bKwa kkE^"}:PDԾzA&aXJ+tpe1$gDNNmmE }5L:Zgcע$ S@- =Uw2n>dƵ L%9ř4{d=gVC&nZ6)132f{I1_SP I$T)-- ~I&zzp@cCsje*}E;8ѕ5Fy @ѝ&ݫX^E{WJ<X& eJa=5YHH 6jkO|R HGzgt9ln.XGiy2==h-uT޻ yʓu,hv1v_nhҁBzyg̢ Qf=:x ӦұAP2JX8lԂHB{bjjdħXn@]=c  ݵV<<iFO[j#0Ғ[mƫd-CE(9f{u“:_^YwO1%AN23.cxtL,IcPTsSjIQbɉ &"COӈ-"O c4;%@-Y}UߵO§}tFҬ!HKM5: { Kn^bQÿ,<-cH/ .[7=CQws& Vl9 3}geF*щPRA׭Rqc_#SLPo-|^Mdj)A\VOi~QqV'V-Buez$Ln mBm. :4[y*H:gGlJe[rZ} Ol9clH29"16;Q puʯ3!֑bi>>ukbt D;mo/G&3#b(y˂F"*m%T,WMh7%񨯭@rw=c臋2ȊI5Sk'ހU*xcc((p>P^SUI~mˢn3V&ӹZw~"#؜M)p.唹J!V4TD,wUx ETY,M/gX$8m*j\Ry$_rh-,Dz u,㻞8 @ *=}(1f&id^Q,ֽ}ȯ_ǭ.:U&z'}o nI ,-ysrrՎl&"&4w|cgјUKs αXRjt Ld6F >K)s4:9D!&&Yڄ18Wj!p6VW2zIBH"^0 B4_I"[: .Ptqqu2Ʈ@nXZ|zbj>;XCl b ?nÏnG:JW̼< v8 ꓂\wwKP1#S%&jE ;u@ @} [65!yDӦMJ ܋qOE* 0OO7G6 1TDR3rT&gyKٹFA/C[NwN^`\rT=UL+rkKXw$˹QNfʢ3"{LԽBU P $):&ȁ.ުht}tk c17mK1x)haY5aS^(oI޳,lI_;,%Tyҟ~ZH$cxAų[vnYb'˦iUGtM,I/S Ae_|`# މ1Ӄt?>'Z?JS`TXCU=} ChlJ.m˻Y bmƼ<0P=ÜDr*7@'9扼(SM ߧo(Zu9mG``wF?FKƄdd']y|=!MoqVeFKlo q%tIvݲ jNyxNRJLfNAp`dÑ3OӽDGŚ9t,~&>vwq`G?삲7`'I7$%PNT2vVY9\UvUƙI͕[a3r2I)ʰ`rfMfrSW -jlVS cZ 9,au`Yeb<2NK'eր3|SPIXD&C %NNi~^x)%oAI bBJ<::)N,?g6?#ćugԳ{ʵy 9orJi f[ǍnM't[7^-Vӟ=D?4-Ff=Z4Zz+ Qx:|sȤ֑H:dn%#ϞۤT$O† ԩ>܌׸3'߇#C{)*L1vi_ x;Bkר1W'k<"`.X}k;ս> Նp-79& (】+\Zi<ʎp%YiF95+₍W4h"DO\>ʕ:#=$yC ԝΡpdQec+G%v>UaĂdU;ГT*!n]~1#rd 5#! g}q?R{h e:˳ޝq8G :`~Liȓb%u!ը\GF&ȧ,7Dk<&@z;pl ZZXy6qub%^$?yp*E%Н k6NOp7I1v,>"QLșUj:2K" #=.}5s %0/vytSoXe ,@%,u|_mms >\ddez7jіV6yn6"+c{-~?9J8͌B]=8mk~h u;^Ɋ̶J%Tv9¥7ف!_;6E}f*t /FIu1̇AEu,&\e?,X9[A{Gu•gU|i`QčE@T w ̉s@,C?Ճg >> mK(@f v Yvؘ˝%{⋗y?WRB)#5&${ؕb/RǺ<7'gITg7)(e%>Dr2K#42N@bOj(oèk0Jb' Y(_2GkäK%ܞ_ 0ƜHH@:!|R̀+~51=q=%(%XKWQm;:!F.~VpQ`ۖĿ[}I*~kţ8LWJ J@gp*EdAd/Yd: TMY68n:>HtD &H9* z15nj~AI̗xʚwHi5 I)kff$'j쓱`;}ި[G)89#`BVDIf-f^? (਀h  dyQ*d |zwf.1}U7MsJ>LeU[!0`L2Io}&|g@wW7%A5IZJi[XxZϘz'DKp,RZ Bn(GH72`&&>!̞nɰ"Ɣ_`#v "s\J3`SGx}pjH`c0,nuQAK _w!GaTX,qjzB\Q՛c{B?h}E[*FqUƥYJٺƺN⿔bDe5/n/0Х2ag"FtS?`"#Y[EZ1<ɋ."҆_eMTOmmX7$:/FC|uHhDv"lT#y=>/ U'qRBւP/_5(}?/a7xx۲mżŞ6rk H@td[4F@,]BuD5 GGSZ!!΢mSiW3X!cu=ͷW)UV 9W/$vTzaK&5ia)Y "hmYQSqoENn7%P.U=Ny!BU*,L>F" S77<7_$=6K *yY+LE!q:m{ .*=Pl 댜LE]zg ń*O]C)MŶ8[{,Ltkz7r5j2,+0 ZM8җN:@dz8_S: ݧe(%뤄+j)\$X0}VFbҵ.0ݪ}uM( }#JuUVZsd! -E\"o{aHء,1kQگ~"hP/2ki( 橳7> s ˥XzW %-PߝiOnK Ghg±KRSdB+f;ji؊[`eɃu.16ۯU41f`\sн}^ʥg!_I_tXNVUGLncK' }g*3&Hg4߬1Α?H  3gB ֳgm*gkzt֍i&!Z_MyMYs4 T6%|*U_^ 7#=s7c{+o걣DU_}`zaV#צ.R odu4!Xj3n=pLJP:bN4wfc]JEMn 7a^Ԕ/ stL a]cy>(=#v#)թ2ZI~1+[K6{?MIwL䶃iO4qo=ވw\G2h9 qxNfAdJi?zTzL4k;)~1w7:j? *ov4 #?m\b-O7F#8`D}HdC*&Rr_tWx&۰tj/mؗ ޺ I@c2c~£5'0:Sa4Y0\Z~~ޚ 76~3"/A1F|v@%XcóŠk;25mZR/Dm0? ޼sNykPUqps4?-.-͜t-ΝuYPO,E0 @x MOWƼřHEBv;E[:66ӽI`>P+k@S9ŖpFOT *Ci'!TX Ai}]9$ d ܥB3#otk>CE fTyJCwК)dz%\.H쏞g+KZ8͍S>ew 8bdBmj>4Iȷ`֑M# /`xn R fH{_TZz^} o!%MBOS[降^`IyDw:.j` y `5}! &̖j Sus5 V9*SG@ ߾(M6Ġ, T@֔^:vp0]qqU{k8hQ+FI)Ͷό 1_6"!д71wx9lb~Ǒ1&>1GLh1j/j/j h53Ugd➟k/#oD]RkvoXGfra,컆ti2a\Eg.KmC)"Va[4Qj਱nP> NS׊5̈́_L np^|^zz秔oF(XdSTy pԐZ҂L~-ڱP8Ǝ h 2 a.b Y\:tЅ?@6t[wCpql##;=N戍]VZz "力'2xm\<6CQ a@] 7=~۠(ETأöFn/$5u:^Kȭ>q-]D],+dS qL0)P"=֤Q䩴k-RVʂbH{Xt# k#kΟ\`hwҹS 05Z9l45x I ܛ@ÁY lA!sqzQ2JQ_. g/." ~p} ~U/6Q<}\гM9i9 3S7nRiPK$ɨ´K_:6K6T[ßY-G8\hwUI=+gS-o-{&9/ d:Epz%%4@y+cV]m[V9gRoh+p;hwkQZ bb 8%?/1퀀4B$3ȎRt}Z-Vcw`zilѲސʢ~bEdal]`ykGЬ L5#& 5s* \h;, D1*1U;CS:w{j xH 7#6+n-b̙+|)h< }ǣLIMQ!7?*"Zk+[&U_H5Sm;k;~lI-(lRIڟk9 !2)ai᪔!(=!y^[zT)\$OQC(>bj;ol\0 qA~veLXY|CKUJ{LM"ױG̸W6J-6:p⁜WhU`VtX2~a,wy]_V6.}y'}Zm+p=Qich@0<]#3f:$CXF@8aۘH=L"n]ns:^\1r |YF[UAt`2U ՠEŎhXQM](uþN1%|LZﺞL[/pZ zݠ7ĉwq" JZOx*%{'xeV rՌ.QnPB ~Y-c֫締Ĝ.0FBhviy6 2 gRD"Kŭ. Be FDv>pRtwV鎚RV]Za!}]iǬ^FIDF埼;0`R&Rs s0y\ZtJ6%8ӟH7~5ɘR=:a,bd$2u_%P+ \Q걸"'Nk$ VcboځCL6m G<'IMp+dd hhab`m{ݥJI0F0\q%cz~M$Nk y8}!Mxc햮 PQd\> Z,;13WFA,UpŽM\iʒ ]LHtp@% )ֱ(9(gbFV;.Cr6^ ls+,6/Zw+^ֶ>L"~ gLVx‡˩̤T[g"]F"F;A\ϑ j/xh*_+EY1XQI%tX̯Gs;_WZRӔBC0$ÏU.$#QwQ 3ɿB0"4e6xˈ@N| 4ܧO'U,设o?-eaɁ'XMQ v]@*z˅k\ޯss܈։afM:c$+#؉vA>]rb)28i\EÎoL4Ct"W heňgA&! :;ΟR?jԐyԾ3BχFǕ5&x]wE Wľd J­tqbʗiZo"ҿܟb?\~2J/Q}W #2ox5Xim8|Z wPׇ`#S2 Rl}63TjtCr0ـZѯ9yjj*ҋ fFSNjkinhVQW 31.mk0b@&~., Y=o\Fee@+FկvKΚG^H%-`:V]q=p0YU;Kq+ߗr|_$^šձ&#M-E:Ѓs<8z/aj?3fg] 󙖢e'M}^yk%d! wCjc00ـ1q'W`3 ߗX}hxᖯ"|'!q(2fS3X7n)0PN%:xr|5TATNtZB6;CZq3b>IDa70¼jl݇--6o_sME/~VZ7T<[Meϱ(pȂr/be*%̗dR-Rs?$&. ƷFWdr_YR{:eK{:8] 5*}Y2{ڰ  \AUnKM0P[{8i.~4_ivR}ѫ3PISC/8*ΚmCy]4,ki bx_Z$~d8]0XH/a&gd7{PH)%a%,D9"i/'O ThZ`YI&a5:JFWU|Oem),xe@z+ &H>le\/HT^,} PCsOU %nS1ֺm0iqb/2l#圙iuJ@f tIѾeZ䯐\'5-[9<}-|*:gI!W%e_r>RxޘIQ#~a^rlmCU6lJYwyD/puOzͭz0EeaI"M8e9G_!z#s+]-R3bld JHQtDQ7z)v?Ue^Jt?䘕 _T C!3!MtL$u)ya1X~l;x tT⫿jFWD ڌAnpt[gl4-nF??3<"LwPSwuǜOde-DŁ?c erzK=x(8 u!vxx\ܘ$o=]'Qli8{Q~u+e^T]-⃷5%{h㾊Ym ,hiI_^E-_K8%CΕ; E~[MLBDC:*7@- tCVWVSx_8R& `WR* )ѻTSywc沜;s޲W~յ.7k KCD JqJwOw #n< G轵t5_DKKf0x Fܡ >AP7wJ+ Ԥs 4PDVOD3w.8agl/W#lT YU+Sy>w@t1϶exN%Eg? \"M]RS<)^3 ΂ }~UdI{_;"NI]1|_PEq_-N&K3S('oP/0ïe}vߖh\m~ Q{ueP3`5E-_l7z_]=&lnЯ >^-g$(:f[ߌ//#;85V/UP"5P.Q)tLMudPKe@Y]2E^ױ#Yӭ֕)GEw/@ 0o7\9vֻa$;b NI-`G9{[0QL zipiӒAKr(%¶ҹVWQI? / JԶ }{2޵1 Tׁ3U2< gGJ@ɕ9u^6<6`[CNRd05  /5~ `( {PXˍ>J"%km1ux `hRHEMէ,K?Np-cz#u- "c ^%Z 2q'l1\-21~M!8l_G0DY&oɈP i(t>L2y,r% $zo*hKAf _6HWlZ[q<nEҼU)m٣'8s/K1gM^*OW1xQ|8%oTg ʬ-ݫա" Q6. $Ԏb#2ZsYDqFX`tEF5pMo/P T@LU[{BbJL$)nxfGA*Qz(0 ?5SWTDQo{9>_E{aa: ڡ': Dm//E0@*kw50Ici@Zl&S㞟L.R:uxl$X >a7?ᩁ0E98M=oma;Zxq- ?)?F3SOot*')u*o`Zl$ď5< 0Q ֽuѧ>*{у!hk٢?0Xbg5T]VE&-KKSZ˹a=d}]~]cpX|6b$&$gM57ݠː2Lݲ;`|= soDwjE\UxWr*:D}瞺>(L|"hcX;5ztE dfBH_TrmҰ44ڭ^91+Ӎ#ճ~" %MGbCuٖ08Eu B U+3(gUj%i|s:h1MsC2ZBC| %*8{D=3׹\2!Y׮}q X yNyͣb؍wߖ +azϭ X $?ϔr%7ڼը6_Ю+d"o1aULa5g / 2+څz$:Y*d4dVS'^8A|~x"#J-g ;OH0tSjROvd9KR}iC'"By\/P |B&{ݿ^nK1$Rk 4=}qZm%mpd&AwLZZ[ujߤVzjSRsjMh#yMfq͖'˜亾a;?X6ij`lICo]sdZKM.f:f,pCTBT իoE[4jE^H($'xC^RǍ٩.L#piw2"7o&^a'!| *T.ү#UA71i,bw# $[ PD7pz/Kx3p/hco0Ϯ/=l:Pz-<ւڶLM…vTC-k:_Rߊns 9/}DDf"njewb}ť*¼ 0C gFM6l ТðR: [hhUS\0*TH*֨_TY+ք)21louFC>h-> 9$he q`e\dUjf=D u9릚_G԰xqĔY“EjsN"Qj~rѸLAz ;hQ!EHزf8OiŁ:!STwVP0tF/$7ѣ \̓p&S^FlKi]>wf4..UGa%HF&>&MwW fO~[Dh?=ŚUr%G@|51w+ %̭(=l?fq%x>`Cf^~tg f6TȽP}L;R H4 G1^nA=W@JХ苀8˓9Oloހjn*w <"W2DZZ&Z+Y =LȨ:maȶGۖB *U}XJSXD:bhU6 ]_(uY #_ +iI.9o"f]pI)ZMvLU,hL4MEGyFO"wYH6"@{1SWvJM @t<־LGщ375몠+OՕ( \?43|4kv`OI^qؔI@mk(ْcy܀78Dj$KsoIkeؼ,A~O4n߬N{VtP ]vKnnҼϫNRH5 88[#-G$V`FgtD^Ȭpְ@΄?%d0jRТn@CED |!X);/qEk c ogTuj|k<%J!K|Hgn+ |!2*~O3cJd,-%&%zw= կRld6& oP_/%OLt"X2')Zb vȩm1M;s4-s9$akͦM(}9 (Al>=}k? }*%J氨 ѝc? zWU}R/b8ރ:{"Tdn/%;r[X!kN"9O'WKdكIy8לŏ6hQ0Cn_fNL fT!xPL~T4[cP9r$wG96DRbKFZ&Sg:<{.MЉf@D~lK"~Q=y0ƔΗ"4"ז @s,)0FBbp .(R%60MXD/,&e|- $4ywmKį߆M/-͍n^i"_X?|GG>mq($^SaEiH$ LR4D"}RHAP%.0#kagF]L'U ]#@f] <"aߖդ=F(ˀl-S [o<̃x_w :up Us+%"5݋i ,\7mFhi61sA3 ov3 RAϹ2+3-Y bĶ_9 n_U^gAk% xA8,^p@t&2lfdxL+(G4a"Ea( Nw{fL0wV/{1sձcKZ._^%(Gq`e_|@]k`>.Vq9eA3LӅ|n]N3͡l.}0͏а..#pIv2bgmE\`(wTdA5EVv0kZ"CX݊`&9в'qł>jN*zͅ??&&+''{;i*Ih`)G'Á,M|u2D`^ƢJf+kg`}Ź ?jzrfⱛUiJ8|f Qהgo9ZSt@ͩa, 9/K/P1oѬxZ|'+~5wG6ln_ m 8 9"u%1m;{Y2CM~^Ы z~gR̠\SO07Sr>et7tL@Z~ @ J{EJ ;\A.岡ߛ\8p UqԤ ;d[ꄌepF_U1V{+ƚ4̙4c) ?{F*FΛ<ˋ<Ҥ$)y <~d%sΣfdE !GRփA=NH'TzwdD& Ȫ3甠/SuY9ۯ-J"6OeP1._oZy:IPqG!T)Ջ|&Cy+y6 3Aۤ;DUM*?bO]_JUfQs#s-p&z.IV++X iWX##Y{fXAӞG2E,s<4_'V2W m?hO=ۭCx9/\v]@DnlbI92ݛ;ݧB=eOYcm^zGX>wT)imQxRu=C'czfA#KZ~àNP0 {o1Y̷— ^u$8; *k1A \C8eRM`K(Վ 2#`5$+@CV't?/+3C>mkYTK=yDCєMOc6p5*&Ը %bS`=y]ޠJڐMn\O_r`˶ʅ|{o$ HRJ.o4Հ0ٞX`l͇Pƽ@F"9;ǀ2OANp Θh7u'?$ @?_gnŌ D+$ɕT!|u/!HQ1s \~k>]u^3/T@H&ȽPHf8MԐ%B@I3'u1_s>F?&1xF-шXW\pf,w.G 3C 1d(LL^~J@$̤ut~>ٸEs ưFF:O㶟3PʮDƴ-p1F'u*?MB$^Wvo@(%8 )M;%VGmgb?j,{!L69.ɉjGOeBsJ=gxVŇxI+NC&sR+_ =VJrWK8ea+eFFL N&H#r{V .OZ/*Fcyټ \kZC.=Wש[c^$!aUXko-;*=1I 8<vBaqlw&{- &]vwĩLufbV=jls+]wkEu.D5OL@D$̓Pr@]s_酝 HvnwPU+jhTrm&r+g{. ⒒W#fQ3]؍AtƸ:tY>Ϻ~+4cDs廂}@; 84⟂P u*-6J qcsJw%[~C+ Ya+|m3fۢ*9{.@CIΖX W|On3_>RGbZsuI׏uOQ7- ^? .Rn&`MAiJ.vqf:ɰEy$n܈U h2֨8T%A 97U>Ța)>*[#΂Q[|.@y($ hvJ%]z:i53!iܬOrUic']NҤ/hېU2)J,ٯ h| YN;E64Z6]PD{́l1*'gw,ۈ%/TK9x5d=uF.(ۋdUJ39lXo{ѣ+W3Oj}t$}gi^C{78W6q7W"X 셒ͳ⿟RI/r*&Dz -;d2u%Nec&u3zLOuDu-VQra?B\=vjPyԈdSHL7 WiS)zO."wb.9{Y JSؚc@hVs T-K=x\ϛy3|ru4F`\iB^=Sn Q} " Eixc+Q@d٠4)JHiڀ pv7J {)P%WycqPFH퐳?܀`VHޯCl*uAG -X% uܽJX*i\Ŋr4;&Y"qw.xB8@=}zO@gإɐYQ++Ů{- b03l>.Φu7J(?I9TXT卮Ào։6f&6MGĮ?E~d=$gQtO(uHD-{kbys;(񌻱}EUۣTYD9#ԅ%>KA@=x._#n׉4qSnO\̘%%dR᎝q9,=u6O; C}ڄ2ECWj'Eս<(O"1?YB^f%[,ʉlW ;tֶ5Eu@.{v(xjɵⲶ|ߥsxX7?|:Z~4C$S}ߓ2SCĽ@30@8 ą!>&s:]XQ4@'8ZrŴR+8AO@/tPDMܘձgJ7G7D`_)'ڷgo1FoQ~ӳ7P.SPr?ףqguz aVFv耇~4K9%ؕ-ǴW<{|b) g^K`ϹA'0ܪ |+{83K i:_@F24*ԘeHeRO ǶiMbE͆oeZQ?g}]ST2IޫX>4dowg3es{A´ ĥ ^lb8V:щ7 0Z8P[dN(seT?lTyĘwSCGp%qd !$ a[ N-2s/j~*L{+N&jJ2xVs;7:7)5p|`L[c;}awBd+ZkQ>KDaES=}@Abk=NE7j1PһX8hW32bijڄoË*ja+G2Jė?a%?$I)/0JG|=B0(/ -}laS2nBNϳ5z"8LmĽ{>OAZ8٧6qI<-: b TvpnK{xPT!Vf7~y`FX]\M>êHY_rax;yMWe4%\xORyد8y7È6YV\ՙqxyա Й1.$WD\4L{&ʍIh=VCLf{DNԷt5bdۯx-'NfE4O6r۪Ou@hHv> :A/헠3;Qu"@_FjTA DT+o3tk)t/SzkGmߓ9U}[NrY%|fkM 0:3DvZ&pd(onmٰ^%@kA-GZ0KWZ@8\U}U9J1Ü C\TkR5q+Od#mN 3~\^ 7E &"X'=3ǎ]ǭ+*2V%DYGdm4xf-"gR7]+\.?S2i6oH$!b{fKd>'%X>yA餧ǮaǴ fD386rf7Ep?GҴo 2]NA5|΁MrgzOYÀ&;Kc٣{Js5aɺu™-=QxFQB{r{$_>׆s#"# eRj֍ m5f2C1iٌzds')S۽',e*'<]  S\kBmUq H:j?juDgk}L=㒣DHOG>A~@wb(X", 9@`cFh}\`|:^Ħ4I}zʑ Z z7QhfW:K6P ȑqegI}ڝjb /m⭟QA&j *0$J9A5"&5VxS!j JZ͈}iM(lCXN7Rs8l<m+L,t2CPYv?1~姎j^tqe‡3t}H7vǀ+QVfʘ\\9gnN_Uxf6}o.q$'CA@C:HL6p5[`jLsT:Cbc}qяPD55L>P<ʙ5 9QxCUHc L7C? ?`q3Ϗ%RfLR<%LSDM,o=>ǩwucmskvȷMRr򙖆]'s#;,Ҽ |ewIM:z\{cTp.C< Q@3 6MhgF?WL=Pt+ɦiɋӶ.h/4\#|*xQp=ig}RvWշa3gNz;WrL J)p$4%uKL *UMbpAfO] ,c>teh/H Oזs*o7:jAF Y>ZP\+;D<5`UKZy23x_+UDV+i/"(%܍>D:l n1q_]F3압h": 幂mY 4OP c%_86m[K{ 0}q~^䮒lBFP~،\L3a=*CY'(Ռr qJ*̤ZVcX1S'QljP*2uPnD *۸u*>,16qہWDl[ŚH8J򩝉gtdWZoǕ:2}wӪ{=.AG5Fq֯Am >#~w0H%GE ziʟ8JnE݆h2 2-SN\<>IHoOɹRld-J_Ū"%~1KHU}w+FaIy&3pY>.@y ֳ>xw aeqOcCdpro 4ɫ䟯 Db1X: "{C*3Q:)'@gw >UsǰD"aY#Bob2YUC:n 2k4~e{påi"_"۴^S3".y@) )d>џ3qt(5uD~?kd]<,a vMlK+ 2*0^U=ͽ>ewxҮ'okh GZk>i~)ey/y(3:ٛԀUbB@T(S_2]8Oۃq iJPo֞u̞ipԣ=9ZF?P BK%V S@# TU%y+дP50ռ9nfQ`$DnSI_+ic)L;ʹYKdԛ! yxĶkWڿWB//'8uչ:\}^ }MW/-H"?6 r f o_ B|щ}l ]F;}\bWy) VgЦE]@LAxEBvQ`,E\Ha9n/k9GFű7Rܤ˻S% ނ62hKMNPӈPt8GϢ !n5?'_pRZ<ֹХHiϏwt&d]cW&"a֔ IjkptA%W^Q0sadj o">g<ޱV-Dlv7jRVan1N0?g)vm =0j4Qg=hg:&q-%'֎Fۛ:OiN|!  tov.'ii硊$9XJ"oQONԌ%ٔk5wPq*krQ`-,@ bJҤ)oxpvi/ -2G>AO|[gU,c긫T `* ߦf nismRd+4ԛ֒BԔN4iQHSۢA/iM%ūڧ\#`r7i`bmz/PZk\ ,@1.H f=9)|Bߝru~Zrgd~<+k0@K}?NHTF@ gjKnTF'4s-'eaK:}'`U΁.1tmOĒ:<~oQ%6@6LY4O~{Fm]R1U8ɼݛMxzL(z;fc*˅T5bw c@uDMVܽAN7y5KD:{|f4h{AQLLen/꫅R Ics˝\FۅslT]-^`:%W92Å=[.shZEВϱ҆+Zc,'h#_\Su_-%>;1XE>}e%j1&$0槥 mȸA/L!;,ra?ɣQ ӓ3PCsM~l fKmnL`L-RtG/gƹ~OLh&EKlk_i\ҥWKs{FU/ܹWSb:MO(._Wȧ1 m7R71"a}o2߫cH$N/JSDm3l3ek`8/eud9bD-[7FldG F4>ނ8]z>t4ձ%BXRg՟`n_ba-qVZ_.ZF\_f0͆]'_.=ǐA&lw>WQD$2^ UvqfLhy N ΄U8x$N<\}59!]U_' as>B6j% r2"j=Xӯ A~nR\S֏R2B0DZofM1r/qg/?r4Ñ Z~YC705MQ`S(CC&y=잭}Tq8A|g15e\Wi A$'.)3L^\n"Ľ 9>816\̷+Rʑte=r+`:!\,>`$}4\]Zylx|q1oLsr=QAH&鮿C1j ",s$ٴW >Ӹv3vy+y.0x) x&7cIv"wc΀nWwJX<Ҁ3>YXd拹ft[uV X!1#62HmC2X*)tJw: ;@ })N`zѮm < b ~.Լj#@=u@!͌I7VЄ۴cKe+Axhpd$7 bzFpkmT@/h"%TS6SQG+&2yU!* CB-d,MUc5ifNc3-Q>P{uB[o[<{ЀZx}rKT:T 's{)CD3AƻnI`ͧrPvzTJ) }BBj;@j`[~ ͒G3ND@&QupRnכM`aeTc {Tӭ.έjD`n Q(ct: 17_o߳^8&Z9e)Sy8 lX3a>MA5jpa)v R`f;|Yz'q֑Kv[ox$i<[mO`bQ^%7[Q O\@ ("Y^8lu0?ckO]nctx(  Q'-DmDU1&Kkt\~OV|Ps7rnFRM@"1됡{KnSZaHXEI•y8SZl o[+d$jղE;v~JA "hOQ7֚R‡9U(L]t_YMi? mU"7]r>g2~^./WMS:V2jmWKB{A`#h V@PeͰc/EY"CGe:;Wݚɿ5;7I e[[i|İrR0UONz;f!ʴr\] kW p'6kt jfӬw8hfj8G"? ޺ (:2eH?E;*h;mNJeWM7 ,@'Nd$2]=P\aɰ6<62QA\irN6*>BYRq 4ԢHL$ Y!w|*u]Ah4=A)BĭV'q`/PW\+k+90Z[dSGq-,}?`趵0b) QͱZTmoV_)l_Hz~A- DGf}t Ό)>ZH(Q G~jfS&qhհ$6@!QE-auV!u"9ր Np::3N2>iG|1֓A) FLTYzQڠ!K^78AX#AϸJTˏp*PhTg=7|UIa՞[?4ec9u#{E0r@7^X*"fVUhL%"$(rD(#j j]]Hμŵgh/L&V:67x33%!We=044hشFeIB*u Bҧ?*\6w4|" pS "K QybeO TT(2Ey8^D98`̀.*>*5" J_u FΙ~;de ;g_*2N/+ցV66ԡU66bͩy]z(&}~|D1nʝ9e2_GU y}A/5齫eC=>lph/JhVn4!ǧb8 Svs^O : OqI[\V {{$rVMMxxbͯy|*<,|a1Q f`Ae_]mM5~q.i2뜼cEoNL<6\~ɴGT&Ƃ=w1v%/m@a21'l 6upT|8ѓW4[bфÏъ8Uɷj-=%0jm_U{@&Ox 0BNRW +6W @;T܎ +db=z`VJTJa@FɰX1Jl8]}(74bJDg!~nЋP+^c.f +~:FeDxIв[+. /ΡH^/&0mwz$ N&OKjg,l#dqad䥊ef(`gO.U6N.!*&P53&^D?vAҶ8ۅ{Ba_Nëg/~?Jq ̅-k1{JUo!O>u|ܛ#H;ޙ+vOq@O67!lj3vuT& 70h&Wy 0}%;áTˍ wL>7 L{U9PK 6Td.^3WCĀwLw5jRHj?zTFO0zZy3"C=H[ G'CV Om8$Ra B3ưQU!203 +Qw;!12q:.m(1^L-f2@uv7+`2v<Ι~9ikqHDwڙ Λw*B$dGU:e>uLzj/ۘ9g(JV*!K3ڡ`+fHJț;_wjHYS&緼0q[O/sd6 g!, SyK:G73f ?|lLy{+Mk+#nRe=zR#{5&qE)x$N [,io<?@ lPr_ \zx :JBh d׋G3[պRf_HM"'R@I@? iw&j.ܷi6yN{ۯ7wfRՈ.aʎF[ oCMkX{cf8e6@*a $ Ceۨ(u9=#°Rid[ _}䈅ӡ,vQ8EqO!$LgsGH`/gNgv3 JH?ȿoAn2#yG #M8}|}˙)NWsZT]4&}q^+3} K[|]s^e3vLrrܦYDta8~$ZqӼ30A'Cy\TM[zԝtN=F\qvCGW*ɯPE BTC[ }wB@3=[d`u wC!Ba]Ҳ(:du'Hr655zcobs̊`yLD凾o 1Q(ɑ$Y[cԦdPݛvÎ}l 1Z!ekvzctw䣤2vFyyc3eYcgƉw`jM}'M'loKˑpa7Z Hӱ:Hꐲ]TkQx/eyvm "DQlswIM2_>N`.Ā,7Y_L^7cDN kc bƍ;H}ӷTmlc ;0E=m[hT!Fxw!A(ZpKN#U-G,_^* 'V湎G&^phya񰳚Io^3#/pFîiG_ .[Y_ B=DTmM U`Ekkqe9}}WhPhTy2}ݛ402IͭZ냡)FE*8Hxh#sUv*Oѐ(zNwY~Pq)kXoEwVI$ Kw̓-HjM&s̵wSAX`Vq2cW   bȽzz}kUYO|0p_[^;p<QL?`eZ25rK{;͊:e :ֹE{1K+y*"j_xx$SEx97Yh V5`w*_Ea-w,0Iu(M=ť#RaCrHsNd)/aI(WdY(7dgnpcϹ͜K&v@}aL .Xē-UO.jD:K oe:{z(x fGئc \;bKofOS0*fJnP*([OV iqq;l_N_. J{I֐2菱 //y>^((.,Ssf CKo3Hn0ݸ;㊯]R(_Xlt+%ZO5`KEPi2i:r};jnMWPrC[6"xFrD*W{w>u#Џb親t}nzКR仐>{v[;K^hr\vx|M+[iK`i02dBn]cEu,k[,=onqY5-=d^0j<>OZUd[kб5B6Dnu  $r]0T6An9uPˎt\?xRaWME)ޢ9<>`b{T'~W!5]'亂p5qFcaŠwrC)Hz+VQl3o]QM3{/rhqj^qy$&A+,ί<hFtV[U5KMK,<&Q3 $GH7]zt~s(Ŷ)3 ooFwKߕ>>0efGыE.R9zvgt+ۻ =xtuxLa˿t蓀'wq#_/҇TnJ5bpr)p$svEWOؔccMt@p+: \wƩ_U{0peULmscXX ^s*B ܃8y/۩o,2GP. kXo] D/Z5e ʶCZ[z[ODE+H ҷ}6"gdOSaz J:!q?Ͳ]0p[i pa|Sً;eAyrD)}cnpZ5 s(Ȯ^Jy(g;$a׾pl8vVߌ'#^zlΏa;+/AKX|۔H5B+`K ,ۧxQT;M xEr$pT;Lh ,I>47 Uzbך_h37/DCr $/oaA|꿲iqo^{%4iS @RZxE])9 '+`>W/W؃MEHPKȭfJ<>r1Azo-U"G0}Ƣ2,f}|]D"ypS21>պȼUtr =ǂ2]"W]MɈ*c757?;%i2ٕ(Mz9^g?zăU=6&6G^t!P؃Zg_dfB^jxǀE5v]=oS솎T3OQ#a,nKSznq{hXAsF:lS;9dJxW<"2~ kxwǿ'+\ s^6kV'!Qt:jE+XSk69+cO^5 ҇oDZgF 38b@碳Lņ&r-(ECٲjl}*J -YH+|s[2|_kZǩ cWřn\ J8,4SAYs jr]6CbPu(|}iOܱa%[((B4 |*w"(aF?զjL dk_7KǬ nb- A1TaS_ENA>A \=\2:9ȃz,h'.+Uj4aN$:|hwr ano90 x1Xg1H4s0pp.&yp=,%@ *bQl18 zr!yHv#+g"(3t 5u~eD2Pgf}!vfv7^x,Np|T.he;+w\:!F#qnPt֑[ij [nj^PޗTI,޸|?ŵͳf Ϛn 7tO%T R#l 'R֖ފ'T."'i2B 2 ~IA= 铯p^.s%~­|$1t߱(.GIei2(Dp_Z(1<xd SOC,A1wi8H'4&e3ml aJ@jMD< ”ͧcNbTICzVoEu%2"_-a㕼&?k&<2x._Mb#^|b(O=HԪɍtvǒuNP}t&""Jj>H"67mEscdeZukWU|B)"}h8̒_$ۍtl؃zSlӳC1iiӌ$yLhv5H,U+R(E{.X}aW4??Lj#/[W6i(]wlA[UgIĈ nPٮ҆nב1t+zMtgg,F/[0j<,G8nkD?FAgEӰLq' NCH`"yÊ&éPMUϚvNr{u 634 ) ʛUW2?nI Ykvvfi o}D"~AE0@(v<}%S`Iiv8ܰx%8Yn>P>}43(?pNG@T&љMɧUPѳG"Ϟ?d%5qϭ8eږ4+sH4NbT;ƗZe KV%weLBP{9O ɟ$M|L&ԏ\, |F;Hq *kN}zi˦_+ ʽH8Ov#1CK>0ʎc%(k<,>,ɟ)jO_`(uW[U ]m$TNW̗gTPT:$ie .RՎp/|1މWHAXƴBd]#, 8#&HwRƱ)[1bb\ =Uu7|e:g׮K{P H ~ggR7.0y?"5dZif:߃)3;z>H zI)Yy8ٞ0 h^U3Z}6S @oTyG{3줠eNYKrI\ń=Ѳ #_AҸdD yL9\f8ӎ+]q!e V^%K$owR_F6_q(ЏRlm)(!R>9p>P]FOňU w&2€F]!v 7@:t7ezlTj;Ja BAWF#be*)p/jPxXmd1P%߄8C η^$xGz o6ڊKpElLg/t%dTaX!g "[{ˆ@ 8G-GIIMY|"0tk{6K)x?ďVӶֈ40@^h7;0˅ɰiOllfٗbdWp˔-u3HqIw/'\ )H NB۱9*˾=v~gNn'@%u^FTJd2Mo~zV BՖZ%qtգ3)ָ DF"q kGRnc p1əL֢+F,˲LJRؔ hU%Hg2"Pz&ںzy&=שsJغKC$A4UI/QY( 4ЛE)ꥯ鹒wa?$J- %C jMUQqB1#]5=۵Ƿ@QOceY8Sn;-΂>i-M~"p% (|>H5W7dJp d+^-xpXD>[EUv<' jD"tJD,wq j hf x񯥐3]oD R_ X}w"Z1{3iajxl̶Q} {$ƥ?t (h)ſ\p?dE횘r6;,V-TSB=; ͜쎷,U2HwM{׃e{e (j5% il,aK&SF 6E_RoKOUԕ)]%3wSgTYBHozĵ\o)C<_\Xw!a,ǫ@ժ{-Al yLּڬۜnN_]m@bLlEi$; 8AGY1NI-` pFZG׻^Y<W C.w>3=a;߆Y6=¨A30OI^M̝Ⱦ^0( ;MX _=4 H eiCSV=ay(`?(:8}m2XVFc KHlx;\Cr0n:?ngCdm%  .osls{umƓ^&أs1{SXrbtq)lH̀)? L/sz1&RJX0}; A5Ln]gpJ]#cX\-1H %~ n[kkm@,JyﻙRd#K9SkJZC@#_&*䀴-€[4rxNi!_ʺ;[]jQ.*)U $ o㳢]Ք:Vb*CCu4Szt*XMdo!m&$y׺xq|UBSVb9?7"5[w3yr-x># lǦ}Z5c~=Hu7E9@c\RCϟ.Rxִ譜mcj 1?`a(!2iN cm!*ۆ ޴cdLF/-'Q{7UEŎ1uB`f븞YH_lDJy5; >z8 o)%{W|)ń?Ps^X߶^T춥< A L w}ٽ$.gTuvV{2^b$C%X/񓡪F5x2ORH2[Ywh e]En%P)赲NӋR/љXy/0ZR=M -Wn}!Sw"&dZ/~"*Gl!>KG +ϩS>Q~*ݏNG_\UpKdʴS+b9;?qQ =.b܄,@6v_hE-q{g?_//0i6F^{{4 y+)$[P#ЉM+lyϋΌ` Tab"[hݜe;ҁqtO&=O|GH#m)hqo_U5J lXcbs6G-že?2쿎|og %x^0p.WT8$F>G({-S3 hajH~ 5Є1@t(̿P^%`Db&A ܲfzLYu6F7s4YۛEA[A`z ܲZ`YGNcp^<%!KIx?։Q O:'w\:HoR~!Q7~^vMvVD@y|X-?EtH(րdr ,gE yeʠFQ8E:nkiGm7-uf,՗$)ˢ_kJY <^NqO(LN~rV"Ɍ|Ͳ)f/\FvO+T8m3ș?ܨ-aq&rV wj/ģ%'"P 7ȱ3^0&H笝Kw cJ1. mHPbScY!A~e؍%f<=mz?>{wÙ۳πT[uKN-GkjeZ6)U#@tkZvx&!d/1sYS`e88hmE=4JT=f'FyjQkAsfqUAxJ2(fvf쓟AW1mًd)"gYXQE.]b(ݯx !D~Du>UJQ ,/p^g")͊UL 7|%zq r\z %-i(>W9cMMTahʣiyo}Ppն'_mRFI6Gq3`4MXJ 6lZY Wh,dE5`HBvB|i~ĊI9yH7 8CܔgFl*UN6f| ;W ooB:F>-519O$k% `j3/27dr!m"S.%'Ǟ>f96xj(TQrЁl }y7Qc>w5J)LS VG5AOĜ~@IX]rppN6HpE6uZ7 @jĩ v@UPP'd?qG6B5| uĶ`N$tbXVj!$f/2ѱ6D7̀W5F"&1A%pA s]6#CQVyMJEaV+W MKplRA'p4F:BPHCC0rdQ6p*xR Nk4W^PhfDS̔q/< ESRΓ`u)}@=ˑa)2ߥtaCqfo-P\}RxcyRMh H# lOX]Xxt'Z>8)X&TႫ@uһ{=rz1 %0( 'PF62&O]/}J4@R& >틁8.yA~'ەWtY+ޝϾ '*9f_!:^p؆ez$;ŵ֣t‰Q\C:ok$;|:`oHk2i8Y;Ez,Ʈݲ'.9E@=c x\B{8D~=VQvD**~)2! NJvG|xk~=!_a\=G١1X|1q=#4tS&HfUUs$.v8(oS{¥jz=hQfG[Ñ%d,>4;XԆ߷acj=c{/ HmkAdmY'{ -8UAbyeQnA\B7}*eg+eH*/H~PmtBnm/$|nSE8QëPqCmRI0=[`"$@m.5Nc %1DN}q)rl)z nݧbw z%D`;7޺KI6Z蛧ؓXyDžN{G`2PVWc~X&k((MΦMd0/ٶŒs@\ErD5OA!a4|D7jc8j=[Q0-وaWiܮOc T葇 ܘrIX l3ё%Su4:&@!:6! ߚMMpi%|~wH*H=|;:Ч?3)9B W\a:7LMŨy| ^vƀX ˳$r>2˜r_` |5LHHkEB/Kr9+(>"!a8n*WfD, @drʨn.e$G_0zT(HkghM!jINش0[}tʄK&#eq/f9Ao+92xY#[*6=Ě-ufS-\Z5J`&ܜ pD; [lu9txA~4(.ezB;`{GUpJ=d 5a;JVhQT\¢MOen;%ΐ?)ERPt%7Y(d*`W[ :CeFX=TPU SJB oCY[ ߓ0ZJ褬)ZlK "qqӁ,=Q?_~Z7cШa{rsO M+Pv̳L{ޏė UCYVu꥚敀TiU;בQB3?zCv:lzѼH09AB/XN9b 6X}ƌnc;E rF}nj ™"{ooE<7 ZQzfAA00TF4[ 8r8:cɶ5R˩yfbc{L04Y }i#9p':kJ7c.s쑲?J5j UqMIF3@0ƣl)`(^=xDb8U,l|'zK9I٭3!Ӆ Eͤ+0d77ȴ,,Tf[FpK*.//U"].6=WU ,{-EKz…?C&6 s:yq^ϐ'ZL.g8~_ie-,(aMPۻ玿=q`Bng`ƽt,Yv`alX@hA3YUm+~{U[=$(񘺎 ^ˬ ҕ*<-'_>;Pδ!tHݮrGAEFЂϹUˑ0:uVj?b5>=P!c^,,%ʛɛ\`TPt*Jc wDtCb%6Y84vb8~n@Y$?/VW.XE9N xfshF57Ί~N0MI>!z1pXh. "%GKOվ!˫H#Aט t`yJ5I~S ~Zn0̦: X}Jg%,@zd-dK!8!^tЖe%p.D$ngKsT?joIzBQo2_w81Wڵ#U1a*_3H\5jWu|l]ιzW,13ꭎ}WԮ}rg-;x-)H6 lL>=p˰ zΐ23/"\<@C&us u!4kYGER;!kj]+z(9z\݇{CSx21QO W8\y*X>A[TP= ',*f|cOmC}vVSO| n(quёxp$3AhH_?ZC63a0vdW&O=' `6e!7_1DP y2}8>6If{5<*${C{ -;g96:g 吚e $)"T5V{jag_[t+}f3K@.O'ѻb9RVf{g)~ cXDhua ^-P|XDв[Z<$ >^7*vi׀^:ZopeT1$H2ǞZ.;FŸy(k-gz;Kɱ(1wkkHhKGU8fy)#ޫ[cۋZ^'D!{q+],&%[O騑=RM3jDskFh3 }oQ3V}`.x>^aJ<_CxA2Id$68OAs`0&IgM1' -˔1QX ]66tL&.x[u^&Ic(D\sϪFjwdn6ґ u2`u15mE~y\vd*Ij5?^  nzTrM:E2a^'e*dS qzf|>r1W_ZHO^S'#;ȑЕ=㘙fuA nंOy JhU% )&/Ni.P)B5ESa`"h _TTn 'a|Vrv)?9!2Jq<n_Փ8vݽ]"R6Uĺ&!Bh}OPLE ĕ@[%p߁]tnR `3ob͌$"- y?ϽȨ[.g}NUꠘm5B9|`i܋,lM+5!t7 J؞ pJ\:M(waTG?Xo;\^/ #) i Ws0.ȿCTWP$^.CM7"ajXfQ.B-|?- u^Ǭ*aDWB~nSU0TUYo<.#.o?Fea0W* wş !] b%6oFmI=#yxcЪG`Z4M#T!Sh[ZS{ ؁UAui ^{ARy!n1cKCLUlU|EWD98Dkt/B5QQ"ҏJe`nT90 v+Ƀvx}e KYZp[eW@b֞Jb cF 9y!S}!iy#7O򼹯+0݃HH1CT6{ ]דr~]l\o1Z=K4z3:GiL]*] DH6㔣m~&)Ooi=1v 3o/͐D!g_0i;(+.S^ D* 'XlQ6K+$&aq_%RH5O= LACry*ORNhBE:& =UR *"g|2}It@l 8iTCvW\e&8DlcBfz{O`Wо\lȷ4jlS {H56奾݁2T .Q7"^TFGHFSu $R=~/̐'q,i`\&SV5%<ï J@/8ZCJxbBW ff?)7{z8 GjzZg Yk6N{;*Mxivjӟ4'TgC\]ҿ$UH'i< g]/cik//kc鮛kH -\cB358#F!;cC:f?Z6syf7 V؜{,@01QSSUϘ壙f#tk]z9'_c\zVo_"N?v<|qU6TU\{EJO&Vk UHTU5 !7j#28f;MR-%PU!Z mxRa8}Jm\kMkg(Ȫ> X㕳d7nNT"HX&ڭVE4bry\-h+R'$ݳ^'iXCBŇx]0hN+4tp괴}b_{H).pٯ U$t27QK;&_ H~ 竎 D5>_kAk2ю%&%)) Ivn0)&Ko쵨-, Y0٦{6k w#-+ 6mH߲D82";㌗P\fdۊ.ޥs` Lb:W>r7ɹuqY$_}vMn`b¤ưv~1-FXp_;]ZcIJ؊ tLƃO0t9o*;w镝T&.WvuzҘГtw#$+(^״Rt ؅sH? |0H9`Eh 4C9 F2GnDcZY e_nPnlk P*@46hA0lzGBaȀ3NyWuCA1toea2Ez|>쳢N|.>Q?jVش(2o^eqzagHr^NxWQ"!VLn{sB_&c w0BYRXolywkcU"TsB }aB5=nC} qSbFRXG#ƭ/n2ŗP/Zɟ~y6̖夹t18R.!z.?Dtvı!^?ule-ԡ"_s2\ F#rIs $1Kj!)@,1н 촍 tX6E$6.+HeDe\%ԍ'<{?u>x+Tӂ0s6ϗIX+Y'A95i)͝>8`V6(ج jkK:) AT5&zLFq=?ix& h͇vͥPHf9Lě^Ns8~x\y-xKjn͌dG ?ɼ?±x\m4IL9>j>kґ]W88?T1p'`ڽI7guJyU}t wZ! @]vVh~zB|!Hctp`sS`GRtS"DtM PF\ћ mNn`0@y?MW?rjAc M"ދ$7:D\4C[C.:z`NG2{R"D!1CNib]W i㧦JN A.`0h+mS>,*()7ȑȵYuѦISXuY=Qx+_~hBA;:휠1{DgFD xϿM[|4/L;z/=0kN=#tzhsUDAQS_]U["]WG~"OK?")*#0::0YUxicCz#/@bA$ (Ҏ;ԟӱ[%#\]Y7RVvˍ}"1\Z]H8$ HbWKabaU4[Y"?O8KoBf`:~ɚ;ʙ/^*?dȹ,.@q_6jDey>Ϝ@Q }*/ SXMq7'G*'Xr{ӠnYr~9 AZG NG;"Zc{d 8ۺ] =61m̀eA <q]1ZɇxO)W?dxyEaJ[w\&;wpq'kr!cwO]wQn #0U`oRlaJPϐ_ޣ7oX C,v 2%XS6ە]g4'̀YSQ]xq(xaY;_JLe̸6pMW20܆)τ \VA4]Qs͈ܹל-Dʰbf} hfB٫L6_Ļ3*m|y wٺ7eOp H=rn20R? j{:\!5bKz 7*쯺˲~';8~%`#I!Xw 5`xb+(E-1:hV=WlԆ s(_A*ˣt&v_v_w_Wwim"}F RLGL_P'5u?\#y;XL44KrO'HjFEꘈyPUF ?%f;Fv9| E.yoEq샊[+#Kxܧ.0s2|r $OavMM㯑nĢZ ]$d ဢv'ccL6:Бz(|)[1f0jōLYsS?génN+z ~ۗO})1Kdhsqq,FN5?GطA`-9܏X޹Nm'zJRsՈH} =ӷV۶8u.gt b;o_>-ISq=׮UC,ݥ5"ߧK*Db계vUm@1;=+26F4 ʑ,F "iquyi0FCYiBwO ""?!g=h%Bnv1ϴ)lG1ǚKtBq+j̘x.4Ε&cU y|`>`㘌/.v.>3[ ,^:]HmJ`gia3yD2jgTig1I\/1@;WLH=,/+ФIObq),mTT)";$MS1YV&ztUͬ, ^k0KTG3h]!d:ˊDk5xur*E沿gӻM2dQp{PDL-Kg} ؾ&4IPɍ$q|آA-H JIӈEw E-4Dv_BbfPÚ5srQB)2IIS | *+d3#ǽ#| ݞ+vc`mcu, `=!U-. & t/c q]=5Ո;2دDOKI1Z>78co%I[4:&k wX\9Ӎ pVE{cчTI4"fi>Q'.m#<< v.Nӵ983}tX{4Z|7Ö(ɳiKOJT@[Dޗ^Y)z5=y!Pi`& 7[ʉjV>@ZʰnYd{A1NG}unBGX-#OWvN<@17fҪ+Sm_)ҹK5ou|-dKrhr(xn fCCLu8- 1[(hp>laeN+7ttىճ+mLSLxJW{[qdc Q_vU$۹o 6EbaddZūHaFȎFTkwbB֋wT[ɿA__ z}e{Iq&gл>͌a<% ӄXGf7Dz"iKOB|qk:5O;Fk;~ӈCŎtCRwB+ad#O2K <k&lRS& NG$-8mj*\a_ 0|Ȟ,ӭ`zB/=۝PZڄYf<VzPEbjsชR%Upg3O4ne!jKi8d/QrkaֈܫBLL%jdTYgXL_$\'ǜU[@?@a+RMZix)d.]?QkD0Պ$25ua>l{.C$"Jkfp{yN3f3?43#B,K:{^H΁I6?H_<\{㋊ 4Q3I{v>G1k쪒PrT,ӜV]`!r%7O:s0Jl |u|-?L%짶bTMW 6)‹}"T&Ø`M / 4IY+bO? χRn̵ GF8P]}t D+9WJH"~+)6o {۳jh8Åen&*ͳqg ZQ \@Av~b*ئX8oiNA_{z훨| m=rRK73[ V`ebn;2KCF^J GgsQ^1]',HпNf؆fy[U+>9nuX:% {y۹7[ vӔ4ep4'EBa"i3`QxoixT$s!ҨiFn5I$4_'..59 C7%tj+c`Yp?6} N}iO" #Ϙͩs\KK 'Ƕ؅%cДDܩgzU|0hS,WnV_&ggq !'5LLݴc|m@c黍#ϟ+ p$s6rT،7C}N)vi0ܕcNxR60ˀr ;1<=UV Ȟ |B*Lb#Ї'Gʨ)18wea1^Z~{ܷ,׳UZ4ҚI.0]v3IHKWW#w6(kTl59̳W'hVg3l\1ϥP4+Mr b3$t~$BfRxj@8&-辻dTn";ʸn r^h7!%z"lf٢5bU|ӏ/+A&r̐*H 0nK˼ZPX ;on{VD!GIQytH;%nP-6ǩ뮐!SmGEZ]QQgF1;4Cq cĶA[>&1%^{f5bq#Engs7FE7AyD ̸`ES\]GUH/ˇaZ3|@9^z:ѰPp84 r3mU~ײ HHˈ5xDrqN 3H̆BdOŒ8u]jՒ!.Xnjt\SNpaXd"vƊ<L*w[!d]kFy܁#gz'-U=ԛXa QT{i̴-OkAw3C{J*6r|>p _ % &ƺC"BQC$+q7Khd4f_[e\};-y?(VZ[E9shcQkE3&)1|h-[!Pd A6-b+!!+.F{!Fre)f 7S3"it5/  dX pq8? ~wz)r㌲hM p?ʢsmx\\^Ѳ5/vQ7t "!x<ć>ɑg .JVu즏dd`wiw%LDh<ߺi_mp4f] 4`ok; "ЫShcjKªJWZSwt(t _:^~(|RVC4oҮ?WR&dO;Gqn] 6:9T񬹡usbBʦiw,>&Db@L]d,4'CYgM? ^KA9gg[O]'ȨVQ:,M'\bvJRV Mީ!!imk"|6Șu,Pz9Nnҩ O0)uai%5=L:(;\Y6L<;]߷uڃ 2/_đm]Ŭffx`4yWFh(wb]:^\mMW%be:.G!Ee}vǶj$seVS9fbd|2~ NI#X=o*t^*zգ.mr{7&/t`{Z 3z¤3 Bi:l]Usoχtt"s*40}3\@y殕2UƉDN Mޫ;K| }Ό4L(" ;X ̿ 6H RmVھnZubXfccKS O?!j?CT*#kr2)Em)uz'}yK/ߛ[( SO֫rř>U䜬>Du)Ҋ~6!hM S 1 ้_ބ E>Vgciө) YʬNxCF-h "i'ˀ.,hgj=rw,\*]@6ATe| IX3{);Om%e2H}D̈].+0I T\N/3+WU#M$[M'iR fv8oЧ"FeIs_ii=^d!J?=/M4tuQ͑A/q4Z4-tv.O!92i|9A>(}hVww%j]`.QDVIIٕ+ ^\*V 7SJ!7(ȢkixșKxW`$~|۴Dzce,w/mgwcI'2ݜ(X| &=a&%i[ PDfNzVVFś ^8͇R;j_Tƣ5&̠z$O7‚$Q9mpmO6C!AF3}Ħ;[0mY ^̒bs29|8zb l'ŷ)gKy5E*pTs d!j$BBP_dc,DK5W?н¼B.<MYw 1- GX/ f {2: 8FKj12͙1%719⡬ W\K3Pg~z2Pi?=䟘7uXUrOq<VDp.?Ōe\d,Mk9G=ӺB{Yу 떘M'R&يaܮ5 qzT1qh.4TbdaJ'Ei^L Bf"=Q"YPUn2<g? Z T>G2 /A ^${!ONJlw}S!#KJ-FĚNg_MZbOPD#v ~`4ȓYsҕw4Ff&m(e;e$h Ocy"àZʷi>I<Io/ۈU0 4Yrdc"'u5~ʎN.{xp0[I?v/`bH̠J$3.&4bĀ4Uf*OvkoXj6?k05*AQfs<|5"ġW$ĬڼUOU/p;8l3͓l:$ tH;9$rێ*{Px vFJJclVy^|j@ Sr]D`X`:4Gٶ *D΀0,(@CFPZ@w1 ?~'$BL@ֳ* ;Iϊ,7Ev\?G1^կ?g>掸hTwAN=8z B&ݏJTԾ2o#~9!J3hd2O v\GXą;Њ]-~1Qܷd8[ Y%>+eN<5F 1Xl8V%kzPhn -:Dttwűm`tAJe]G>mg*X:-BNPeY5] PD*7$+Qlr`\[XTBk wʙ6wd^e%b*e>դ t`o.n (l2X68 z-sd?Rs&!d"4P +. iP2.jF\O._,M\a8uP%/ҹ1R} eRcpGDAbEJfxk~?PC2/+1G/NCŚX[n5&YvWj"R|{&o)#páF ^x=~~~M֝5;LWW=IdF83#ıL.sm'T|'σ_Rs8=U}1YpOㇴ47$ FϹC+qi9]Bo͝tWL8sNjFG͊{7q{9D[i -[-4ʵ B}=e\Z-“ wjC4&er=%iP y]{q7N~27&~3O8@E<ht\v2(IŌO!J&w4: N5 ݿ hO F8./xfw*6X[ljkJ 9Ǭ`0ね.E.'狋$Ih@`O|J'xۑ{d xFV3xH!O )`Hq}ϕUDU)*tbρ זVß `R9jc4V~.MY _A48A0m-(~?Qkt) ٴDL8C_gؖ(7XOZ>:2|H}١$-7o} .u*듇 ,YzEwpAZ}S}*]-޴J|+e ^?~AlDzTwk xn7z#dIx`50oN獯:|5/_bݱ|,c{(JIk!(ۑeob!:5̱")q&;K5/hfK"iQ`xy>ID(0Dl&otuҝ8e}ЗgE4gR 9La7x:9װ§@rHM 2򦤰mnZ: v8qH0EՈ/ɣDDEqBp8)@+-,2)Wɔ-vRPC߷?ЫX(}V %X]{ ,# V8GI+Oh-^)N;Z ap0 ,(Jڄ,0 4 mOL|<YcP_Li);O90"<M3dmX{Ië;1i=/2"~Cv ù0F&2p"Biu<}Yڍٖ)yNw`A?+ܪwvV+PE;u#F?˃T]%@GudzEpw:t""JH$>d* ̡ۣqB2!vAlCd^bda2`Ы41?KRd +(Vd;muEˮI&G76=DD{˲jB bZ*7"7,lq\VS2*xhkzm[ del)HWڱ%/cWhGP~'k6L:tq kͷ&>&|G%WԶC`Q7bO5ozJ}Zw߷2DlXӀ5yT4tD1U#܏5R'o*k 'þ@ΆZpl"С5:Yzڅv">mxG`\_ `P0qpbYѭ.1Rm|>P;D#s%uY۱Dך O]h c9;e?i*$tJBw\R.@k<ٝO,$<ٔԅfe謁|!J|ZMKhGCTize<0᣾ k[ d(! $/ ҐR]!&s{W \|A ɶ f9Qz#bT7Zzt>)޻t+i|V_P̋|f%[8w;]63F* nT%~M,L/4t1Z-Lp)4./! WN$Q 6e f !dc;lLƪzY.O־x}҆Ta&`q80 {`ZM0Sa(L] +B|%?aޘ }+dҴ/:Tx||+pH\4U8OsT{NemQtN}^6*KWˆW3yp7$оqf'UoSNng')Nkz¼yݶ4uQ ݛ݇ K~KlfOaP-ᬆ𴒉`(('m}}.3z=h6igȶ-X )W+^-n`n)68|Ac Jc0%*NJ(͒,$ʀd@lH2Όu$zpT|*)=NT֭y4 z_:{MI뙼-DIP|[^OBX;s<2`9*F H ^Hre n{ m;7xWucu@PZKL:'OWb/79c@_p&Ӌf"{wWo1ĹUb k:XƼ, c Y 7amy6Ŋl .Ld=Σx1]QM#LRSkɇ͹FJDҁ 4]ChRɣTo˪ZäK."xd텋dV2HM0y.תI_šLa$ƣFS0ՏKw۰W,CQ;җLxk܄2 K]4kDL kq>كP{`NC,Dݪm&ߕtt *e s$K7ثԁOS-5..Υ@E?j%ҩ\><9@\<:hZG^Iz;*dCD|bR>qsz#C|l+ž rb2~ǐ FՏ΄cdk\0'{U۳NڎTS0£n0lVH޲8LHZ`wtͼ'"0oD8~ԼQ5VXŘ{53DŽh͊v[#9~+979-8eM&W ҹCwh O$XM#|3%+wX1Qk"L!=Wz-&¡0ҐRhj/' Iq@ B<'x^J{1s& j`rBcɆ=Kv7Ų~o n+;n2!%"6@2g{=̄|k} <-宬IsЦw"Y,lDiij\a# l_16[^;bfɸʌGC+Əp5|`|,.ۊrll-9[+.c%w_yϳ&t9uY,:I9-:1VR\d呬۬_ ;(ӼTrݱeic:SgҽwXBڽ_7"~ǫ6a~q9b7hd|rfO9ֻPڰ>тzOD% R og :wE>ͤ$ɷxPჺnG3]k\rQ22jDS Zg6αI<=+uܹ8@^3dߺo9s+\VChR"M $AZ6j(̈dcZ};Ngnh6!q.#jup /1+,KLnbc˓Y3QCTM+n߰;&J:;"]Ѫe/pi\=Ħ@fۏ#k0kT :-Pi&ф!aZ"gt["`ϒiMw1= 2f,6ұ/!mHI ^cHA@ޙˤѧ]=Xf)eZ|5B"ćkyb_MJRIag ,?öۺU :aE¤#\~̽P?j sEE)%pB .\Rg;Ǝ4mSƾ*YmGES$:@Aw֙y/mI?P,Ttd3q#Z]EʝlH;GacT /O @ad @[=c?_ EյЗL݂ or[mX8Հ&{DDÛ N+ʟg< : N p}g 7ppxg{5m80݆`G,(Fj5)ʢUܪkc6j<ǹ*KsW:}*dqbt-HJsɖQl=+AC/&%j؊tvƂ *MS ೰M|]5e(ayRw3"J61z*b"8RYЬcՕߵBf_A0 ;H魭b%$u@{<)J*ÛZ-0G$=^|Sj蟅^d G#L`rp{v 8dN.[ǓJd a"Y_JqRzʡkЧCDYU] R[4_6{ڋ %kzY>vnyMcbn|i؛(辄fu ۬, C৶$lHUݿ 4;_ 7 Y5{#| U/" J< W$Jk0Us}=ΗkCbse|vd-^&ơ<Opb*#J܉&qI6,;| ;#y7e'OޑR/;) V+: #8IzB"Z}Gp-oRCp 9) D1%Ν dOiĔ(˓%ٖ%V tR} Ǭ {U;)H^&PT!ڜ*m|PveM>C i`7\Be:-E1]}W/i)y4- p!;u 2O+S(]Nmh ^`P%׌ Wj6 -lOhӝ:9'v&7D`O6βL;d,Tf1ݑVo_5>M(A;\Q tB*K3[^pU˺@<G<9Ϯ1;K{HE}2n} C!` h!1(ߐMAf˃,)ڷ{\#5t0K 7Pkz(u(`Pq g 0F `7=~98k _B :ۅNI|L Fҧ&t-ЈWxiU xobEC~ڣ\LCOڢH(ݮicBVve2c谠VL",Q ! Vzn>bdI* J%D5R<"4bzq.ֿEEH8P djнYX:/4&s%gWXb^,^G^[0p~r&iv{N*HD{0 VIojSDI$^z8MGp 1kտlcYNJ]g)'#Oac5Bսe2*׉,ϧfO)Xn8F(ǜwHK%=Ͻ׋ zM}bNEd*$3n: \P83ֻO1/$D q/C |C%l3UxgXTJbF% M,#:57\ a~SHFrՋ?Cp~j`L>mާX[ZW-=/:ibcۧu '!_Yĉ_DbAEVT q|ORr2LEKCrմӘQN, :^^$?@t8`kTӟK{=/"~K+I5-? CPUsMT]AtPƃ0n+޼/WDXd&uf4\m$|E4Bgu#Wٛ*Nd=gCp sLhpE$;s_oX{%F+UqG8)'HO ['G?R$f:lܶ\@?9S«vxW Gb `M!^SܲW=Ve$ 1&&?nԵ:dZTXoM8FGhv)/@#߱ =q$64^y>¬Sb[B9}-IoR\[],f dv.D^ c3рf?Fy"<#E<3 5M wFf;˖7i=ݻXG}So!Yxhؤ,_V,ܗ5cRpT98scG;HxR *gA'IH` [}>;'䂧zFyS+SgW=m;6/ S E# l-0A~zH8,ؙpp{Hrțol`X hjlؕP"O5:Ŋ!9WxiS(j3ɝckKv㤈2 >MT靖B`U]pk( F뛀x6S'ݖ`p۾tY99J_Yt_2(Jq.oWb0 /]"q mZB` ĺ[51)ه)}Y’l@kw =:;F M!B"2|DŽ7 }X+ks ӔÒG-"+Z5c_*f7;9]~}:I|hw*6"Vײ2FGfDN`}TĕȌTecxUUz&iWyF2jTre"]cpAE9VrYzxߦ f3%g[b`TPlw͟'zi)6E/f"cܝWF]'ĞS&\Ƌ,WP Z Q-Y?Y8RA~Xu+Ars=;hRU:ť͸3+UJ 1ҽ}v*Hݐì 63F rM~ b!Ltt\u҈7D,T|( }k#t%nM^PG66k}ls*Fk1X([] Xh P5!'MƷc2Sqpޡ_~n6lkn"ݐ [?j纠 $wp ěQ>}ߺE iDs !ѳ7xpn)@E|1}Fxk*KCҪsԛ{촁E.𣧮X1.w nm ,eUӫFěՂ@7u.[uJ@a-EҞKt n0\=$hLO1-j'l]~c]+\ɽGotvI;N3bH}\A.i+>e6";蟎$=@jvGvR4tA'oV>r8'8 qK\+bi/tCZ= b^J+}9PA T8_{?Gn.Y؂ 2b@+z䜞(-Yے_i(E+Nà?f*m[ʠJI(`QE@i:Ret!w(=N.X%K8_W%L6z/YܬE;j-bBb?[FZ&kl-з|:L)ˢxϓʲ_Ōoq,LnP+ 1;$SD'6rNxi]Y_纯xŗ@1AMvY9(aV`#zeju#_6ڲ6L n'q/L"S6c1 Hvsf">pEPÈB#jf?dO:_ʍQmf9Is ;Dة'9e[#Ϸ#禿yI9MlYMu:'9ndQ_6oXLESTR_r>P;!} ߿ީi}Kl[joԟ 6Dz:\"^T QSYylb{ zwORs( <~ug%)z\>qWIΊe6)ߌ]ǽ}Cka1{KOB`.~-VXH[U lųii?PԿ5'OH.h6:'~9biw{U0$茺fڌ:j'oi$8u&U{L\NcvHE+_28hߧ[׵cWMfPu3 _yV:˟ËilvKsv^--]-뗋CFvCc m,jz*m@MCᘴ!zt  u ת2T f]uؿԝG`kjU8 C8T*gk"ZCо#juRQo)&)i;>FDrE~QQxzgx}̞5s$OqA@P&0 r48l/q'h]Xlg(y165WQ&@xj :EsX[N桊Ed/XÇ6%gKR@~hܸ z:̺RUDl Ug搸gx+W Fӡ]m4m"L!= n"7x-q$ߣ^n)X)t.hVPƆ9) M/sE:r>b\#IRycNM{f KSV(($[ C B\b4J!5g/ռ'(.-OT2e(XHk aent:nS̀o=wM%;xB\+]-s2YJk}`g { |N!(R n(m=!.m0u!Ĥ=RlX' au&A7S*ĥPC P>1J'[{7r`vg聪+F P }-(j85hY U%'NV]QYNDz}ZyIf.WNũ3e0=ws*R.G9'"~Xf?߁UGU4%E(bf[Z"3}x[`DGm|üBJd#TGV+"#VnLRYi \b%&X:|V;w'UaտG6[c=u v]XP,xmFA iYkB+ǧ[e_YRP6Zk]ΖL{UvO鹆ELV[ʳQlu쾙,:)˚V6c&E!~D#FМzOYH:Sԥ Q!@^PݦĮA9_cD:jOuUﳀ_pd?(yP:iSEǂKr#q/QȗkjM$Ű`*uit '7?BU[pQ7/]b=dke4g; t3\'?}Q>CKnXHYDno:~E0oi,FT/پ*s@hOZ|,sC}a!`n{ۋ`k,wTLoʞ??Vx(ji9fW'7p9<3D+(boZ+>P3Uݞ?b"-L󔧢"z}e,~AD~H*bDSyi=7 =BNZm-hM_UMӐ$KGyąw"b#?li.u+-PnaDrTk,&~nM w" `6$̰k$BcTƦњv^EN9I)&ЖBLB| kdpXT M%p!0Jwd)^x=UvҼVtj)0Y>㈎DA ,Ashh? ]Ǯ5 "O| ͤ'e "x/f˺0Cs!ꑎPKfX?bS<;hJ}Ùe Hh.2h?ι730{zླྀvVCWX=@q1qWuu˱V8Nl&qI U:•"%JP*rBqB*@"IVx2T ia(*!0 LJl\F&$+He@V-7 ^_8N7ԙ)7^:jaYTSv䅷4ai3'Rz%ܱihxs8SZrhT&L>>76Hc:d^ rш){f%&r5x9K (1$-;ׅ"? H>!uu39M3KlNLL_o0E);o~WdAVsͳӕk p7D 8ͷB yip_#$ܒڸgNDfO!rs_WyTuŪ;9O̸VN=Mp4!N0!ͿǞ~abD2AԻyrlh-tT#570 l?Wk.Sc$BWJF"T)u:Eyzh\98 J0 ;oD烥 ":9 ouE%ӄ;{ėS ^ҁ؋&u%$n{`۰'nAu7_?*aw~"MLvgM&OZ;WȶU eq{ z -ָ|ɬx^oV=ƺ"!A-y| hl_뵔Ŕ#{ߵD\}'aNܴPpUr? fD|P%M8[*Ga)6ه손gӼ> G .Bdk:oxkzS J"H rG&ณF^VOiw6>xQ~n҇V4Aj#Rld+$W82mO]=|)b9WnT ml9GH-$u>5+;@3ûerGk8x&ڙ7wHҙcƎ۬-yKnEJ gCԃ=TLp4͜M>N"Pbe,6TuEa+#~l ӑsbM¶h,!}z_qr6L-R/ !ctNtb[2ݩfqwSekRu/,Hh1|b \{$-K^'K^=܀҄ BFzΘ `s:.&t6"0]VG_:EŠd\ܔ9}m-=aDrK`$ &"A65?Q7 @_^ڊ12ek((98"7ߴ]WhE0 ^c)<@ʲ\_r'N4ׂVb#DtyAY खl-S盆&t_rCw8P]"8v N@=HaFc*# SXluU;,l6=65PX C me&V6M g%rioJJJPJE <Ң:Uj8yqZƃ/ mv,/.p^94e? ttF{۫ "5ƏdHCi" Q.۱mܸ! {cp[p1,? Z549i]=Wv Ih@xzr5r[}KO5Af+63<4:rs3dp_1'h[rKr[Jsȏpugs%`B1 $̲$.'DDNk'*cI$v]Y=Ŕg\b)xHfezt5ʾd%ȦWG\5ɋِ^ "Zf(š(+]L}KGŏRȣG aZJ+ bv (g%HqKx9 {BzLfqҋ1v^t3XYj#u)ΎafS NOp.Xp^z,$W54!.{dޙvjB'W>ifܭdl8Bގ ^)BN1ҕœ"&4(̦hN:ޘYYC5DT.!OB^i X.WۭlvćkHx*%/-M/ $%z.h: ! kVv,rM;e+6ϹC6$9Tr d P/BC]8:X0ܟ$dˉ}*Kk:b{SY϶8; T'NWqRI-V|Jd6Hm hS(P凣ed6TX(xۨ[RZF(JKL^`AvE] 1:g*"J3!͟'!T+ ]dpDͳ??v3_,*rq=S[z3B ޲Ã+WФRR%$굱>dU?7eP$*/;sRcbE6˕P?>zFkh? Xq9,^8֋5kFbmGOGrڍj _m>!}B"g|p <;&8r\b)?*膒'p%ggʊcZrO )1B z MEw^np2Ee j=ԼR#ޙ7OffW.ldq2gѺn3^n69aW*Hi64c _JKfY]k}uC3 V&1@xڂ^Ƃծ2TnT?*t^,upA#vا(P73wi2S-W lm*YWu'c=RpgsO@I]mw^HXG $0HnL>^g9^{1S?(̢?~h_MnJA}U['y"\K}ջ` 9bX=<{tCxXsNKq WZ %8%%珉 qP KOaq+nr̠ԕɧ D9sL /.>y{&㠸rhND槿1IE+- D-# NǦ]BX >oD9mWnX`<X y=+tul4$GLL_ΎOδn?$aE>A!t%$ 0*@}+e=RAд@lcE;DKh',]6jh~=NAWG_,_HlBвI~rrh ΓlFq54);.5 0ڡ8XD_cQӁ]FӉގ]`kbܴRgi(ZS{Bn׫e>-;/~ hNM^Xef0q4[Fy86p3w9`FÿT.0_ ;sǥ':npzPQ[ HABM2 T8PEۀ,Fz@FHmR~HXJSg3{މ3w/S+n2K9wP6z+op@(3X)npɋ!n`+ f)ӟ͠e?]7h?/?cb>fSY 49Kd$>/FEX:C6oEȗ D\IzueCVJ_}h8wkOۄl]`{JR[LwxP͐ V14 fJq5bAwiϼ:,r%A3y:쨥p jwN/B^~9nŠP;]F][&7O |)D70kݶ!G e[jWD5nDG Pz -=V'Γ F fi2RZD=Lf#9-VP@9 GF R**4] Т(UNoŽLdpЙ-6}]` o=4ZCv2p3]0^~KsKIAjA'św>{ar8Αc%鱭X ?+ .FĤ(F iOڃkQUChèU i.Lq>DGM{r(TH6ݵ3LPEtF?! - lN~Y՗ Y ll*Wm sԏfQbqP#/6~`H>yrD[!f% .lɓ*=M4}V%IJYb>BX2>k`0/M5[d<,&ݿ̛c-s'a[*e?tzHwϻlK|8%͹3I!n{>$ʺ-6m1^Ε(5dlC8,_ YJ%ʥjmn=4HGn碊/a@ľ+:d;ǯ?i͐, !4o},4s|m~#]!?.:8-߱^XzK_9\m{SK:gh-1 :;wS-_}BB YKZK,^ܶ~m}"a7gvA9cE=z#/I^7^0 0nXe펳=6b%.ބ/8:Ot:7 t\|ܥ[ caz6HcM9e[Kxv6P"/twt1`!?*TQCCL8 4cdAUr)3gpZ)<}ClV&J5jȗš{|N2RNX׉=oOdH M SPEcVO)V9B`1RTf3[!wi^,V>uO6q!Fdh8"G{4R3=P.K!- 7Z]b8pxB=zϠa+c [x' ftע$N t׽3. "5;!0RH1Ҽ։ 1hd?ځyT|#,ٕ!?~GV'5nipDX ++k!1=k9ٮ!0蕗pゴxyPb}٠8Y#*#Wc9)C_S>&!+a8q&XΆ27puD^,`C.)\H\=F4#v0q] >sȡ棢{ }U6.  ^ (ԂKBacտ9,j0{)^4ESE3jA=ԢH5sO x&N \e-{K7'Gt3ޢmם"KoZ(n"%@@ LV:~իpG&[ã;m5z>n2Nn}RF,y cDR%b<\44h6q>Ơhj GZ\q'M^[Ra@eN:_-N )`Y :5O9]Y\\F;֒`?Bb$іyO75V{L Zӆ!9djSW $ErrC(Ej`ӤrXe,xd)LNd=d{ AR^U(2B(ᠫF &I;A6e>vӶ=QY]/S- B*ޖ4>"Z;EI!a; ]_D}[ڋoUz8rc#k*%(fZmpu::2 hmepNа ,H=;N׿*BbwL]u!TpCJت&~Զ+@N8a SI+$5+D H^~2V VkW6k)M6]gi7Y-EB9x]ԖcPs냩#cRM$z̅kvFE֬)uRJsa]GM=_#̛ڒy*ƊjaudR~oo_ޭz"m Ge.T<,+t[ BS=)d ;*lkM+SQJKF0#VX3Y|I#S;  9hO*Ka7Z~Ӓ /tpktIBxJ ug46Y~$Ijrص)}$8V Ur9Mf3Г[$~"$kf+j,kL#T#P:We|d)N?ktU}Od*AԷl,U$aȒ0CobbUkލrdJgβ#؎K6 4?K3L[יziD9M%:lc i}Q9/WYMّcIBo$F0S{w-Uy. 9蜓!8w`錆ʘ!8_jPrETІƾrc;aPmދNDZ]%O<ֲ[ 5o 6yS+&+NH{JOVO_֮ݑπ\ރջƻtJ 720~ 78s'r&Ab'N?HeRI=Y+ t!qv"σ]w*:9XsQv>9JB iWJ=OXK௎~G aAXrZ?;~Ղ g{`8wDv w!HEWK,c!:8VX.rD`y\gWO%Gȷ}6zd9H>.LuZ|DyAO?PU5Lk!Lj{^8aQ"aZlOx+C*&z7"ך@o^1; vN\dMnͻ&-pI·,ې /oqf&~%CXTU83,ӉD˕ t<9aDV늙KݧW&n'?/e0X#xըB;yp'&"|s4cus}@:fBCo)&~4"Ulj[OќmߛOHk 9ycQs5qGl6D`9WǛ%,)ޜܘ Ӈ+Ue~|`f[6Iz )σrN@q8K 4AݚWNc- 8kż|U쫙=;S>]NoabAB$&V6V(<s-T 1̞}^6 ?J|iQA6ID`Uw8fHVd\w}Dg#"D~MW@ 1DHN"r轻IV] EV+#2r@um|=Mꯣ[DI,tZUn@(Q;!U ) R K^3hp2I3EStɔjw^+nn"8]MNQW\Y]`{O)RS,q_bOD^O^>!o ) /\g6&7'd} d{P@&y+!Kwzl.V|㹓NL_1uYԕ )oJQšG[USJyzgKH&C(~'z2˝D) hc=poU*pL`D%-~f3lu6`B-vH.L[LT(O$KjpAoR0f({3!Z: ZD.ɿ@T(-;/-3WL%z;2<_fw啷KbnbKe7 */ѾRQDds;1!g rqOgĭgBoV+*boZ՛kyzaOݤӹ\(~A;HofXqA(^K.DNeXHY}aaw ԟ>95t?,+b{s°z;E-E(en+5}z6#RJg,\k*L;aܵN|>McsZ;E͈O"a瘽8Jֶ{N{5t1<;&*|~0Ű"piYmpMxxUJUU[(#W1ORvl"o}8p&v!zY AQӦ$qZ3Vj%. &sٙCJzIR֧b:TA3F)z};p%3ݹR7ۤ)1k7h r*h@pa﮺E68A7 56D-*q20)bUw R% , jjceklTCN:UF]AӤ"au%+e9j:)qS  Y{\S,&&O*ki'S.>s1LjUZ+ <o:b"G%|~zWHƇ/%bW<: Fi#fya9v_$c;,[$]]hlUݪ`a}cnMG}CorU:&h )EVg^.p:`*;ןPR;Fe -H*5xG;,DBrzӛ8K#5(;ZbM(ң;S/94F}B v~ B-\ܖV-2$'(&gЦZrE1rZ-X*07̞&cZy~4sҘѬҫDgE d X6f|\:K;JThfx!hҗ8w2ԃ'={'@cUW4^œL#8YWd1ð/-+RsuzB|!@C.?!JJ ;/\8k3gR "͋P?nzq2Ā.GݿvqS *=Ռdd\.]}oFv"_ ?XXTLvK \б4U;fg>ǫSaP*LfAg{͆ i%-/p%Q0(;<%aLˊnrryq/WV& ƛŖ>pZ?1>ʎ(8TmLnM!|b3@483NAgy8{suc7#%M[573&Ⱦ;!Chjf+)hgK9w5ZfQI~U!S5u'͕1sǭm+#ؐKLx˄Z!⊵"": &mBf~Lf}y0Fb!Θͷ2}k;wD2rӟз*wI%2ϲ7/yr]\M˼Gi q7/A3 6^f(+(pC)&e( ģx$CAw >;eX,RG9Sm}PǛ9G|EbSQ^K qk:/& o'$+'l);jSs})~ tan ΗCxؗJk>sy^I`'k9 |s,:EŽMӄ [yF>kko$ Ь?њ[mlS;hV3u&vրS/O`j>3 ۡ hFPL`Z\$e$M쌌<=R3}} {[[UjR8p/)O:朊[\agwɩHe} Uɴ;&rPY@x"g#MXʖ(h d>4Qyˋ"*3-z br{`X>KOⴏYW i3ݽ wnz37qy,$~&IVn&}n{WȚ'.9Ui?DTZy/f[Mo:;0[mJ0Sm)CH.]@`K+&b"bp 4o+ (,3̛?(XZ:0fgTL'>f?,n=:e- 1"rloxK=CvM`3^;cp%; poh/]@J qKa.6:*>e R3#4*۸[b*uߛ?djt9k: 2M`g$;AwQQiq~򦉻7fp{I =)Z*뢐.B8z ^Goz(opȶx2V ?X@1&]$Ч̞aNxSpBc%c&f,қj{ ҦegN͈XD"e=*2镸OfP46ꊜx)r͍a\Y.fF8A.Smmzm T)pO(#9V͜ ɨ佼ﴸbVAOPe[nI#om/Y]΅~h) Jqf sbM weמ/R Wd/+Gn~o&3Kþ&^+58|FUg?;[Do:$ȋ+LųBhÁu<\]4%o IR>8e8_s5[ݐENĭ,l_fLΗOV>O>A`Cj`#jLa4TuɱJqw62qM>wT8 x-F}w8˫`DŽW;KN N^9,Qf!Ky$>}+x0T!}/\NZ@w隦' wI~m!rS5a\5LDs<{(y2(-\IU9Aaũ왿}0s8V,cJ Q[EPuB+ҚٶǙ+9ZU|9)#"5Iew9WaOs Uq$Re8F~x]lW@!S1qa/q˓-01HO}QX >LM%]жx9Os<}[a:5-\a'@Om,8°: jZSfG_*W]5F Wv{T0 *iSg"~r ij8RU r#t &OR)x5lg/K 5)R: uӊMthoL}FT:YZG[zD0!d!0L߈pCjϊDQY#(myM2U4:?iVfD!X|j7kT-ı#ϯC!+w'-v%}[!8Zf(4i<q(C^k;ձɨy3}ǽtNq3\|apdN{EFyeC w}2shr#>Dπ'6(bMU[(q3iN+-6s`ND:1/^ZW1o"$J<SmQ)@ }gWA@^C<)^CTK`7 Bey=_zO+ǂ`hUиrNt̒Bt4"_Բ[i_L,-O1{_<ы,xgAFL3ܑG)xI1M͑qlr//=Ϯ'5sq[Sɳ lmg8lG5FtY*0gUDԼHfDw՛_ K1yʶ+ũ>Vyb5t)!+R-'ؼgA;צv 9›aNJ.Et20T%!Ƶ&Hicu.da pE͜W* ~qZ<1Yoh>)k캲K$' vy [va/ЦH,%"(n U4]ᡒ6wǂoFYg:e.Zĝ@[zx)2ufl2ʈdzVED4spPvL C?ۋ>'BFlQNDU˖͐@R?q+ }V*D"10DvЙJ/ˤQ'Iܿlz ik%iiGu5S?f_U&x`hxҘr<unj%f]sFGz2`d0 MEQwmQ##'lKI/-=N^~?s$٦}*pMȯ!]ۘccܑWoQZ\^f)s`D@SDOP&aՕiUycgtXguHeJ ]'+D^v֋๓旭p~3bCHrtY2QK =f-^n#Bty \ Yn'Oa^+:92 !6 iQ-ĝ#AaD joBƹg"KA}:wr&K ǽِ^*AC9>`C4 ;/gdDYH?WwSl9O=F:d-:㓔aZ`M΀ugP#J_iz;}<Վ$T+!5TmBO"B[fnU%JOo^3.K6.n^_|MZ_E_U)&d< u>Sm.J֞#F }FY&5=ZͅFSl o8_ɲQ c*E8GZh ;V/qKu* HхAP4x2D\Ŧ䠴rsy q}'ns i'49[jx^CbkQq^Ҍ7eM @fK¬]*'b!wTէKl]vo, r8Ѱʞ'p'a!"gB 19l%OnZ~ˡjB4S{F.­B;q22(i R\S9A!Escv+u:gba%EӚ H%0,mixqLHhy9?412Ց!P6 =$nY\WOJ:nKhtRMZ HLci<Z0<ګ;/lh($ #)3rU&K#Q" F@c劓_>BM 8qHX{B0ޅTJ\utx]',$ PJ(JY:ށJ$$)KGddǦniN1e!/0m86ЀJickYXD_-NUuy e` 3n]?x/V`. wP ʺLJ(:M'?827]L 5rs%ALJH.-,^Tk/M?^GSҹLq4],'mf@C DQh-ԴR&M}$T?Omϰ$c4UoJ>,sr4g 0>^kjԪZP)p3>7Dbã^I"pµBz_Qy.'ndl~d|8\T][XH>EnCGfYGA=*΄n1g鼹8E Y_T.IxuKxE_,W!+*Cx&9e-C4뜮He,4j7jmp2 7xSUmHr|O'TF5 䛈0UM7[ZBz v9aɺNgnn:?z ̸63>,b;Snl$ohzl*Ƹ=Ahfib-Wn*n#SZVHz2wk &<WvsZEAþ( 7R*T0JJ1k[fЪ#} & #IN\\`/\k&T Uub>GVxԌbsۅ+En uᗰ,(Qt[rk< Q$?rQeqI=a޵^Q|.H ohz0V>e> 3^9œU$TIf$!ɨ^oj v~V^a sd:˦ᐬtVc_ROTO;lv+ETЇAi]x7 0"6j = YCoa 1Y^FeFk=H&2gٕ( ,{ss;ocB-u`&n{pOǥAE6H1UcJ aL06%-,0/Y ì&R[TnI i^[ʛ=Pz =O@.*E">8-//n"y Q>2kJW~mݟUHBw߾c-Wi.mb/HmOxlc&Rd/Kher47Le-< ~pd6KzDz& t7Q{}=28Q  ]ӀAj/BAxTFHkQ9[$o gڡ5ëPjp\uF?-d5L1Մ\Vp}7c}XdUzӈJBV(\jqd,a|hE:;;het]7y';@) I@{>m0om6-sn3RtAL5N-M{F)zIh 6s&}{>x Qj#xRʻS2K36]"+?eTrtQWL|t̳1mu_RCbd9~=\'Un=Hxv#=}/Xi2$~i^sdNrVTq_ze{OKMoM=G!sz][F/ѩv\qKGxDaY/ӒUb;Suw;TNE.UTvzM]Vĺ TC+T~W3 \|]pTd p!JBhl5N-b2k.eNWu¡dz>Vs-Sh6֚&=F'v |FIWԁ$qa@wa6;d>mƘ60/'T8MA3M@DUi4"b_2bs> vYmȞ-A72̗f5Uj/%sJ9fk\C\N2[(-mj˰Ʒ7>Ɔa7$t#S,&s]5^/&߃n݄渗ye[sU 'x^pz`/FW4o3TMAY-$AQǝR8LWy2INZ!`2e6pJA yy(`qM=E0 `.Z ,p ~JDW ƛ) عɤDcӑCv~Zhto&R(ET9+!! 16Rg10[BM(f\+AAE ='DTX[̳e:n[k -;)3 wC?:zݜaqlۚ<\Y6k#\B[' OQWG؈Ĕa=8ЗZR`^/p~ƹ- "Wz?zvZod!R2k ݾDճ(Ȗ^=t1 bYde9^|+Yq r,3b-  R|yrÞ$,@',t9:.ё ~4tDۧl#^n2`^#(9BGF%yYȬZFnT=,ъlة4N"J5p gc{'\ڜ-_ u4r9vIޞCSa#ibP#$ⱱWg)9be^s n( MΖhwiLOHNWn}v V~-߹+ͨ>0?Y2bJ4 X7?[&JUT4hr[<]t$eɜG p^#kvwI GdkL &t,`.Eߠ>q@^~|!Ua͒,BaYFK@ة"{LžgƊ8WQspOyr֖өMd# {죹a0?u]en,,7OCʭ2H=\nQ6c J;:=-f&"4&'ec%Awi*X]^.`fI?uR.v'?,cNpҽE}'n?~ 'lVMpV];SE0r|#jbKN%}-obB R]d6iND\T/\1锄hP.R%V#[]y.LAg|K>B~p<;bQ:Qq@ [NA&X,ݱvG@tJdȤO=A{0uWOv] i&XĨkCgjASRg} K.βˠwӝ"QRKN}sUOlj+v{MVuANZ4GӞ1n&%^u `0+OGO͎- LʅH*`(OP{҆'L!c#@5c+Dϖz@ւ^ 5(G'КFzWy#IMd5LS} &[(_4wL4i>XA~"N°r%(~n9mN)xj9 s9E|Ql4e^Z oB5[Fs^oH`\# w Ù%pḭ]l+US&+aqT:wU7h;r wq( G9(V`?v+̐h.t/ 0AG/$g#tr};>;AV`1/|") WJhh Ȣw)J*ƥ.OIv: yظ\ngXj%CU738йLՕU9xE Yt$_kg"F'ZjʐHϹ([!#vm@ExUB9$p:-*gbu;$lj\u%HD|N) =D#>/1A4R]ؙp@>Ss} #~96 v :(#ym@#Xhc #RܼƘJw 28VY{{g9Q"5v0B*[Km#x08\`lA{1Gzs8+'8ys.}9 A^b?}]J\J(dL' )$F f&z_"s%F_Nh) kXA= ܙA ?#6zj,٤il>fJ|/ \-^%nTΕ!NHp`WZOs 画qKR4?$KHG~XO# @ym6 Pc{] NXQ2P2ȍ4оu8+-OJ_BVo'`k,eɇhl6>Yy&{\/+A!/>/=+ 勛e 9Ɠz1v6˾YM6u=+5;r4^g(a `B}j ^cALUMWu2 / @vK fr:NEɎa_ tGqmy*֋6΄yfJyhZ #LX]qQRn+Y`Shü&f"*SA|L_mdodiᕩ6q `#vtX(L:0&V&;ǚaUS*f5rk8b2"c7"+rp5ms 5/B=#&v_1v=PsHz:MrU C!`Ө*r~fp$KK7)hHv!Hzn!@7@u{cIƫ߻_t}R|Z4!8셓M|vIh@ԅXIk`8A]ԋ\߳}՚ 6}n˩R6dJL&֝z¤,DQ}~ ^cJS Gr4)ml̻،R|El2z(kBmc' 1;iAL!4i/\E#p}[ h&G|HTD'ʶzXeSj'[Scna /"c 쑰I\h`PPz {RoǷ5=v)݀TST}ש[jp4Cy(~Ζ~^±w-4y\H':cꏅk>Z5%VlKcs7|$;GH3*JySM5LvŤN)e"\o0vQ5^2 CQɦ@{mI^v\6/~gNZoC)M.g5*n$O2ozE2K Hҧ:_'dPտEN/k3Pkzb\cSx&E)ǢKNx.pJq@xYtGi5װ °i6\H~HVI vV<4+إ3O8#YnsFuuݛڥud=1^rxD)bdm|](L ]%c>wQLiSdH0EĢv\,1y|(,K6N|5fYLk d@TchctVLx-qd0S]W~i1EcBdv' l~6 )5|Uol+Cn/+[źh-Qw(n;~I(gǛV|wf2O~v<' o>S=jl v6Y&@t3pZr/^@ȃD9nLpz(?VNbx_e{*M+&WJ㠥 G)Xeƭlb.MXb=ôV"CW˻Lz4<%UtѺ[ vd=X^tQkF( !K{daaF*ϣ.Y.[ ^O>~6mĈ)(\#mƇxz@`aPyJH ihx|iNSQ=Q0u%rvD̉ Z.nq;xl@D$죱z3L)>? @OUb\9q?"s>0@ktwwʑ׌bOxc/pvҾfUCvrQR-p̌?}DVӶy='N3 3̀Bۢ褧0oA ߄7 Ύ#Y߿U|[;Ud8u$ "բW)0s؝ĉJQyLtmɾծ %5΁@7EjO}]'Yh2J;jPyf? zvd%™-KuqgVj;GqMkc>9wnj"SD졫L,ظ$kѲà0aQE{{)iQrE6_eJ)5lFAgp™Tڤ= ׎$ճAϺǮSGX-W@ `:طU Ef?Y&ɰ].`-[M ._WY245ȟ yՠE@)C]' A/8^&5M$fNmK1i&x#n}:Mc`kѦ#p1Qb3=Ԇӿ G2jclf X* v늦$~< EˑH4D(9zѡ|j%zdw%ߤZajq6`%qsy7)ETEd>B) 'bam/Ns\{ՙ dvkϴQ K+rcn,K@͗C\GaGLշԡS|+N}_L#$ieBL؆'&`nS"`/״FoAr@3YLS7g9pA|6|Q,QBC@y*q;pI5ptphmUZ0n ,_4T m%o wC8P/٥s[:1B`5:}}}h8c5@q+Pޢ9ۿuX[lg_%֜صRؤ{΋GCK6x:O4LsM|܃tg?HleyyQty81ҡΊNAz5JUH܁_Şyж3/iNvNDM1P4,W;4,P^@{j1FHhK^)׿.1&PM{Mj]Qp3;Վl9>⫴1ڎWҲ+іc\J4lei]gU1nhrOo50IvOtGw3nkUsCV<]>NjלƤ:zRhFx\(W1Rݬ`0GKŊX uio*:]E}U,ޫAQ T G$KD bs 6vwT1bݎUS )?ܫwNZ "+-c9If^wL8u)6UŨ9ަ(=aL% ||ܫʌd*Q'{&C/-ʯLzOT֫wzG~C}ߜ5WY8#}Wc&CT(feР===}Kl <_~b9>jE1BDQ`X]u'$#4qt:Ry<W%|&eN<}CoYZQ54=~֨R1 ,] I֝ylcR:reBK2p/X`LlNT>r%HDjH9V stn3tW/r >5}9ZOq“*cDmxgAܷ0a$]:@mšwPf;2VrZbQ&%e-243#q ѴZ]Ó?crcCoD |Z }P/}e͘v_i %gM]m\eQ$:ɒ:iη#s&N$V?(% cdGev(|;qO+‡Ҥc6EI`|`UT^ꛢjӤ;i~lL9O҇_+'1`Eh$jwÂ| Ls[%NwNE%A5 >df 8zg;E3;=#0(VmX!8Oe/,y,>I-Xg2/+Ũ-&R,4nT]׹`[H"ʸQ[flFEE4jwDFOK _ +*Z!nʆK޴BČJ| &`tg7ylY ! pă<O$Xrg]E\/_pO~7 f/_׊Lu!odB Bn-8+B FJuMq+(]7ExpTCunON4 b&86-kƊ vEMp3+s2'H9~$'/职.qw3ze` F6E?* ɷ5P#SᓕzW15cyуVrT5dSk_dAYLT^$V ^e~$H5# ],[>fH^+iU!QtVXD,)MiwHI~D)SBEN!SLD9LM" ornўܺ(?y7PP?y^BSy}pms3y+)frun§Ã@= &|Urnz?WMfWuBZi~\aᬔPRw^\ ^~ؿƿE;$@ VE#aBW(dX*< .nc_lOteKlo4-Fhj26~#a|9}.NTEt %ndNJU 8Bxr!"fb[%fݗL `BD*P}9gG,oq>n$h\3:XЕ% w_JĴ)x{6Tci6RHlLp@8phwFqV&x[ky3L?*7DeŊe:oAc8HQ露fz`a"TQK_kqV U\L2:vT]f?"h5be $+I'uy&ĉ*m]90DQٽsE*9x:'dhUB?{t81j6Am`D"Pn1J#,WU<놸#H4>tHI.47ӳ7Ԡ|N>=ҁS#.&bHُ+rN0 ]֯zZ5պD tI}2,j11ȧ6MSלQ2\cE4*Í/%AZ+ oS KT߾ >2DV>#fz̓iv)S݅~oT+Ά UJ N8)m` GDd$~b­K \ TϤiƋWL4UdF5H|j5{ F.0  +F֑D?祠>'thB92PӐUF/;I[l^Y6#s͵V5M6BNcʺ>4RBo{w&$ gOEFĬeE7eK2Ok 8ke/"+)|sQPJ1NxK! 0H2})Cqկ?Y*3uqRbE{0P!QqG꿜`\CSX `v*-svYPq1[cO,=DxQ̼9*U=X3'qImz $U{q5OFTll06Twɬ//`3-҆{b59I|<&RV?HpAZv9o[u`0ĩtY%j1/<V\o4c^~x義1#K4C0F?-+510Ӄ54VY0@ aϱb8;`9:Y/)7fQZmNpU2PjLh#D6]+VnoM_ f#v,W+Na"e8eT}ul6JLPgkm?(Cu8P:L'f Riz"iB)raa4Bòu\e{"]6ֺ֫È'v{@w4pZYM-z*6i44xH7,IǵBӭjea l 3Ma3QCϩ60?s_14?;LyjuEtk逸~! ?F8:W 4Ż jO:b5(=>X^<9(@^1q@ADm^iZ2[㈩>GvNs?!ryvc s ǽMgCQeǝ,`6~fu˽K(7r"x X^ѱ0EBG*ΊL>/5ӾPﹸ3.,M *qkh!wݩ =PeީP#&ƣ@%.)HgMRPR@⸿X,YꙻsɁt Ujx_cRq[% .jKTW3R|ނ3Kogü|a % Y+z"ljc* qHGoҧ!%rc  9m#C;*Cߝ:;;Ȼ1IS bDilv6gD HbYʍnF *űO}'$ƽFl9-*)F<۰xj㭹ux[zVw{J EWl@XۇlѮs!Aޤ Ν%k6o$&gEdҘ$4,֨p-kTOYrÆ E+&xS!)Z>QDOaA6́Pvfd =M|| AXZ^KݾBn/[c.]1op U+Q95A*U qKkԈ6m>U]-~*@$Or~` I>AD1Ȇ,Տ<%O U9 w7g7Ǽ3-*.tkaF?@ab3j@cX 0Ge;k#6`7>$85Mvq߁ZnAqh`xq6?^ĩ+t1NW7ǘXY+[ṷjk IZpTeg{ 6\ZSZh-T,A)٦sϝj Ɩ<0跽lh~OeB1X]m/Mf\۶n we~_7anw H(/vj+M* HU CȤG׾DoH眪C9d^1?eVЁ} :_fPQb{T:GJUG/_ |Wyn\0VaiUiuDJU)*L#$f)٨.Բ׎CE]OAƬ){qErAE(u2a 6##S٪ j<l$0p4-Dc ,ىce:c*5xiڰ]gvHQ}6sT}'_i*\ Y`"炇ӡXk;?e&QnE/ }e8寻n>(hu~O!K(Bq8~ij534pO]qd1 xu Z!_(ↆ&-}+dZ2,ƸTg)grO} y+l_biG9q鏋K{%}~=b;}q˳ǡUS޲}^[9e\a>xiV}X'v݄Uwy_@3GDN3 :Hp _5Ì$ΰI^1ʽ>2Vֿ lzcpOgɃ" 9Ԟct<}O}G2]ovmw/ژO$28!6εp XCHM_[̈\e59H\ I4Yവ/9-OeT71'>^)v*TD,F{tM {}ѪU5G7ŹG04[}}E m>$jA Äc9Bț-m+Z3CCZ@.`İmQmf|0L\`nqPPeS{C34<^?i誥]hѧ"/<{D Lک.U@)2(Ɉj$UKd&A0&G 1Ȣ˵^VJ%իU VFe[aQvҨӉ%\:BQq P.?RjE1Q5]V4dRJ,3B#jmHH9zqMD&|-£eȑ Gq)ۢ]|lT73BzP؏~K)CRJ!V*3RMM~t=Ji$bMp-Kqlapvm`BOֱ͖_^wxr&y ? >YlA\ z$)̄dJ`Xp6'q Lbw1 M<򝅈0"}ř3e7ʸCEAwzq5ک0hͼC.U^U]Hu~}8K 7aV:F=xq4UUsâ9#XRR7UοmAt*[%fx)yߎH QT[qh}?Kb-nPrI'>5F(ZxY*4L:4+^Q<%+[| nhY3 }Ҕuc My7sa3f{-FJn$vI7O ҳ67J7~/Bs7,]T*~&~Xj,R~]XYU^vG+jK(}TXI}+Z6IC z0o`QMrgfgFh^ϓ$Xg¦]:&b`z@5/bR:?5'sD4ewr\"*T\RIr'yeO9Ay2;;ÀV/%OGxZIz_ t{S ]'T~>W+܇gm6]@oqn[.,>vն_2bF񹝱A_3{=G*^2=Yt]D>sHrfY"qd!W @ rS??|\9ψlf=T|RA' x8 }nOSv5_]z5y83˝k+IS5:#'Wi+:sH +\n y[ZﱫIy xh Y8wfK"v4Wnb?{C YdTHi鏐9 CD)iӜ,BΜJ["#A!po<0VX@@@#tMNӑh-SOO^m(.eb@ B9sW*cr[`zذLCOdq埱12u݅$>۩foZx]@1.[Wb+s8w-}S/ 6Xq~<_ʫ_ ~Js q8DW(H߰ԅ;^Ĺ"8æ9ꊌ(vPs˃FDEXՌNzwDw% *Ki)w|?kcReD Gs uG4TWgǿ~_# 5\\-(u^&DA"JGiO7wt ́ͿdF=']-zŠPʮ2]p0aqB!awZoWNtXko[BH=d>}6 h9;| "-F79k;TDi ^68o]BA{LhEK= N3sg6YF@쭏 8nN[,cE7lyѣh) Te:%Nm0cɨnѠqsl_&QpE խ+n߲sϝwN+= HDN Fb=H ڼΞچ[IvuѼ9Kk.*"׌HcD2)iֿ/訰bcֈ[= (siՂ$p %Y!Ȟra7Q`Ξ`%]=qrG,8\b,XzG4Wy?O;r_T?&/%IVD}dOzev4:0gfKdV7xL$2ǏEH0ql~Pf|QxN-4uשJez:Q`vйnnʴYkbыk@2Y8Hګ$NZ$f|&hʋ@#4 z #b1/A3i~ŝZ/#iU7(}΄b[ Hb\,Ul*8"3AonWгq`uѻ\e-;g{W:,@=xe;ш\)nي5!.n6aV\h0bck\Ꮚ"Wذ?g6d{?d Iwh" `WbT>D ?݋5[dX^e^ɉGf»@ڂ\r91)48w9bo7Yǫr_!+J\ʹqN O[( RC0ЮK*w{0 L;(bzi5 mwd'<53-y6(F{Qb (hXH8 8t>S^|f2`:+B6PlGt.8_Ěpk: <[.0ÅAoEBvX~ZъVM䑰S7[~ b-+q95 '<:z6zud(f {9:,$HGnw7#`1"*+Aej6\Xuȉ.l]ڗMvL 4kp@K;L?ca :O9Ux\F>~ҠYڮJ΍JQv)3-_'6@kSJSU2/MmmgEm.2m[- TLTvX߬z%M rأĖB%A[*UQP.FdAÕ:w‹dh~]D,3X9@V|=6T'Zk6=X| 05ly~^K%#VT|L矡~ {Kſ"ao Ŋc|* .mJDiKS#=aqyқԸLFMiʧ pU5b0EJ]DkxJ_Ng /+ˀ;M*T([e?O%B,{Q³EBj":.WoooEU?0Ÿ%(d'Z5Rт,B˟^"n9 ڢ\Z[&8Û B;-;ςbKV"g=Y⽚n\$0ůFGf,H0Ը-YP{E5O@{23Hu:X#rΤƣ1qI?D}aSؠa6TU'z( a\|NEVu= U#LRl/W@Fw$7? g,y}1l(jŃ\aB16˱cI gNBa&7 Vv{| Av()X  C4]f+%wݳ:B!{HZ\<4,ljd_"AVa u?C%b"hj9nYHą&ZMH6> 2vciYq@%t#r@GƎX*Y @(XaX3cs,sOiQzX˯8ŘÐ"~vO 텙NRc{TNlVzg,jܝj1ߗ63).ּp Ea&x >3%!p|ZRSC0́ނQ}TFRlN.{*?>b;q[t0ΏE/_P#JW᳨ |zNjmxϨ3Աc5gh&x鉣+P> '(hH.:0B}x|U+F0_=䴕ּ>^x|2Ipd|) Q'c|&;ҍgJT?@Y=qF=z C~+q_.;0#Uw!y" V2lZI5NqCV:n$9ū`:jJ+(גa߅o!S!4WxwGyrRY }C7ILo^ݹ:}].md93w EEbxv !J0ýgl?evz9fL ǟ*R(Rkwhy)"cgtYkJ((J\I5 VLljrs SZj=_.Mp\љ$fEwIL}%Fq vbaͩe%LA _g] a`"fk+9npkY"951 Oynqz![XG H?u_{пrjENE ccqgDNLNAv%DBs M(.+Yn"Ӑ/J$Xf# E]uyQj *r!9ha;W3TdבK!lW:Q|YC& C})hO|muHa"Y,m }f~?[iJۨZ_,t7, `2T=)$U\\!ڭUt[_F(LJtY p $e66?o>֧oٕXp{m#}$B >Kǀ'%sIp=EG{ѮaIO$@7e'bQ4"96)#B\SBC8:Nơ9Ndb(Mc|RpTn ԗQWC\-1 X] :?&A;;ڧႷv9ƽώ!FH)U]xSd׆w Yv2;z/i/rg{qwdeOfpߑf4#'زI3r$~ئCkΓDC8.<3 |Ccs~05%YyV"+bx y?0Fȹ.؝\W'L|'_97J\ɫQωaA1\5hn$r|~_рYl\9kT6$=s0ֿ lԶxwh1jz#:45&UyK' ]1v(Eۜ[자Jl\m'Xb?{,G{$`)=:1 2hۨ L߾&( iͮXs/ ںkfQ* &dZf,^WͶ>Bl|#WB! `DY'$.#b@i輦S@N`z~8TWI>ẕ Ln\zI/,+vs\!% s6\~I D';k2իrD$vĩ;oE.D8ǻA#zFCWDg?@izqs~Ɣ|'Hv24;n>qV_ Y6Nۇl1}n͗Z2ѱiz~j!-I ӭMfuCyWO`9#ёl)Uqm=)dj` hr^^߼QǓuG $oT2gnlmD6e+[m J86ԾHz#g}6aҥڙ#sȀG&} GI;'5sU_=iN: SVdnH 9@ -U_KA܀+z+腆Z fvzM_Av-:& ԟ80"[/ ٠ ,nnĝdyQ>58 RruUɀ:},nytt<$Jat\}VIkS@X7 lWU1[ĿaUږ1Gܜj$UJL2>7(Xdd/(S@OM `3D=~VœXrz@ݗU7IA廀:HC"nlk냬ⶵ%MK_@ɧ8gMZt-ެCAkX/3w?|wN0$i6W5byTE/]&\t:=4 58(^V 2fa,4};mјE\J+^B~2Q R0vEe*lS mŋ"<*{?z/kVk̽1?Ux`~fTAzb3wu vTU):S÷Q:#6yIglh B&1MؖDWZGOV1”6qr9#^FTMb?ylH2D b(}w9S7БeA+j8deqhyj)E;_&|s-jtRS`v8Ngyy SiN]ɅrDsQ'"ZsV\{Vbksԅ"Bf~>Έzn/+YɺS*ȝ\!᫓$؈ĩng:krMB$/ Gϯ%RZ ( ZEljl=xz۱ymC#W*/tϮYQ4Gہ=+ &MQBf UGPchqI_<=Eh(7(`a1bLM"m+[dWm> smޜzfn Fݧ86|;uo!p $R@&OIy?|$փIQJdwxY{"8=<ьƙ$DF-ToR3!FdgA>OC&^;-z6v-R|GT-al#ˋoa\˺pʡ,WR\ a5A'ɂN!CH,s+.˴9XwGߞih*5k=DطM+}KF $L-O^opݯ Ze#: aٷW&܀jOl,:wV{# lͶo;u@]jgHLl6BrO'*6PQ^;oQ6Ϩ%U^mS38Uf ៊@Nr@Yq~#u @]qE ^G,ɜ-^dW[D9n)=<,h8}}26^Kދ A͟o'|xӑno=U|2u,1\$n#PjeQ{P1Nr`A奞0.p`[?<8HGcێ6uxy2"ުuN9_j*McIH028)>:nɷ;S< ڂJ.=ƣ[_]4/LJ+Q dZ0v<6E.:Ȝv㑶FZq3SFy擙_姗G'r+}Eg]|- D)2-Re&ּS9ՁՁ%|H+ 'f?qB/tPSN[rKBPQ=Fݯ<2P .e3QWXؒM16e .Vٓ "цQSM> V1YL>&0/Pe"aO RvF\9(*!}SaLDSݕ%(dCĝ7Ȍ#\Z qhXqrW)J-u >lJÍeR?kR"eZ\YKF˭+WPTW-q|l³%Нx;,LgNSgLG ڿ'P@Y1)$]T-d;C/5q_ +W~xN|f|o7ZzfM]$+iB )f S\Ig!}v;^FGƀ%{aW:C7ӤafvpU0ǭ<+bBj)F m%0- 1`zq8M?ߦY$TBP-齈LLP+h"n^N?攲69^N%fMR)@į ,jC¨saPF[4;$>߻iR'\S$)Dpw;GeX]m{Zlu*˱_zscٿ-6V2 c1fPer4C|GBx 6(9SU1SDw7 dfTsh6(^{6 [5Ymo~M/SU~|~y4+p+;-̬n>4Ք %^cN,M[P}D?Nx Mle-3$|1[AvIo`љQ%;HfdS̯3Aų[FQ+(1W>)WԣHjZup,LCt]R3M Πޏt\cq%`m4Z'9Mq Bf8UJ~1Xanuvۮ2D\U8)yol5O`.~5JH Pj ldk{)pі5養\*aLzq;k{ @`s$ԯX>2(_徙 %fL_H FeI/\_2U} ǯ*o!XI}@]NJҽQ!'u7*7p/ϩqbTv/n[ .)Bo^Qfp/IDn)1}Gj]?=nq 5!}oSHN|B#f ȝ b^L}oz/GcM|pyqO)h|6apV*#%3`ͺT(x/sڽlʺ@_8o)z`n |. lz #_or 4! Zr*g 0 Ɋ8k`يN)bӑJ.<я}%s=| @>OC} 1>p;~. wlP.9 ZuQ 8HہuҕAgX*у[cIK J{gŪ̧{tHB ~1!|I%\ JхZq# {ۙj |C||ZVǧeqQxMTS cxJxN+ʢf"zd {Z-O#pۖwZmmdjeF'czs`quR= -J+gⲥT{96Ÿ.G9_ד\qIʧ9;;=jŨ(_e3]w"<*ƭJ ?/viLq5{%gqm`*- Rs9t6̳lk\~*45f=|u5c̣WP*y ذg/5$B@֪U~diֹv̀Y+r鮵N@e&LiVP?Xfs29E[D@ h*o'$`|a$݀!sCF_k؇t5H 2k^$Ƹ$oR # >[1cUMl0;^*cωi0Q-{iGQt$׶1@z І|−WcA ЕiV]*$`ߛZ+1N$R606s)6T*H(*lچgLFy?}fy2 {(fe) oV{A,; kH84qVDB?.[kcM0rz_ Xxʬ/ZŮ ,*kH%K>7Y"0;7urk{uLo -ed)뎵FB4ȴ4k%`cZ8v _Rk5. kGбyH1~%DBެ_E ǧAp(0vsțf E5?,?liͫ7LiW}vOr:ۅ{` ;{(|ܰ`Zro dF1 {yr-} 2K\~-T&1ۏp;'#[(_s Ȼ}z|Swwe5޴Ue|u8xHWY/AymM+حWi:+8W39lOR7+!s륅&/"}Ch.!ZXA +oE>hώZȕeY =RͲKWmeaMi!  8@e37x [%fQHqRnM4Ȟ!7{6goMN6S8_-[(7 UJd2+D; $X==5VI1W*sJl;E$sVشS8.9;(v 41W9!(:Gj¹#975u؂aĻ^믫Zgy.-6LҳKVy3~zz|^P6g%7I s 亐r>ԕGx\A)BS1N"B㮝Ê7D0cZW?& %/el Epmj3I4^߲)P3 FȂR"8iAZ+g}ʆy)& "N*QxGv3dRNI)UbhHg=`բw\IG3U%Qs,51fpe΢~R& O.YM#'IЫj`>?K)'y"QZ;81Z[X4B |~dhMu<<At!L$~T:ٯ ZZK@E/<t*@Qڎkc튌20r:d"ӹ}U=تF;p8*QbVNڟ='T@a7e#l,eBoHbAf }O2io+Ŏ}O.J4 $?CfD}NvG;|6: ٷ1L`x{i\';fnHxk|Wb݀&RaU!_ nGu}m5[^g( _g޼9g@p} /'ǫˋh?quU×6WZ$v`>ۥ/ˋRސDTބc޿r| ]JFSCy.hf^ KN3z9jݥQ Q-4_cq~YḦ`LTOďlKKwcЏaH0jICH~q,a$VtLV3QG$-XB(بv@%Tb٣9]>_'JX'Bā J]5LhQ8_G%N>$IgT\)I˗}CV_ݢ^ q6esNǨGAjqUJQf̨O.~]pj%bE|fp*UeBqoS)V2.*:I, f&t#Rc}j\РNw-H:h{/ |kwJ.@6 );c':y5}zCfɻ?&ܱ D raGri{UA(Սo;9] .BLЮ@~y'$uq-Qƥ!R<(;pIع7vPO_χS}'O'‹'B%N7bK쇕"C -A-Fk+{Xk4yC "yuvPь\+&</FvҋU} rOdځY{!ܓ"4O [N[TĔ_EEƬoß4)$$v83`,|i~Lڇ[oNQ1O'yЂk?%E~w0ɻXn|qtPbŨtGb+"Cd LCym0SJ.AO,PowGh0<-mlE&дAc)J>™PX~i+/>%AiU׿sà6s؝8ZlM4elѰPiXnCGr0|1>MUlW;ZQ6-F;PZ[n|@15eK3b԰A}F2>W?W 5'sЌN?&Dϕw?ӭ `13'&^}4* >tJ%&[~x [=e?^ w?xi=yeίWh i' 9wT(Yq?w,. x*DqԮv ^@r4T|?UU#17N]C37 ~H5ͻQ6Lkń Qa)x{m3Q1S=U|[aO5vU6ݔ@-yjСJERMX*\}]BCoK "2F u5G2} ƘG{x`ϑ,DH:>o=4EoUt;Zk 2 I/X:ihJ=4j? VVPbjn@80?o(t$$AwHv"5cH*ّ@k҉O؊_ܿe.,J*~:/ѯ526=M.@j$Vfhv|7,v;eACz:Xe% '-U. <E[.oKnaٓ/"21kv UN QE:\>xڢRs Pgx66BwD 4Z)] ڪyqu#o5\bVi*a^iQT[ZzFVƆ-vd@ Dʃ ֆw؏-p cJ'p)/."lMS+וVRTh㷹 lmsR[别r@Ins2Sҍ}?;ɗTc!!H ְxM8Pba0?P ۰Tm Ҙ 4ԣ^0H_GY&y3/Cja+= hrtv8˦(K$ `0&kgEuE&+lx_X.ERI8W/^=$eM:ഁ^c)vIfBzTAJС 3FYvOwB ?BGڙL0D:>lom.k^G_C_)Ԉ3'G|"b%Сv8w8 2~Y +q|9MbYӽhLLW@_zfAbIzmmAfEܜ@O.3\։q)U]Lj8಍3¡;HI9"M.0VG"RJ]ՂO`8(J몞0[5f1'NA/X;t\ݩ!E3%loOYdh}2<̄m<8b,S Dw$N A}B5r upg5 vUu)ژ<_! Q#QvsD^O4<2\׍A?tXXeZϡ8ݯuWi( { DULݮ >_Gahe*<~-6[ZK`q(Ü* k# (E57P~a6$fZd5_3^?$K/եO6/s Oڵv38d9Z#;ew+4$nUW.07ҿީb`1C1g#ki!%=߯'˒/mGƵkV/EHҎy=}ٞ JL5^bW*/׿DϪx =i% 0DqeyHIY`5`f,{ ĎQ?2]M*["KO s*;N}xDXvX ;N[n qɫQ!"Fk}0J(+11vӓ"r6w<+&FTzr͏H@ TI._ ʾ,t?MPh9c[@P(tb<LD.u GCU9pg:nGb0-g$5D'kG -aơr{1q]%QyvF>MvQxx]oLq&'?#\#KʟE /s3Hs)bU.(ƈ6G?< uj!C A dfS&<XgKUN> wڸ6[&k33jhdђE MBU{{#yd@X[)BR>Ǧ vsGƌ)<Y̳f{o3LI332DhJCP( ӏ nN*޶&(q6*(?6"*t/?ZQOi=QEq &)@#C‰+f<u֧HXN=r/m&E!BrO|ڒad{Lap7?&6>l/% CdzoP&G))/!#+~oQMi(L6r޺a`91a+~B0&qWr5&9 6U䶭Ұ=N|X)[EY֏E-#KkG­Gb6Rx_?Ây7rMNxp,sOr}gѮ8S޼"Iq(@n#JXx.3 B%%='p~cfld}znPU*J&y46l: - 1gR߃ּ2;0L /I%=F헭^ z* oGAvt47lA3w8nevV76. K!2<ă爙РˀqQ@/Ձ 5 j",WqU 0եqOpGGaa{-J65/&)0"G7FGȹLn(d[MI`B:X.KΑ:غЂ]54x7r?jO7sbC'JL V<ԯljC΂065#(Oנ?L;/ /lNWqyca ;mƭU >QC"). JgSP!r'.bz [m;j6FtV&Ťr>$bj'sHcRJڣ"xi?ʚ>ݏ Z XC c.820,p>A9+gff\=0ږw}X!HhښFk7;d" upFmD^R:#6O1ȃ~$K6_Ҳi!~W. <JCVkBK~Rn˸y|۩bzh(q-t %w@NE鐘@&` ɟ ukP|ક'].\\~Cauaq@#c'F;N{ˡkhUU{t;\9DOs -"o]"gZy7$ B_ro&'Ɩ=R&X Nq2ٔRl W5+s*|TZܿk̒ =LO&7|ծ"si|֖V"jcJmwMn8d^-|nzgYg5ڦeS8n (goN"& NRRj8-?`vG9$b$-riQdZg۳ʟzkcS21-;2"+8^Zͽ^^r=Ȭi(<5&VӁQ<k7.њ@!M }N;~a7I; Ef]1.qC> )v%emgj ؊K>oi#8)r'Zs-fX8K'LX 6a |JCcEV% t[A?ŷ] PHT 4*_Y=oKᘻ΢&PM촒Wl:k٨|Rhk5 Pӓb7)sG׻iguWBWFy.Ջ.@H#mR`aR춝SxE$] /*4FTƋnΠvJ 53%"N=wBވD:2Gz\~# Ú:|/TQƳS1rJKtS>')xGFNPD})V2/y&Q AtszO<)ð>s`uD!CbT?7).N0UM"jUg!$:qe7^r)Jvi:#p;iةKl*!K}L5g-3Z'_[bV[v_p B+#d$Y!Y-t~ѓUdBWIfSS2% u7Jy =u M,"慥jD7wm#U!qYCl]ҷxf: n{ ?aDo?.txYsvP?4?! Ey 2E"1m%pQ*>;[udx[#B-AHX延5ɹ d W>!rO: E*sD)16 ,. bvrĆe=͇R =X{{Pde!K/8ڧ6&癁D}$59Gu: G,_Ύc54,K Yޅ'm'Cs D3E7SG5I @Ry("DK=8l>!1{ {%_ zbPը"0;g%]1º oUʼt?A qt؏iY5(JڰqЌ_(L{ s"ĥvr+6=$Í8ԇJt;3$$ ؆خ%0U{xeji4|uim0`n x hI B[uW=*E~h߅Vf𨖪9&O {9Cs,HLssD`$Xtdv/!/K0}Ђ78>+boz?.bh2nU*G +AαA1>mw<]R g. Vrh cC9.@ևڑ`jROMmpl{|{0T44>qC(IjlQE X{YSIoE'@g^࣢ a/\Z0ӥ|] mXҏ x#>OyrM{6?+ ՜OAq2#4ŗk~C^3.yL'$+OЃ=q#/4ᰢ5s%lq](Á5Hxgק[jz{dQ"]Ƙކ{C1OБYgM-!I>L*Oy:)0K.>"#`quZ6"Hڲq W۷ɨGw.Eq%ז72/''/UhuR",uSGzHRC\-em"C;nK|gp+~\vGN~adG0Fĭݨɶ@0u~VvNUs< tt4|^\t#yS,yQZԸ} *(n%h Z= 1 ?s>vI#;܁a9~G)xO![5R kC<2Pif+ /WYcsbލAhf o؏C9x;EA;u-b٢J Mı sKz,ns1AGO dZצVMppOvu$`YUeC]0,֖5h%v}; s Wp7L6̸)far3xOW^ij}LoF҂vw2!{e)~EŚHw_R\?de܁-58gos"*3hC,tjIt;<UP%J{e܎ ʕB[riEwic]!ڶiV,*`|YY.\/3{Or7/x۔ʱ=omGU:72v"A|ڻEn7B}"$6gdm =bxa@= Ti74]xNДZy[yC\X0ŁF/n0СoEqZKLjU9p=VՕG3yCއuۯr(2[,'HC T|59{W&zJA;\s!<1#af#E݅9ـ@M"?98ȋM\/: pΨ܅$UNO2,[2n)tQX/ZMI{bMɑNGy籩9z"&(Hð)ؙ1VJ@f-fp{J$:+55ϗA%d02A#9ui&Q g.Xrդ$(aS[;P4:,O&I{'=%BI)iC*-5*d5>b))[>N&f , "p1i]cEMwtlȎifRj|a){E!Q}ND.fc| r5RŇ` by}/ӍtˆF;Z͗@lr}HH 8gtg?*t)~H, J;Xbt-z8RC:7Y+0GZd$*՚ ɰ*ZW%#BNEmG+;[/$IEٍ_dT$@R nS0TibFQ_$˔Wh4 M;6%^=`8deX @]<́n AP?Ch4A#{ŷ.p[0Sr lq@-Eq{#ۄ ӕSfvg.X$|ĘmN1`7 .im?)̢zwכH'Aa&JgqI)-/nk9.UlLwvU`hiu~E`gN_gi(M_QZzcG6J%D;mC G-,XSFj)k߈K ` _, $Ppxlp #\E#)V]%,9I5Tb1Q^#$B &*HNV+2{r5.w6 H0/*1墡=$=0Zu?DPYڼ2g^@h)'~3q÷,@ބ1-v!Ә&b3 IY9fF>3؞b!~rFJx,LSx Ѻ1w>#EޛJ'g"xqLZ 3QG ?!1QJe"x?}?3b}Sn}WғYP&^Y>OqQh]CX ࿺лA$َd2(հE``Vo.lxTƪl^Aؽ_df ŸL4I)9b{_$!r&^ZsD]ǟ;!0#C⇌DSRbe̪mI fS7 EN6QTn 6*Z4qfQU>9}ƞ)R6`6=8sSL.@Guv?'&Dg`#_ JD}_pC !YDXX> )#ۉ^03%&"&$:\Gdb%a%$_P7iHY^N6g ` [Յium04X}g56)n\$}G/(e搕ΰ-=ӁqX>+|мך<CL- r.6k@ϡT982r OKS-h~/:6b,걢~R%[7;x2d+DSˠXNDMpqyQX5d9lQk4)|76T~v +$Ӱ7#jfzYxK77G>RͷH)]jQo vNqᓏܩoEŢuMk4s0@'${Ae~7~kYUչӒl+MՇ:9]@l˺>'[ MВD@/լ^{B$[o|0?j)`pySh=Nx(PF?;E=!6KY iXzȒ^ ;6Q'o:i9)wPmo_iծda ˆ4%-r 7McE>A6TN'"\a^PJW_]cڜNe. (!{bv?. F%\)% Dx*31TaGj,8YDzkT U kf\2GxD 3EG !iz6jTGFu%~T@Fxm^IџZ_=o륑#f%dKuғ,&N$FٯeI%I_e_xv} u{v}b DT{ .Yվ̚ZPw /Yߝ<-{t\1:&rV>#;"I VAݟ 溂eυ_O0 gM-ܹJ`CoCivT0Up/i] Z9qhיU󡤢 c/-̽i6BkܗFv"M306sܯҲ9GWůZu;GTh7ߓE+z{'N=n%Ï'zxṛ8f"~oL|;yҧ9ЋFѕ-@j2M#i^? Nƫ)@%]眸lYEbbŁPoa*|w>aT5a~LLNmxmy8uR /pJZyDhXxu#J=xs|U~iV@A^ CΕx#ƃ<PSt[$OEm A{PN I`@KPNi۱Òj= 2WzTٹsP(f:} kViC3p5j)]ֿ$x]gL4K+Is]R_#71 j f=/Bw/p)$¸KJH`(}ԙK W&rOD&·F_ظL=JR;~6q#Ҁ*,$~|ŗ;Y!nVѷ̈́-?h5);dUyDJV\;ƚ>BE3^Od>S[24m+|: {jl?X]H B*q{s)%$Q )Gq\Wr:pV4]S&߱PٷRlM a= -6+.ėk 1=ÒNCMTm,`l\e1s0 0wuo.}Dmz/An] Vh]f㮤ٵӺfFI5T܂)9;*cY6֐fh7PS VBd!0d'(|5&X8V_0J1U}?D`,g | ݂yIUmT( G]HE@8:tmI3$L(S{BenӗOH ]kl0&o/d.ƥ̖]_H #wM]J[\.UO+F,IAקOrbR&eitqlH9H<'w R#*psO60 ͙17[ET.Θbk 9NZTa& DÙGq!T62x2dSYD9)#z753SNI%Ԕqfz/J>*? A7ZzJvk:9S+bnyl U(4ux8 BN8:`RF%'w},2dn)^MH%+y ¶{I3)ɢN]]r0 Mꀲ18]΄#&x)0$]CKr$C4{"(xT>5J 1yizɿpk4uK #> t9 lZ 2l8nsu]MfY# 0-!LG/Z IGđҖF3!}9" N _dNTz]'VV G *F-$:R8Ǵ19o9"XF 0\ڄ.- V`\¿ ̯6yƂ#K DbOx,'^PS6ݼ]E8tr R{CLf*ճ0\`>x]ClF݊5ڌ'6E_87m6 ^ݒm%(;{Ec>Ȃӯ f,tYe % OBPx=py h,ǍSCVÆ&YnD^V,{ 6x MMj? g+_i]ATJU^s,_|<)ObJ={wAy;g*Z{y&yC4o5zQؾ@"v-v{Lwc= u cIa)r1k*;l sPZfJ$1LoIF2B6ЀtZE 6s ՍY =r:&\4WXdW!sSPok6eozĕTq nXf̍}m1GśT@Lfkji0*uM4hqf.Qb\ g^_)&= sT,Ԉ!|-ӓЌUh )!%)8{H?ic[wd.:o9J| ]w*~PKҨCŮu3MJ%E 7R9sSswPdh+G"c`,`׋+H zoI_[@*3tP3z+ttwͱ;ӯ]Z8k3u1~c#]eh1aFz0UE}mՖMZn( -:mynzcVk,WQJzXS& >zv b=_߆{X&+ 7T!W(1hSVSd%B2cP1`e:yfx]نƢl, ߢXmT&$LwSKrLaG4 P qa$j^,n*4Lev㙧Ԯ)^&R5s̈y@w|@Hu`FB3L;^(,S7ndW}@Rpфv[-S%[ŰIvG'Ѡrw 1x>cH+z{p[@#  1JSx0\#}6iCwbB]ru'R{їn֩j<3F!* Q)<8Y9UAt=֦?bv7l^oT" lzWE4ofľ5jj̤Z"UӑEx*09VifGR~KAgTW x[d['/x?E2=ebE7TfNi\p0~URJ+hLfL",dԺ-͡0o~=X@Q?`õuz 1:: @+v gA]*u$QnlP44lxQzlN2TXi܎nV}j֎3*!ΕOM3t+kͤ6E oGUh'f)޼ Uу=\ '[\!ISѸVϸ9G+u(ե5B@4/ތVx>>߁"WlQݔvYsG/#fY(X40yRfsPLI{ .%FE m{=8{4;Sraq bY{*xz/Qq.4h[݆&3J;@mnvÂɦ^Y淪О?) {vncD\ʨ.KY yo 3]=Ìv 2#ߕۧA 'CbT. < .ϷRq l={ idS/ S.׻Dv0ՙ%ZŐ`]/ !z!WRpf?ܯBPC cwuS[#Dk7DL7~qA[x/ym)pk Dߧ}@PyMxDƃq+8DN(PV| Tv(lX,mw,;gs {"ۛqqbVJ#F<}r!TKLqeKA\5M< c»=2 3z81^ҼNr;$ÿϾ7hPG}\T0%\,EKj=16iYUyBsETM -7J> 8ndv+tha!h+_:يv qB)k36 ot0˅8EcR]x'̅@t=s֚CC^o.'[7YFg'G"LY?XXgL;+ʂ2`pap> Kp CB\3%o_<{J5ݒ @COi X=jN+*ưbvBLOoP6W8zZ*&"33ާmG~ʢa2tZDO!]Ij0S@t V'6¾: N +=byܹC2RE|u[|E!&SS Pu櫽WƖ( \+h(u$X^" j:X$ NnE#j_xYQ K.mM}K̷]  Pf(nWp+JvxO; :_7bt ̓w- UPu c~@^ǃMQ\p@jjלt˘9:4j㏷KL]^)q6s Om_Ψ؜tM_[߻M?.\L<{)M~%HڨVo"mhP]My0$H( lOO?GqR˚^J@jTmYP>RZuƠh"jcC3a[H‘ոjZ6 frTL]rTekz];G=d<4jGN3 F({p{*uƲ.iB}t٧dar@T!%69z[coP18<`kOxw7wKbJ #|{l{׻SKA;/CDЛt(sPE<*&Zf \ ~ !F(-jdҩ}FtW3 QHzM4_Fi"})b=C\ipH+tX{9h딾C6| Ak/.Kom{+ӥ%UTP1Tq>&d^bwXef0JB}]vJ_Vo=aj\]eQgWOOSA뇈TR艽I>$l5uK7Rt۬Njco:J]Q䛺A%E3,O(*y$2>s~3Tqu-vXƨwol勴X쬺N'i qQ*)RshzkAPQCMUG׈q96mWqf(@1KyMy G#-޶2N[{&__FU[5s]@S8:3D[Yg"a tkqA52=˺.㔚Oڨ ֈ:yo[5Z2'FY]Hy n]mHrWzρz!BJkY;V[-oZct̬fڞ7Vg,GqA x %] ɇm V9hq%g~V_9e9䖔0 ?|oJtw\?#b~hƅD|:iZg}7[ƹn_AmFv=T`afe[h-Bg o&KyVUe}E!H Tz$0XWHW\0?;t/&)+ݴxXY&OiUN/]ʄ6"El{iT:0Tk[kO4'ׯ*2IhLD/ᔬ enxoܭSZnDO?5)i)X' 7ILϓM?‘8 G7:իfٍT).k~~~>rf9-핀-Wގskps+HTEz?kφU΃@<{TH!Z%KnK&Θ+J*6Ɋ%mlGv)^Dea* 6LDUN5WLw` 9]kDl0 }h<;ST@m1F/:ߢ*!NbS}=(<SCx{CP^&4e?qڃ6!pZ ${X WOObl ѫpɣZ}' =7d rH9Ӹz-KlF.U.Bz%M P2еîeG"EX?sO$fMDA~ @2VJ@CN< bZE4D mbښfj.IF?W ڄWT9ZlA'(qu(kn(H48$%8H+w6֞z0^u{Z %KJ:Ԣ%f1sp ?\n8*EֶB`"J ρlED`eRKg^;Z*%!eRU/* 8 Tݺ zBWG/39Wd#]7RL HL)0Sͼ?h&-%bJ/?k.|ɠLޔ7͓T C܄F"qӡU:}Btwe\w kVѽ$G5]SFí똇ڮаtenGNQr`o6ҌV?~o+Ǐ^¦ qT7GL:xw IL)Yѭ.8 ~"r).c≎"S>+4W)՛)xnc055m8 TkL7tZI~>2 <ޣ2QwpJE>[ I$d怜n=>NVrRX;0BCQeuHds"ZJsQؼ"<đuӜL60:~ 4-l>~l 7a00F[kg ŌExZ_s <# "(~zV^I3F+I4L|^#5rpOkKȼ-y_`*s4xk #rM#@IW\P&T@]-WH%(+OIGX^x._ SSUeygcZܫDՁl=&2=1RKm?VPva 6*郩hl> {NPo@]0ϕ^:7[08KaD*?va~%!ph SP^@oy;3Lə3!4K% <0kҲяf?Ƌ?k3PDmF-6 Y=&e1JۀkQ(qv '…/Bc;'nzoBhww>'~d +t hωOj%Jʴs:'j^̞)XϷy;ItwP`(Ԥt]I W}|T{ n9OXiMsw\B=ȪeӗvJRe}$ cE/0giiҝk"癳 a E).Ѽ8~mV"1  ǔ5`cp%=\6CLw?3̹B|XݑΞ|IbKK[&O7J%?PG  șz'۳J}W,^1XO8ID'_a TނfէniTG'e5չ== 51ϼ4Ff-cғ?{*mk78g ִmOb eP:|J)=O&Gb. ?(g|{#i%xuKy}HkEQ/ad-}sߊbɨ-EBO?6N"AekC%V]!5d V>FO:}:j(vE_:-ͱ0H|BvK@L oIس'yJG1 Y+ J{t;pibD 9U1L@b2 _԰K4:s]~M\eSD(| ':J~ =G(.mDu+5r Xr0Rgr_nzO|D;,vTPrRPlK1&sՈIu)i Y @xPǚLLϣ6t[V*eHZg4MD WyQnn\9|Oj$s$(oO8Gq+oϱKG)cer`]Ь~ $`9{*6f>+} 'X/ s f+%jϐ^dLH/4*&b}'PZKvjA[h7jQvzʦa3c1(=}W4|ĬRGe<,̎Vȓeʳ?TEbOn'8YIY3!YA.q{z<<~f19xa5^AKƽ55=NNbqvQo -UZ dEB_ڈ w96r[|RЈ¾f8֒J*M@(NA}-?SNCB<)>VdX4FϘ g'm~uEYB!9&p:#/m5ѺrR(XƆRxzw{mooDGYd0!(^Uz=r`iClW_JVw-@e]:pBof$.ЖgʒmwVbU%ދ ¿_a1@+^>~Cv}޴׺y'uyLD|r|5ԗ"1h`<+\u[r)˲!x榎oLbQrO1Dk};!|e5&'~~H=p`F᠞K?މo׫V ч = z[#BQ12x0N5V-ّ襷Y/7q ѝ¼l^o&N1pa.x\TsG%1uY]vVkij[yS b$Iux:RKe [/*vE|⃁;JSh@iKn:$Ӫ !n:%L/q ۘtxW*-A7W{lsA|Խ(QiSAk%2$PP**05݊#Љ>S#dLmitُ 0fI|!ۥg KѤZGңV>gSU$ ktAGz F;wM'(Q#P^hRN&Rْ. I ^( A橤׻FѝW9ȸ=_Z!zsջB͊C(fJjmߙ'L p9Q҆^=+.^e,JGӣ ܞĝBt[-jW@>6+ΗK=hr,^j{y$0<  *+Ci54wڟ+eX79W]Rs3NfSHLu;lH[Jw`Ӌ*c\BHͱuW_@*݋Q#BuMx=<ӂss~QJ%ꀕ`vCʭ, 4VZ7/< 횱~>l:h㖲 WY;Hʪ 2;OfMj| Z ʐՊEg*#@)԰]NBcMb;} Db[ZL.-Aqn0Z`lbMxDɌF8GQH^;ާEi<y1wI ͝-h6k^?`dP+9>^jɐMxm_y@⭳QcΌeň-("0PR:-s1D1աt w)8wyNx)W0my;ڌ"felqkӿCSMWwA"0t(O4׈X!d1Yfkm(?7 r3'wǪLy/C{G}0bl b˦;x?tO~L@BAtZǺb\\=(i^Fj::JX~6dCb>5_  ! wЌ_3M4uLvdE1C^dBp8gڬh!2[,it)s2T0@$;J߄i*DŽݢ5W %~_ xZihCUB%d5lbKL022]CISxIwxf~ kfݻꬰdFRrfyY].kq˜i.N_# #Ao%fW)k/A רU@xxeΟ7F8R/DX27?ڏy˿y,FsS&fNF]w)` #V\m%W\΃ sz4ٲ'˱@c0Ҷv70dMсC/h3ꩇ67E(Tb;b"9PP;P-Bo]d 8G9Qy(#x Cj#TDZ j~QZg{YPRCnE8Y%A}7ñNL^HVsM887ٶ '1Cy^cO>OС:dI[u? =>5sl"?8R{lﶾ-`7mZŎYDR8k .YOvGj9O˘rfeNAulQx7h:FdO݊~b(  \4d<3 :K'4+<߄ TНbQ; ^Uݔcl@ob,z=Od>=cu 1RI(h o*yˋl|x tyu>Gлgо7 0w?g. L$%3>3ŸUGѸOd3+ {cJ]8*٤ZvVמeB3D\Ե-x;D{3[4&TM-X?Bcuc3pM}.K 3Ao-E~'`,oe'mڈ윥;N7qS"-y 4Uo9#WYJAWEaCTˊϼN/:UtՑ(@RlBtƴ- K8@Qޫ[ /woEl hyPրs*.}5A>ڹk'2xwkjˋ,a!14YLq)]GL=/秒'9 ҲÏN Izo=9ۚj2z1(.V˅J9nRfA}_wuJ3WF#;ArX=nsQGgzG hT*Qws =W#AD&2\Wf|eH dF›x6Buv0i9b1a}WZpl;>-F ;kmHkIMU)sF-SB-ѐ |,Æ|H ֶݸ/[\h}_\j|$Bѡ4C2D^lnT6#^#a%<{L3`LrXV踡wec䐳ɶǻA72sP#sc] ;~l 3 d4HOiu!s[;yU|"3}~za EnNHdwo17'PW~DC qc8*5޼e< #cfo0J9?DȊtq3pot%N `5<'C4fF%i2'_,lA |9:?g$_zΟt 5r}qO* kQU\=sL/.?^Vt 7BևCT"V;R݀e!2I_,eg(ˏfW*;A ܥ2Ol&_~vΧFHq%ȔI=)Uw_¢ɻ{%+bEF6lԋVZG6 L=9mMiE&[r7ΤP\ܶWg$*KS Ss$= GMU]|vmf)Ώ r>bQ+Sϒn0,x tT,&\X_vRw|ν"FBǙ0uq(܌ƌ4}+!N`T{N8arE^sjkXrlrJHڂYC! ɷH4t-=gV&(E|0DŰ<:cejXwukƨ{6CR!㥘0[|VD+O΅NJP0 YԚ2喱 C/XD kԎ Coݵe韉ϖZk"@0^q=:HUj|ӈxF#e"ijhS{TsDd] !`lF+t hdV$^~[#ܶov>Ks@3[N{;!ΡΚ]2ğ{CEյN(V5Ҏ4 Ʀ\c_c¢[7ۜ ; X&6 DB[ڭ/w;S,95tK:eVV=2f/~t0ګ7 Ϲ:_b҃x xOxn>}?Tu*7IyLtPpM+N8~vRi XB07K" ^n-<5eM( G"qW~pK; *{5AYu_ۚ3ʹiӯ+:Z\h|*g8HZ(G|^}MnNQe,p-UHE'+N0bW4w|d? 8s "V j5(׍8UDYk:Vz`|y gê _nO~]U^(3-3PBsY:'4pۻN^|",.Uj? 40 B1R0ËЀF Y[v0tYs*[RNwL A4L5Dj)刽:vIEF[|>؞53y_ɮhg]o2zH 2ԬʍAD U7͡2uIWw2UVVg]%C19`Z Ed|7 ښ*u,6+ <[.*]viyV0Ʒ`dZ0V&8I!('pԭ~j֚gr`w7QZǓӟBraC~|F^ٔN]4R7g TN~%m"_ yzMW{)pOThL4K#u(:+ݽn ڕ&u|G ͟eC\%g]z1"1Qޡhg=u<Zc|Sa"wQziqyKSҤ#cn<ee{7Y%QJ4bWTS^QC.99)5bXqe.<8ڀTZ'78wPF'4f]I]sLǤ9 KOnTmI8n©{C.Re "АhQB7H%Q{|1‡UᜀkV3)7 FȴL-8 8ϱ J 2ayʗcҗFU1 n7ocSrA^v!PeFzHFH fl~U `?3 C׻XP,@qޔwiC~B+^zhco4y]gbN"aGy[|IU>u7鷎纝 N\9(Г0Xacrv|eU%\ @'#t՝yaqsí6ǰ$`x7}Y_P`-KU4ϲҞBN4'rOוo2l۫n}ecT/7 1>Qk<@bE¿+f?'P#kjd Nl S ƔĤTl{:>KjQآRJ6~!p6֙d խB"풌tmpb`+OƧ=?^a$_AbolkKV\.x(tȧTΊqNt@dHjMWQ[Y)7ة#Q \½tdN֌B$?MRq&X]!!QҘaO|H,lj*Nq!co}6S]xHi 6^(.{go=~jq_R3c:Ob3P-F= $/ˠͶXrah#_nut}&>p+i]*5U~}2W@_C-ELVG :o?#k7Q/ql,ԏ퉊r.']ٳ*!]j^cH-n1poKiwmYs=h;k/$plG/:} um "jێlXˢ8u6G|{?wi~Dmѷ0xAs `L̰%]T^5u!0g[+Ɇ"k|ZhiOlX%7)8Ch3p\A5&_4ָf࿻`| DXci<-{1J&q_Y=GFwhtw/CْAW(Di<%Y_P:N%uX CѕGlˉ+~ernL ݫYM,kx7?V۪Gr*0 1O>cd4>'\\ G)rgׁTY?dBV,M{*8s0<i)%J(7mT37C7Vl.9եr}F) c&nT-{a5gDO֙rsX~z@pPXsAeDzBR,ߊEЊxBY>v=`4 jۮ#VLb*:KIX-_wvʩčMM,+Z =3h7v`"ov7, ù8)O&^IjO(ٚ2lȭ_jUQ$qc,T: ii M"Maw˻:]?u^["I&GN?[a%  ImWn-j0&46U$-(xWu]]0DSkؒҁ8QNuΪy`csFc/;,Ú#*?ʭ>^z81N.Poygd.XfOPTy*r5܍B-p5];z!B$~x>BNRک9JU/V(nS.`aqZcaG CK2ZS+`cJ`o~!1>WQ"NziHDw)MDsOs6Рj܌ XFqR) 2c+~18?V/W{uDk=qԆ\ :}ޯ*m,ɷ8L]"L}H9m^PcnR$45X9|L_;ԝs>,@A΅<ġ+1Q I ],P-(ynY:ƢD D̺/ 46z8 82-Q!sYf}PbuWtpM d5)N k~ڜ"?9C=+| ]M'ZNێE#>>'`g#£7 pˀ)<7mЫY%wdN2Tn|둃̸p\ɗHxZd}``FޛJcM\YKLi1"S[g@Zг *#}AޘLĈ.!^ ӝwLn8\\kq*6#9Bh9r Wrho|t֚ƚCʌԴ;EwˋC tIpouGL s`}w+%>11Ʋz @bgl^%saLxΌyvBk]PZA%,'FͿĽ5xWk]yb$~߫c$"H#\d=f[ZWv #Y IQθ:hYd YGE0`R56 F,6Y[s}&vo(i\&b 11Ӯ ?WGggwK/}u?AН^*"(ΈN$˴,298^g:'^K KW] 8#>LcWc3K,ǚ-zؙ1B%ŁyDxԀ^iNdUg,UiMf>@]5 ib^2utF$HOos qqt1+C} -o֗7 31NR_fB[amEyxN~Mjpo[ w{ T`}~#GqJ?ɹM.y*P8gSQ?3oIT]= pKAZh?ځ5V&MK `s#o6 fFkecԟߥA>L(M&9G/wG0$S~ts* xZ 1{4,;|'CocƊ>&YP@[9%Om(5\ [%.8!?tW7רa1pIQ"z/*_vɗ*=)5147r1(;-ݑd;Y9ƿ/ Fle/e|O{ݙՌqV ſԗjDl"=;;<]rtفlۉS_ܶKŻUzb LeMJ>uR :YݢXkU8aT(/?0˟PCP9zKmv ǿ4vVo4w"3i;7.6˗t(E@au畳 <8iCWn/o0oXE!w:[ v)~.T#gI:4i]G@b5l=BO.E|rQ43ϲl EH~>)O折I%.FupmTuY*vnWwF!$lIk2Q xm9/p[ii+מ"w ą›{6|cj 2n]o(5T7UGm.1]4 aE+HFֱ4tS2y:+].(eM|p/jE`G˳T_/}vMO D*;juFwwZdk&{7y"{%X. ,RbΤ0xo@6I?@ZxR zttBwH[3Ӌ[~OlNiu4Y?h̳2d'MW2~瓋\ja" O*2mj\E ˂I/sYq՜]1OWQ֨eH78xSd=5u}t$5ĭpo }( OmwG~n1 ^Sc6ǒk#VpU2t+_K^v_t䏝1M`>e!w.y78LX/lbKF@ u{e tUAd^Q TȸWE|<+On q?RhQzn ݞ%m3ezny)" I:(@XCJpZ3Xpx`Ojݓp}$. L Q +UB΀-J2Oشiqɮ{K߫HAP&g E1\}KXz&w ONjí뭒wW&эUކ:)\w-UIw{9X,Wx"`‹YIHF Z9 O *9KD~GHH n·.NnȄn7Hdϳ̅JV`l-Beө@$ hi)^pJu2}ms4Ac ur2J?HZC V=B']4xg!dHhb+S6WT{\3yЧt8eKK  9yQfgB5z&,P5?U9.%ȡUת u5l3E{D440/xZ+<'((y. PuG4xbw VnNQ㲒j/C 2dD$,:t^GPSСqyڰ@?ܙ]e?>Je\h pBQ}tNyy2{[OˮXQ Z41\BJ2gŔ25F?ىw gT%Go!!Gk$?P)l*tB13 'K,Č9p|b#-)AtfnksJmf9KʱD}AF7)k?O"':3㣠YTs2Rsm>/ _ISS*y9Ǹ;~圍yOy zfсա2FglH+?e? 8YHqk}zkXqD~0ZrP `OV'd-`,ځ$Gzr.hWYiY-'yd!\zq]k]~~wD!Ϛ7+̎\YSk^[?n-jƴ_m )lRVLuhIy@ 4 2TST qa.lB?aF*gyw߰EI[1!yc8z} x?CDcnO;U2uyh&UKKk_)s`DH2 6`{&S5ƣ ? Pg<c9A^%0fUrFj%'bv) T*\-ӯ4PLAI~[xQȲc)٘UY"$$i]aVi!?^],>sE e,c4M[CBޘŇÝUFˆu/䗍mOeU vvNu~e EF}-_Rn7j$FA8k1]TesI&t/x9ʐ/SS-V뢃 *CyVxF4SXRvew֌l*s^Qtؘ;իu};Gh_. Rm FqvD˗y3 rqd,eq>.lDOBn̺O"D ࿆wXAwse|ikՍXfVS'wxi",D:sb#bH*4znLq:\T!FkRWo[,Bȷfِ Ch`Q 8AȐ]h"GQ$+y4kS6AbB50[Fy^ta-a1~)񂸤ێuaY;",;U@ܺ4ꪍؘEG1v84]s*܊ ^f Lgt1XЫ +ТP"0!;v렧jb#V6F5> Lu{4XX1W{D"ꉤdv)n™+PQ{!棡>JvF lȪѷޱ{O=_~ǥEaŏ}j[s~h4,\1UBu `waI}MO m;kik/U#,LBA+7oɯ_h-^+%[_BV|! h@4suTe4=RRC{S-~AVVs0yykC|6M( ԉZѯ 4{~{3;7`{9Gd|)(BP).+l~vN*^=>>> 촞X3̼̂qO2PDM \[HkPvH@fGKK2l<3F| `3@Fj!uCT!G0`2D) ۘcT1na%gci:S9>#h5[6}tKX#0@k^CgSΝqb\?hd2J1jɷRgn&ޭ"8iw+D1ny3,y##8ʪx@/r;`fsʤj+@?C_: C ee=CȀ'`qC bz fnSprX G]"8Z\G!g]$/)\Cѝ蟮^n FģHĜȞSdQ8|?L jd/{QsU=؀*Bx%}cR7]Y$񢩾jx"3NJKUl?]v~pgV׳q󼈱T@<B }WҢn^\8"L珜;ʓOYV1_XV%xzbYvW*.Pۥ.xz<x *Rݑu"%)4LTC䉸AT&؁{@ػQYCe[LYB\= 2PxD7]Zoݑ)m-# ͬ _S_(u}]DrTr{d%ЋU=N >/,{cfsĝzXjl!z  LwtQR6@ɒ+Żq"\wV0 xn, ٟC!T? gP^y !о,]Y!n?\y\h+z@Lĸ"fW {:ۯ'N>6#*wqn)C!(HkNZr<Z2s}0d3mFmK{,bё6Y+P<^z,\eƵ@)4V-=noG:+/'n-QsΟ3pMhYUbٵjxa[ʅCyS_uS%8t u^nL;!B/MDq8\ 5`>|:*o}e=Cn\/7Hmվ)')Z`V88 {X }7k쁟V],ѝI$]^\81`UVhE%n5Un)Y3$^2/Ϧh-YBȝNB͘Jf)B7>beg ]4z` %z-1e8|vUj(OaّPh䔗O-;gμѹXKt\#'b FVy~Of1@ D!Ƭ/8a .O7U LqQdyYmr`(rEkq ;no4HqDQ'NI.9` ŌA2]T Bad]iw0EG (4`+ Րr!7 $%3}}4xekLrZ (NJ.ˆGJ;UR}k-=`[EiuUɡL/Džfw'I O͙R;߄LlgOw[ r5H+uqwǎ6.•B/J LHX\<2K8p 8DĮH Ņ`rםVFV^n.  (.Tddݮ2Аa@$ /cuPfIX;>B:\ƤB#de~?̱I2.xo;-?t{7yT.±jF| L&닣<{ή}Q)oqaUeJ}"Z"Z)'|~z2\^SfŪ؀큡9tpŰWe@m2w??aTr˵ wp#~Ykzi9t%* U"ۛSs6Q((F9O4G@j@9!S?oiAOa#Uv_֧'Kwc3orLctψiD #`(0mNOc%c3V g\~jt/Or(R4ٰ"uWV: {q8q2j_E6[$W =9_I:r̼CJr@p-8 h~fkp+#tYֳe\*֔Aahq Űن-4堏i?*RRDLs۫g)$ٱzkdޝ$o4cԳICLlW/ĽWVFHr'-!'-?EM$y$22^"2q8@xwSDZ1)}S̠,RZ0KllM;͙جLo8{"@eMePRErnI0zoE7(6` J mAVl0uz h!,\I}EWB39yq^CΥ=Q\*1/ y)r˅؛YZiɼ~"Jtz!=sݚy2s*l7ܔZ-vZeڀHQV|έRg-!,x4I[A ZH9Kk ; g T(vY>~s>^#mK>{[$1̴J$k 0uň2*"2G[\m*y"m4>Sn؁4 G?rHڂohw(WDР@q),03ӻ.̐`-Û':樹h=A>8<|6o7]{xoy).p MՒm7t՚l'b䵔87N@ %Z@U,# :~J#q:ꃹĬR6*{cqw_:9+ŒZcGJZnPޓYǯ0\7λ̂T`G-OìSHj N#+ޗTkbhp+iRkkVQq_ `/j],^l^%6# ~s#݄0 QJI&h8`ᆥd<7'HhkҞIzMHYh`!7*vX%~0ӞΘ~8 ^۱,xʐt.i̧S:mk/pǢ᛾EHX*20P/u*s QrӠXK/XK|s xnIK:"g$8L7\=d+ApZ ֕4AX8F^:3s b{]UϨ4>Ɗ6.#vF 97 a"8M([.8 zq1_fw#TFDg.V(=lt/Q5D&1PH}D+ԀPjJsOCڜG'َ7*}~{Y&1nz:d!W,dD! @\#zYʟۏ( kjrg6\R4i>{ok#w3w1sW}Nf~lŶW{ ~X1ay T{lz'G9؃mu;fJc帜 ̄sfLY~hC #;8"9`G2&VbeO ݨIc%holWqAN0oP\ q)q2}42+|dԪClBW)8B,k oU-@`u'Bc[1JBs&"ׯ2}͔W8@{c;>3p,DZquF#C@Rb0<^)gpjY}K6X_#uyYYH<3 ]V4^&m*"@ߐCO D`$ ͦˣ%]c˃U>B`fUݒ\ƞd׿.iz^[jÎ{CQEr*ʈ0 H%hm-`W{[[;У&e˃ [Hwlj(̲C6 ^E`VC Bq\B[j}^#ʄuZl ?oofI69| pJrVS8PI^.hQA+4 d.'>HN ]2^$D Ix>ƞU55Cz"otrjqG$WsxeoNG ^ hz@cXɒ 1@xI:fR R[С{޼+,[ql,:Bë2PcU=+"a G}WD ܱCїDB;'T7tclA>xxLs £R(Yp~`-6wsun5 vյOJ_&a f61FyrgeIV#f[݋dcn7ha-T!Ur4wc"i['[-Q@e'(==K ڍ>pl.-MĻ8^Ck!]IUͭk1CF~@̷ ~@!1[YQ-w+h޽d\ .N5-1ܮ"Yl(]<`o!kwi8fn-1HV=zYF z E)/ΎfYc2 xFza{ =SP|mZT5^y5uT' A p{쿬 L*BI ]uTS'z L{g½:8, Ex^<Y5yf3_ētY$=]Mz#KVڴf lKR'SÕpصnd\P@v& Hn2- o%ZV}V~ԁ['+IZ߯wv4ibB0 M "& -%7+wyIœvo' ykdCSPfoa6+j%yr[td$^A)-Cp/9'>vJuuy>UGq^-?wn;!+٩ȭ%,%BtʘR_ҵRHlR ř&8"exO٭6eU3"x08.Xpef!HqD@&=֢JO8ƲZ92NXh``CG=Tbhpf)ahx-i j`s<! }H-3IVeSJ+gH|ѣLA3fPBB 2:rlX\VjَZd$Lvx'YxY2h**t 1:yoWWX O3O!$/LNQaԿVۀm Q<.w$r$FO?`!ڼf|XMiE#~+3OzvPĤ\f@c:>ËKX_nWoy2ݼlPh#6ܜC_8aQ8(`f]C6%Z|2s}Bvc:=Zf㙸/~hЮ&aVZFa"kZjWV_#"\DS.n$茩 ~<3y󾫅[n9`<_:Xy'HE[wR($u7zbCyϑl,s*7yNzmyA `}Уq;yeVipLa&ݐs COVG~)Jd`k*1{/|aN"c/ lATY˨mS;皿N9P$K%CBr9vp#kf| ΆIMʓm=z{?Țٶbv# { .N*R6wvY=1dB>7OlGӈ61 Rs< :e <ikm/ʄ}AL{f8+uV(w%X&eV'b7E䁻E}> )>.{熘 h̋LSnx90@en^,dͶ`T oEX3E> gd,`1F$q`rkyB;@WrJ QqX}xMie#LLr pL{Oy],d*knr$5=F4S[nZCܶr5f,pϑ29T[a_N?[v/|_ 9&&Q7(eYB zO.a3A d\pϙvi19S <oc.t%HBImkDeiw_VZwWĝk$58,OEGwv.4Y e^3*G4C4g}~|gNݑ"cD*,>q6T7xNgNqaI,4򓴯T k=i%`oic \ adZYfr9ĭK׻]sb)G_Jxn qSh@gSjGiA@hPMÊ׏"W$@ [$fsotjBjоNy~YQ Ĉ]mbZ >ls2w!C2g؝%:wOuo0.G9O`UcŖJT%oUGi27*bFhhkZ4wXM #l@*Ok")vr' 䑠ĖG0=K6e"1 7ZAahmDxEhDk3sgׅ[NsH6 LJ Z3bRW+RD0ѹ+GLzzAY-Zprz`йǶV!aYx&q,gSRelk,IQ=zB-Gu r$o-ogJJ} x0r">a5RO+>tXU>B˼FLP #yqBA VҚFNWxmē)AGbc`KM SPXd.ݧGK@AU"ErVfOBngBGg.~u$(1=Z߼z7Y ٗ-ۃ>jݷ2 ΢p՝='lC#p4?$2 \ftq{`+NO_+J-/$ ~TgR"n(eeMz١ |'&Lϣ3!ʃb2ͬ([X.z)m۽]zod^ت44 *?D r]-߼cHQcU}Ҵ(xDI 3xXRƐr2fb89Tb57Bmy]lCʃ \&4Դ8*/)#2zv+ض EM PJ!FIQc{(kCM,HbST='A ,?ԗhgM'朦G{ElK'{NSa[2*qJ(Wz0rQ{#~O\]@mӈӱYo9'URX|en"]`OƑ-~7-E=SI]s,l7} Kۧ^b/=9jo-? `5Dݚ&p#P[.$ IهRgcEm!2)|SKW|ܫPǢuk;x抁+1H`'rf?wIC 9D ܀eFʄZHyH/RW7 \aT'VPôX#%&άZףK;>uj-($Be7Nڮ6֊ 2X7m)«_!ҋ ^kDeRDUFE qcWvbi]D(XhY03#gBLȕ4Nhrҡi^'ְJqȖg}?*쳧ŌAcU vvD+C-w]l:F$un]r%u/5ˡ8zo&eqPQlAP)Tȑ{kT p2 -tާBmEokb`1eTz3p@U pm6tّ!v!=xAځBC y{fIN%>Y0GKJI{w-̻NjjV"MuQ0'JSa Yy;g 1 4ZeWe~sg‚3dNr[>3:fmœ(X̤ǥɵacչaxNt??󺀪4pۜZJ./a)jV=\Q^z*UEFGw1o-Qx1xBȖ\ճÏ^%H5Evˠay!IāJc ðuP3χN^*a  yEbgv'VO_QCGq)KVi"qTY5Dv9S@1$>p59\R#͓zSin$"9W~2GּBǘV^rY 4v P=6 Ԁ-gr7kj/s=ۡ:c$e7[I=8'ME {=$ţ`u%&[eGSfgƌLnM rS̑J'/Yjc0!AC2?ʰ[FfK CF1=-$nED]lⓢZdo!HW4 1NuZ6[-羘8lٌÉ&fr(4$rݟ Up9Avʕ-# >ĺ]G\?e~35_ꕵ5=_# ao՘ IX&CluתMt]a{<` 8md%=X'Y.Zwy+zdAg7-؊,Vx#~Yq|sd:5ey;TlS0_Cs+4a&)cqmIui#y>/\^HxI l7 0X^Rt}PޔJK*0Ew F* u*J 'u6eG/wxUz" &Ȋ3.O& l 6|>MAzQQsv WÐ ez۹}4}^,X\ BIѿ8|LX򙸨7d!v Rg$؝HbMD}fplPȨنǧ _P`w_a(4~P_)qjwzcYٰӘ+Xaq Gl|62m]vlCNlR*EHU}gmcggYѣHgڥߑiŠNTr*8~Z#7Yle?-H;E{'d>UgY4YrO2)ݽwEJsD?;,{V~L9«u =l?iJưD@x$4k[4[~tЩ/O7bZ[_T ׸-xh+|M u̶Z#h&ShaP -+N󘨌ƀ|A`vC^:C \+>l,{I C͗LJTq>\dF.X5vus@:H:f5S&r+s89䫨I`Cx.5_^!~<7SPCz@^&W%%?_}k ޝjcQ%5>i= ]O<f$3R0(_)d9EP.Ig}$h9tq)=fsf)ذ^qsdj6[& /7Km J[$1 BF LL1k<@5}$ZUL$ \|]1^Y0itvdGYer k{Cg*sra-cm{Q7aua^ܝpgXFӃ]PfpbuX\f^ S!U&t>lt<H󈇒&ty 4G6ֻq_ cD_;\<-< >3>8gI" 6[oHu\G5yu˥dWbps6uU) 2UY-ye!kIr s؞C=`*v2y<pЄn9NȈiv7e9ea}@O`Stʩ/m⭖wmwf< tPP h*`WFS)]K?\B^&|&=)Ӂ2 'iv\;*5 4lE<޼8i n$(`UCm`qjemXx<ȋP@eހZSGt /4߭껌l,jYɩgtm"}ޤY܂bO~" ۓg]$`]HCLXpfwa2R_eO+2LtV. Zgźm]!񌦢ҐnX:d#繵9:eؗaПG<_0sm-ۇOE5R&WK񍺼R*2!JԌ75jZ-()?i% v83q6n?CXlLHcQevq>L,JoHHBҶhj;_2Dg_ع+X|kIh LxǏSMb=ҺI8ltc ս,i|PCˁ!dm۾X c!'& LYl"42U(E$츅`F 3OKSeΐtESh>E   ؆1|yUu-[=;P#m.n;69Δ #,0 YSIF-UƙtPmcBm(@|V >ؑNI%X6߱H0$1I׎Dhy?>jdr Jbc&L7&Hӡcd|Yf&f1lv-#AQB+bDy݆р"Ŝ㍼'(nU]Y,ځ8A19&C$W>yet_Ya8m^Y;i 1n(%iV^ljo]Ԓ?^^L2+!+Ȣ8d,j}p.L xPOL ]b9W{J S29v߈Oo`4ݸ *L:iŊ LgU =o:Z1M^ubPPGou o,g 'c[54{O.sI=g&Ι[*):`.XUDR pd1ۃ[Sfk G`艘`Zeg3'_"Q42Ḇ$ sGDN<P]2UDK4jHiexH UL̀*q|TU&Jfur)5ȣN΀Ggeas" WYO/@TV{{Ev<طBsYl,ĕ*lCRb FX"nչ4h`UWi~֩,Rv3.{c$4ᭁ9)6"4&Ͻ])aou;L:|| Z),yi!\~3R%ߧ`eHjqZj~AL[5ZZׁ]WW tiuǚ6~N33ҀnJ3eҁX}?""(FJOXc*J9=O=#& /YR +k,rmJOpL[=z^k\+1}ÐʊV-6*M,f`֤s!e />6j7Ū+fPp ZZTgu6ŇF TaHb}"nȒTPzGxkxVɒT $ka#S&S:cAp*/df&^[+ K\HJC B]" 2rn˜#=h෥̐kncoM]\9 F5vrFэ-w>4r39:bOe.v·&15H m&u~>G5thxϦntoԛ2_7y ?iEH}yc^駏y[8n MA%m_Ma~D~Ul܎Sd4l$!*DxR#kg̝( 2 W?9>nuR|<%)Ks#Iꚅ8jpoo c~8HG+7$ߑxg#p3 ΏQV8]Yo?BpU xf*gY#t2W NϩvB>KPnRG_Nn;##xCMj$;`*d‧(50~}Oovh/?m>gZTĬhk҉9m@N1PWHo uICeaǫ,b|_uL Y5?_ b6eBeVc@ُ( SQq% ~M(+oR`ce6 8\ x-/5YJ)A߈C ud\4,[/H@덝:G̭mapʨ2ʉۇgiD"m9fCŐ OhZ ]6VO{BS~gb:~FVJG'B_ # +F.,ո%e%PY/feFLcbin;[}=ZU *rKf}ŵk>jNkIbd3, 4VvMlbQcjTj9<U4{+OcKK#XGK"xum\y|@Q4zo)5]VKXa`oԎRz*j/^*,y?!*!r/]˻V4N/ 3KgzOЊO A,[a/p.WoӐTq:zKn!^,1iFGҬďA(Ū<1`RPƟ 7ǍWX6AG{|C-,oݿ_ y"#sړ+z&| $vtPzKU߾=beQgqIq|y0];x TulBT u߿UnZ˧L'L6F.qnׁP9|1 tr!Lt%>]dZ}YLtd}˚ɩp+`q 3@)r+\ v#h*EjR$WSP},#"z\H842ZlT^كl専翇z$Q;ۜkpK}ܣX;ݟSDOtaajPܲjQ1wLP6*_Tj~KHJa'܃yk^'ˍ e5nU?<_r6\Q{N ϛld[sM@q&z~s&T;v#{pP7n_zaGf[_+VnG11>IIWǒ/}@?z&@(fE2qI zj#FGj!9a qW⯫wp:/\؟DE"g[v umdp3Z=1Ұ򥡘 aPwA `h\S*Yk{yxPʵ̐2iQpĖމ熬hCRdjP=+ >4qnDf(v"d˲\q807ٗsvzVxeEVRxKLҏ*Nl,OzI}<;svG ?3}02d ޕ> ^ڲ,(^5!s* HBQ#y2ŗLbfz7r Ñ*ZsH=0k/% 'ؚkxo7f$]˜`;c⭏=̳뿌X.pDAHtcV@O'U&z8nl:e. еLwbdq8@4RD0Hnك⢀ q ƎA_t. yMJҺ]v 7ԂgȖK0Q=0%S76&B*A1>֙U9%r'Z(doЈ-_SJ]9Q;eL܍+w(c 77]mWahAÓfu$keh$d@U<M!̜('ʹkx d@\%"Ź!C2OӐp IJQ'MDjf˝5jKbֿY`-~Ȥm{g梷e s #sy9 qrj8~s4y| hTVOMeFN>Q .L~/.'eȜd+vYR>P-a8$3_[oY_,Qߴ~W*ߦeUP  :J`*s;8.z;Ic;5Gr,oP1`~3SnWOb7hc䁉] *j$T*>%;Dlu/|a.% yjoMlfKGaD&47wf[J>׷ zx+|oA툽:@;xqU#T B(I,4Jmr%q^%X 87$/eA I#m_$!ohv+G&`Hlt=^0fwKev-(; =oĢqciaQ*j]I:<05d_UC N6i l_g"y;uX$=\btX4Wo' $&=B!AHJzSo:_f=߉wq+LpdyTmf=LPr av,gDliYwr=D5|𿭄| 6<YO8>NLwlhVULM;=sR~sqK S)Tp$棕,2rݘHBm֟V`ւ3xւ( 9 Tm="q\R\f=ᢴ3m#9i ېu^/HQc&7B\(z;G@e<DށT{ʟ %E΢qJ& "%V6zZȧeD0sD{EOb}x NC.`Ht.P5^Z t,I͏A,kt#d7iqҝM}?G ɆJ3We]wT]埆՘u3{&h_WY>4qFN\Nl*,pdowryoI7,b$g<h[~+)-9e$ s݈N;4uQ54ݦ&毌G(U%a`K~&ok}ہtg+W6ʨ~j$sml4L0L-]3D=0-)=g:M% 6E/j@+#!vܫ"l_ќ1&}@[ ZnUN2T6fC nɛJ8x_:+ST܄f񴐈TE;!4s%"֠;RjɍE*$ 3H;_.Iw]mo̬:b./D8T/Q"v׭1pgP ;)JsLa519zVBpǏsj*f=[* ;yDEg^ZRvz2-VxJ ǟ@K?ޭ6rt }h }wuQ iQbtG!h)ȻSw\SY`0ܖHI(~&1NaS8lTbpZR:l̹?@\.jЋ>$)gM ?Ü8 NyVOCo8S]$H7ԃGSS ?0]#&Hܳmui `1ٰ㡌;rQ?F +nP8^oh ۛ^,VK.GБNKKY5VxTԫ8tphrs`(}r}ÿxA{\"GuM1,(w66^{R?u9c9Zt&)ɨam\sm[f ";7뿧Qq-4']ʳ}2"VY)bĶ۲/rbwJV^cp,U;2]D9Eev;']ϧ%EaQP;7A"WzC *ӫKXQsrCM Jя.X6aGP T1xT9Nw 6o+1Vud 8>ݧ^}#YT k[7&Lf=b>YS6LV@E?n\\o_# C_LK V$ yijRЭ/T VU|Pl2NZwh귒޽"k7nmIr*$`*}1mpb jݕ_"=zfg&(YW,EB(tOY#X}#@HȜ(th{>5x1{^ѓ0,[Fq isT4dYK, ~鞻>M eg.xl`jשZeBe#jg^t=OĈ0snPvVu2"8LX]jkyv&M8߹/Y1&k@Eدfl=v!̗Qk@P˿!RK0Wb|(a׍_l= Vr&_U׭)@Wk7>b; v=e[f9h &䟞 Pg1$.٩dl+zm|Uh> 5}u^ 3S'qVJl&jP}]`j2uŶs%a@:C`fv מ^Cj'%=E)O*3op~2h<y'2a1ef cJ `a'TGQF`2647m;8dT^Ϳg(tąbr:%VӐZ#Em&O+6 "`54iw8@wh "1 ÇW 2јbՕsۈ.\% jvES }o&aSlŭ3P \u}!iȆIDkqqiW((&Az\mAnFn9c~$c Y&KwD(ߛsymt]nqX)BI`ufAӢ\@?% <9XJ+̶=DaW*Un:q{ۏLS4y6=_sX{"3qw:"u$<]g>;{.o\ӌ]iALs~H( nrpzR

BLSd KDazTTuszD]v>oH-.~Ӽ|2#6ڸ]'&p ZgW?I)vAFɠ496V;I/f-6E}QJsEq:*Իl_d8"k^HuL;Ѐ10%z:y6:haնtڜ ob.JJ4S:( Y4g @"eau['J{N 84 r VQ}|HP>Bq~ ?|C-c|E:pE%u]Aªv/oNx <+mvdbx~SaJ\mxgbj$jjCNM{n{\2c|"m|}y!xK36܁+p /n=),2誜ڏ_H,01H끬< s3ZKlVe>M9fϓ;xU)1⼨;p wqM]Y&pf$u!JhϘsSCρ=GyVBLV">>" [஑}IF% A1H2/֡xN>{yI^y[6[ˏhI@Mk82b_ 9`#%_ J{'tΈ+NcB6pěFDDJ6Ův['_y+{;W0e^@c#*-~wt!jnT^3|l=%֭*Wy۳DJB% 4MR*,HB|(_[Ğ)H\|9c' r j .?!`>;f?W#QQeA/23D1z~(8jh / Ax)io?y})A[cRO8z/UJ{~lՏU_֍ITvLjd|C2'@&ۮ@$-7,NY`F~D wvEhaRE][]l ?=,ol_Dk,d 7s45GM(R\k~Zctp׻/%4@7UqM0 &M;Aa]4^夥7B{6k+gltQ~xI8 t~So^6?>r߉&WMRǹ[:”yJZLrnD& 5fHas[{U B믯v!d/ eeD.* EG̗)+inN&(Xqɀh ߟ*;&(+uLѥ)#p'/soA?!WJA< P,$/Oy@_,ll̩/4c:7B:NFU"`P=:Gzs-1W .iGW4Zw (PMsIt[jņ!{_Hd\=Rlװ %: &WiY5A޵ [`_z\In#! HBN*@&0& !g~G:("UەP_U[Xg`gZ \SL hj3SꦁyzHOrK>MJ#nb\4oo E n~y55yr;2`CN_{ѧI|)oJ{o(KAWw\uc8ѢyrpNrщݍaIN) ?oҐ:1&9+s`d%Hwㅳpe\\%5˟:pˢ U}Ƽx~Wrw0uSȨ];CI+s0CSz%[N/fo? X+_TXSv 11AX-)$_]:H5H)cGܔGE vrpkx8*^I3]-(\E9ŋå eZB8-X Wxш| nω7&t{k>%o{c :_V<ঢ়C&)onF2-?9tJ"Q#LoF&RzJ( d c-FI@ H V[[87ic"Ց>c\˦4]+]"N-9QjJPN< 't.s;i;\2rC(Sb/ fvL/Uʤ,XOq;w i@wDM9?w˞Ej팹3TVkWq~9* פScQ[cV*:a&fϠ;ʂtx䥺V!cBgC<R dtGEG MiUЕ~d}ݒO22)0jۼ&peθ>ꃜ-BMKxk"!!<_҂5Xq -_@9 ދ[~Scs')UxJk$hKhBCB;FopK VQNokgЩu;VpF]wJmۜIm-u\KeVB@j}7ME7칊js>ё ! i9Rk3&w C'i[zW~/`[db'ELwTBZz>+vqU]~N6%' +_guWq$CEbd SX/L2aK NFZ</"xWKtEn.2ht* UzMA}bG } €%u|_aYe_v5THW4"8㣓m1E8  B۔sj0)AWv$cWK ֜Lޭ{<̧} 1~f'op2Vkjc4ip8yEJc667Hvj5ۂh>AZstb ^bv5y E ?[9Hg!w?}'yג 7Pd8wllalh2⺖\%E )S sn0_LC4%\KquDpǪFk:K\\U{@RK vYK%&y^]:րxB|a1X\y}g|tԬJ&,O?G$4/2;Ū[ ݲVM8e wO}E&U H^4<,4`Sñ%ES&& XEɏ͔l#n8.d:l뇊Zb= m#~P#0:%G-a{k\W@꟤[5@WUD T }Kڛ #0eFy&G1eW; ^DSlcҲzќkfԋʼRhR 1*ߔwZB#DK$ JVd甑45D4.I|6\&u,j.(t̋*_DZ%(O!He+t( 1:@Kĵ vھ6`80qv5{u 0U;~'/P[<0Ūr5jupKAQغ%\ǞF:+"l5,+̏nU25 \2@IEeutRz1)S:>+Da؞LGkfCݣ]{NΕU9V饒I}i*n ĽĸGf0Ba>7NZ`GȴO607l ְS4~G'1b{Xs i8I3#}L=e>[HU[dH2m @1d"d ;Q=5 H )Ć-y>d➚򀒻>$qr(gHUISzReB"7*ـ-gy1ȿRV/* kݣnzmB_OTgAY#Q20(0bWG x'\ a2,u,I懆zy.c@g^%H DZhBzO\>Z6HO¼EQ<= *? ҄;@+֬.PЁΚ4~Y yyРkv=&h'N@jJ4|M(3;gcׅ&+V76;QKVEHCb,}ʎղ@nx<딈4  'T^=%X]jUT X[Hob-.>9x:T3.{a5HIո9c 9buˍ>"j҉]9jS݀lqV1FrfC[oeH{(r#E6֐S$ L/DFϞ&)/E=r+!{5a(m,]>}Apr+j0|F |Rq*x3&Q@a+-Nˊ ;hBBN4^,叡 R˟wBGtyw5q ci;!Q3:|AlJaWW0hb/|^E3`4ߺ cّ]lB$Ǭ_M1hi&m͏2CB!ce 1_ L"Ω Kn4S 惇c~ |Bp]0Enr~W/*dye"JcP>,(¯y뮽vqȹgȅ0!aH+@2=RM‰i27B.^¼&_x48Qٵ+[`L+[P\?ہz5.qQҀ5Uz8 PJ[n_tV]-]a Hh9B_zGo!T#VʩDWIjC`JiVFW9#MG&ɑWwB.ZaχإQԭ끎i<P`g|W}! ?v@`T!ݧhb Z +Nö}ᦧ0*&)pa_pUiEFZ􁪼2k$jWíWEX덑^C5N1rⲼdmY%vfU{#ס]9S)z^84 aѿiPy{4hD = Jo J 4F]L..['gF)?C - MbJ<󑐎<,Ѐߡ%9O0A.zY/2C~*\ma0Z|]@yUި$S7+2Q&iCFhȦx#!'L?81#~[J;'4 P مӍ fYU4(j/͡~T YZj_GŵYY&-qN1w,l4 _>O)n8ElWV urV\1c?J3J4c YOٲHHEMR$,JDS!bKĈd‰6`ф@PSX(N#Ѐ cWXͱhL&kHDU9IS|,F8k0yz%\OFOSi6%I?}L]~S\8_#oG$WیލM')y[)[."iR(yʱmM<`|m*ðM {#ȷ3}Im\b5gb% + tSYT&{؟gV Hi|P%o^j:Wdn#lzN9AP" %R<)R"j{44Og}AF] vX?6WMjN%[1zhx~՛ m_( ӑeySkuyBW Ӑt(I˯UQ-zv&k##Y4F+tw+o $?_!4-BlGr3)yV1E3"muwQ7XJV#4&a&jb"%ReW@Ʌjh7rQfG„\z4nlmgԮyc|, 1D'A]+G@ ENdYv;W 4LQn(<Ҭ.@u0c`ƅ(L"hݯmG\ւ_[TGsF), 9<ɜw/ "i4}L^|Dƪv 4(NܗD]4lۑK+,DڃxoT~l"C!Wrڮv}!F!~)S^/Wc]&Z].HR8&"\CfX{}¶s;k(8f0 KsZ"v' )\ G=Z} 1nnC䫞,3Aa s1ť@o5{&5W&r2=bc;>bflR`[-bI_[2t}#=[l4&zCޚ%͐d:ǯ GvժD:;JF 9>(҉J_ ~j>sDɛSumqGcfBLaj *\GpDzRVq-z\#mbx%䶚0xԗb;ϓoh[pD6?DYr 0,3П 13;oW'8v=6X+[L܊}\woճ` 7xNRq'~>RtC> 1#1*2'{`ʪsұ`:v$Jȓ=T!o'bj9<۱<8?8{(O~`,s djUOr^RZ qe9zZIJikj_5KQ$ܗ6Jhkʞ/j9Vi*l7k%ZԂoY( }YXY 6wbFmS 9pXR&ǘ 5/O(lgw\F5twN%4: =\tތ"1 W=n"a2^:$6rKmtW/w򦎭3LiSwœeYҕ$haCmԗ8 rAk:KOITs]r|X S$SNǙ,\N{6U{w{6yV9*Bj5?|'j&%!]\%WX.6P1Z'50ğ5J02 Q? e";rTg0,K!2[ú?nB |Um)̡ 㕊Ibd:=&;uã -SĤ{!"8um@JEȒu-&퇭-jñ>vQ - ١u!+:V2g2i3ny"enF'ɜ)RWULNB @^.:x"T#˹u|^gCq݇V[0_}=G쇵8-J@M7ޏ!`_vb7&uƓGM;]q hws%;kdvBKUa=yFH , |bA%oN:Ӎo1҇.LsB>`C80F\$m;͇ x 1GIHD|WiVw ݯ"o;SG_(P,㍨Qz{[ZdI!c/{~-Po [=_!&ĵDᰝnq?SDi Dj{m>Wlոmq~6C}^\IBVK{ Rxvfun\@/} xL$P1A[e$Ygv:Z:$kW*hIWbt+ U=J>՝h ]5nOYB-vwk9d~d|W52LH{}eoGı<@@ NH[+jW[.;H1Lǎʢ&HH(x%ZŔ:#fwVgAaӬ"9l~/9QΘ%DghP!k\!9*'CR OsnxZ0/9x\d/dP]/#%RnϷP+fPźHf6Uj}zhǍ/G}EbF[#bs9t䍼7>Ղt@o;x1 ,)G-;˞P^6w4lX@Gݛ-MT^; q 3XvkLSC[Xͬf/`H"7wDyԺA>F(S^4lK ?S9|s&OKJI9-Zz-Os'hj"( jT9eM765g!fmJC; vHCc C(QYW$wARm%dFћџ&YqV1Tݶ[\CE˛>׼MIo-2FWLW`l3qV',:35 ^7#=`P?~3[ͦ8@~?uy$,t&2e1imuiFװ@V򒖞ZMƆzԚ]6 R(!Rl j~v_:A"}8 !$lP0G*82М<|x`aOֺ2 KA%P$<4bոuI7k~Dc bџJn*V!iT.Kͨ mf<ߥq>=?h!΋EO㗘+N(YM`} 5H'2 CdV %츷+Uׅ5*c6/3DD!v D*F6+*UF2 ‹ݢ"HoxX`#gُ?*Ǒ/^C/ JXlF@B>yn8 ZZ?"c^y%=}ƘqlP,dcGm;;njd|\'sCQ]_3s şDR*g+\a S}<ֳE $rIt}3I㒕ѿLr9m9G)/F 򹋛حu>؁}PkeGFKZёn`QB5wM1 yy(zQ8!e&3܍OD<7c\Ʒ'&d^7HYt䙽N誼LGͽ X$M%o$H^Lby9?_O |AM3&+ޓmCk|<1"SyQ1`ˆU8# ~̩#wцГ5-J#qXb1oLnZT%Oh#v9xd 8CS`nar}rCtj#Z8/z zJp56m+zmEɻ"[a++d*ȩ|˃F9h¼p)F ֚ 8=sWڿxm&Bl/#ݳ ~mPkEt͈sx"bV(כ][Kz*8(3a Oo,0dr)\L>SM'3DU!e\ypj>$]23 a;6Bʦrpg=/?cfIT\΄}E@f,G|&"Y<(C:9i|,ɬWQIW! m6W%*!^ug<1M3D&uUt;iP;_D)|5SQV^C qFʏ<;C c;&0o[GF#>ǁ4dV?>3\!i|o}ebr'X`x,=4kuKGY Uϖ.4"(`t"xDv~E;Kj3 ݷǿtbUs/AQ+m:"7ɚUyZ)OT4g?nl5bwDr 4kHcqlR\7d@/ raN{ S Ab[2C!;zD3u 8Pn?bJm_ y"V: Ftq!ПDž 1A_E͈Ӊ}9L+Jj"Ah(b%r=Sl~ֳ"a {;{(}#"26~3ge(ޢn p7Z|T^GKZcv:'n16%[HR ß_aМP~G<|OcNP VDm6EOUaAiȫL%8B 8OfPa+as(xl+#*83܋vrHčuQJIcH1ع@,gEDP=UWlzCS%1*p*9t,<25en/ce*ebw cGNns}/Zi$ygmS'vWuJ>p-= pZB/9=`Olœۚ9 z¹Y9dF8/ dݪEf|BkBlVsikٕvW#mⵙcƒui=Ӆ:BeD:T/qV+_1w;Sє4:a偱n;׋'C]xY s۠sFQgu Ҁ.i /,taW+isp>~ލa#Bů~<~)e:nSiRUk%DhR͗}jEIS\`.}ol\L]e9NZC>=lHM Un}ma~!Wak@gHROf"1rZ c>v;9C8@ U^DraвDM72@xvbTnNaV!bDK-@teJE*h#])̷訝QPJ!jW*+C{z{^.HpK" }K82R>g{dN~.&c"}#S[dxqo`t]|:Vi/$dj ۯ=X<4ۨ& uAgܩމxNdrLH)qrTE3jf$x}mDX#vy"0%"ǁG!cʯQ#GB$Bv㍬mcR\|E^H/Lq {I} rEgӯv|UĤ@cs9dÁ٢$c`dp*BUV<Ń ˕VтtNz\1Vc!Y4mk^-1!qCˈ,hCtT쟛tQG~ttC1Ƈ VRqʬێ"DC%]{PIV8p*+vЕ= y]tfTd;4*0Bv7s.3ʔְ _nԹ۶yQm~i6c"`.x"2LZ2rp5kW2b'(ZszH1snW\ ݼs9+j&~96ݣWLKN,-$ޙr ? x 37ۈ ly#>.F,*2a[ xf7@iJcr[4KSAzŠL3ƢisJ,.$Ц$)/Eh);p򢴂ރ</G0e#p`&W4UjL`͢E5~<Yhmxm#Y8u"T8zr6 ?ܶ[E]f{ךβ qzL Jwja==)j;BlfTIӲ%C\ӽmJѧpgj.ӓMam[`SdIYD 2P(%NN_k"m N/EP9L{c"@-(9˳*> CлxߙBCrɰmڹyɍ [j?^~~xYi63613~8!gQsXa: *8 v@[hB+XR6+s|al%Q7f/3M;:'hﲭ%J s|\9jN/aQ\|PӯVj#.pAݫh}P&t[4jTx4 ^_f<]~GQvC   6%N\dG DxW,:XܵngZj$ iH˷q)K A "F巑'#r]>s2h_*g*. ;Pߋ̋pWxdW]Gtv%7ݛRW\SYSxC ]Sp n^J0 @+|a鼉|jn;f'MuŞs<ȐbiTC4c-DvOWt9$HuY#嗉/8*'eK)ݤ!CH;vAHڭ[?NE^"c ǝҶot6C4 LW\{r#Q3dCU*QȊ~R\ҁiiU2moձHncPe!L|#Wqaߗ>d81ψEbԯ Py^SSa4:rY?ƯKK{qf =kA|܋)'3$'B ``}7~殹.{ixa{bh!RDrS&/}WkJF*AM`ٔdRڎ/#D("A+%iFX< )zR!)lH`Am~ NNF Ā"K R"YKmo]#Ko 6zsiK TA^3CG'@|s]|b)Fz֘{cH>hSL?#7rUqVX<F$N=7[kv2c$mYGnщTʠNwƓR5;w̨,&!^jB%; lmjy?PU<\'[: ˚)}4>;ik>k~ݚ%(䳓spJ̙|kE2{duƱh~3~H̜c/]w<Ȃ J|m opzbEX0b3  ޳ZRZ.+w>j֨ ?4&rKˎ8Chu1-v ,= ^9 $Q '/r˅Dk3U'T=T'j]}j:x{sy,2bE L_D@LCT8:oSLX9Bڶ$)䔦N8u"@YGg-$>:!L-%V:3H ]Tr a+%+g`}-N쟚8-ߧd%וCSAz| > 0RZfH@#Qe!7oޟ#SW5SiILKU7%MnjH$K"֖ =M+\  ˝t$d|Vmi9rB dGبEJ?, 3l@]ŸPNE)ιWKA+hЦ/Z躥h9lobmds!Z }" ?Sfc+LCǝd.Ti}g;`֌~`:g`z >ZM$.^GGSVs'QH6A*9~׬K(~XqzHIV}Qn  _(r튔S; 6!G%H`ĚJR:j: giƭ<q[s=fJ7q(j7c2ƍy*W=Iw9 5עpƁlٛ"™A(!w#ePJ~Y T$Y R @'mw1* K¡3ƛOk dXHoZ3y(,[ޛ\~NQ1~X?jr!#=k-R?ylA%!2Mu"aKå+N+~RcG,ڔ`8 *ڱT3ud:Ȼ%3eg€m ^R{emG _(ml!k! WЁAyot{<+A:?J/ؘ<Ȱlwb!|_5CBM+jy̏u`NwbwfZ1Nns,| %S*a:V&^zcu|@DP8 X. p B{hPqMb^\Pb&V ┦>%$2#V~ztW ߕXucv0<JO LVꮑs'Z U0UZZ5c\# k:cJ8@>2cVf謋K6 k9Թ~[nGp$&#i'BݴQU9bג(8bMP Nb6_BLvSd&V*J‹FPi^p. R/ Co]Y-(/?RB`}=ZHq*NL\BX򐅽X=eHD+o?j͛Fh>+q<#,w;Ƕ #XDGg{.b!r:saKPEu rsxnMAdz2 LTl!}9B")?G @iݡb(Nʚo׀r dHDdӲ0 ̏QT泸y"[a &cej4MKJgA=2{.?>m莾C8`W ;?dw@:'8 ((Ր9eʼntm_LV'8 1 %#K-&Q iFaC1Uԝ.ӷ2)mf =CfX̵y)W]DMV̭(&Y9C;'s|}&!X@d6S!1bP3 !@˷iWCs h@3XH=8j~>MbY6T*!)>ۜI / c 60o"8;e!y0XHJO1#"!݂gA˭?C'>:+Sxi1=D։jqpJ-is*!4? r4i) K?4[Qip<|IUC_Gsjy cQ&,4oOme dq9ksQOf:rmJh4ݟ 22o) .ʠa.pyohWI=pZcّ rc}-F70ɔ[cdн G>D*1Ǟ- ~2@ؤTbHq6̍ 46Nr{Xi6|$e/cq\ݽ(JB (fO <\I6-_z95'p_ uK1=_œaԶ|qfWZ I uMGkZ18ϯ18h v2 /6ʍs}l8s:y!U͋)F;!vgΙץoSE7trx>;5_z1;Kݱʸ5%Lі0zMŇC"bWtq}>IIwD mc'4 쿾q0CUt|7gIߣj{jM BGԬ>RքITM xƉFɣ6tD>hg )ӂ%#g{fN;`%z)&ק|#S_2Y3()2+в@02%0SI_H!ﴫf] _aϯ6W@|Ce(P2ÍxpU3<%5偵d-DIпpK 't /}q՜<Hd+3C /f\@GX*8?-L JJ獍߁ZU~+@3zhh#2|#P!cS("Th,4/Rw֒][d @Kotڄk2$<좩 ΀e wo:ְVRQB3xO*(=vCWvON"!ȥ@=EY̾ <җh[_QP"Pd /_(L6+N ΋HaW"iЦ*W4Ja$gDgJvfiHH еuG8L2ߩ4a=w4G3xǕУC~?lH9'>ɿ:= jH`UPoG3[6H|z P^9.41ځ!Fap D#a`fK3u Ֆ^z6k-$ JďPL}Ye|SnK(mB]@rr|J"Ox.aDiђ4W΃[Ý<\z9dCǤ,BvJw7W|ɓ8U1 %hlZNZ6.716>>0r?] 2jλPe'_r"2M]i^L@-'{a]8o(4c9{5vMi͋/~_择ؤtXrCg0Ä:1:QB_A fYf9HvYl%-j[O^-bP#]~S4U#s:thdwk?U:Źn Gi@Nܮ5 v. 5z/ L M:pdF TLEiyǿ>:Qƀh8x:,,1F,f|0DG6u7Jq xfmطJ$17kFi4N:p|x Х 5|0#9Om ;ܘΥ! ]Hgʯ'rc \pdO\4Q9jMrSˀjiV1߳އүm4İsE?p@=H)6xKumj"2kƲ}xpĐdE!"p3$M~IXJITs؛B >6;fF}n\ƕ)|(}fPc/Muevcy_8GFkE.rF:ߓn*./Gn!1#-`lO4;ƋLD {\5&+mt%~71[J̟^FEr3Ԁ׏XDm "ez (R|ZwCIX7 uZtO}3+Ca@+y0^٥8\4?Gmώ'+꾙HUɈ U6뮽oٻu Ld >:'Sx [EIcδ㯛бCi/)eũ.Ҷ%Y BR37I" J],m.1^c?&Ys;u}sb_RWJѲ/~iO,wӚOטqU}xp0W&H]$?xZMIofQs@ 7|lrf~?.3 zWIeR'՞ʥb|NY%TϟFrkG.BZj5Uw#\RΤ܄mNukPRlsUm#^cDP '&h"*qE'E 8WW3]ߛUB ;6"U!7nLD$QZ m]`rOע7=n*-T7WpZa;8.?zOE4ѤpgM\f4:l-5Т> |kIj6?9< H>Dehe osp _bI%Tņ~-T3Ax"U%n:&c`Pmf;U `Hi5YrolgEWp~ =#? ;WQbyeWDBak}с1Q&F;q3̴>P J1|huSR_yO_nz["1(ZsĠFE\Wz}^OX,Ɉ"댇hf ~Weyn=\+C.s7:sFb`&c2I6Cc=/ПaMpے^,X*[LSZBS=ٯgXN(v-[Sh+fG2#T.J^G|akL#ȯ li(S͑!1PGbsK6`e79[wUWbWF/NL#VbB54<N ]0F, J~>6e,=sv\ .Kr }#c%Un\unU"g&q߮I&Z`BlyQPgxAחN٩~qlƦWsy;ۖk66r$M#+  ,>6ÝwRm-oLtJr֦[ |!ls E쭽3fKJ_DȭW @&ywe:ӶƦy'bK^bzcjZw/bYMΛ,ZQf b1[~ z|sg g[Z`$ܡ%C1|9*^_FBC$V & qnk'(y&-sFS`jmE^O@mn}*?Za_)},6ӁJOZ "`S1Ts|4B1H8V] ܣCQ+$ ʚtHê@9zgDxBh?ZH(Gi \_4Ω'7kK Gn[a _iV/0Ll`.Sy)N<2̝fFuj*Y:N9R$5h O-C-FgQ,Z(Ѫ6H3eRw"{'x0]o /  _ TwMRi'UI=SuGf̕Ad UkP S2 >Va@NaAVӇ S'_QLu˚R2*@[k|` Lumac}]y?ΜҤ.ms}(l0<+t3*,]Y~vuKa3Ҩ4{hޙdBKi57ԩ6QR٦w\1dAR0}5"8N7zZEAZKjmm2oAm8L%;{ٶʑ@kPBtsD pɷ,ub791j[6)h5(7Ӹgn2˓1iz`*XW?&Sx~L 'Wq5R0Q?Ȳz6OH7/Xy@8ļIT7/2|qkZ@]], ]zRNZ1,If6 -ܛsoNjW]2ƋFkc~2u9E: KyόԕXC]1NuTQU ,B[ㇳ:T1YDR!(5†=R ?qbdb, Fu|?(Z?)/(A󰈡Æ}c唜cIL\JL1sq%Jy&o=q &w`c[uE ZiWZJ`tyqz UV =ٮgk7L GY~eǪ$لs#ô+=;aik!uRR`paMѦ9cXv#goF-7)" N`B GkFz mf 2`7F6z"h“;Hl xy1\W6{ntQ c*QcJZo =y ll'Z8eS,TXzON(Џ1s;|'g9S`n] >ٰ^Β^k0lB4 O'*8}5bt+k_ֶ-C/",M-na6UEk)K^\( =PDk`0TL巁:Qd]ox'V)ahx7&JwFB(Kr@7(mZOc6vBJZQvS tLo xඛU Gwd+_" Q] 9Ȧg>y Maq (CcVӓʭ`P|߃b~g7hpRKu@yռv["ۿP: aQL-G0D ס/hmv@c6D[ 2zTB&4+WIZ-S8SCgk'xITa< )Z.uǩx~@O ]I\.QF ļNF:,7>mB8g\)d#.oHM24RB["v6,~ $9᤭?qT R _m.~.]A-F*OxW% /4 lg1۲LMOk^XV;tj1;qG8c|sZIXDAyM^T0@)6n8U I/I-!%74O UO󽔥Kp sx?.hH=kpA|Tg1!aNU- NTL!%3YT컠sS_ebYo :-ƭt@ӽZ{Jㅡk <-2s? "֯]Q35s U1`ddEqsVn~%21NUd~g%>O&8.9dJ^EՖEh_0jh#׀6{"H"5z11ΐYL7t~\)zG3on鱸N=T\6=7&Gb{`|s}^ʠuT7LGо/ămD=nq|53y&a8p$1׷dL16{A,OGqZs]F;_$72,A UƱA83ظ>݀od}W=B{-wJdڰOh%B˒C7EI`.UM. ևPG /ͅZtARӶl+Rj όlFpxa>ݰn \8kp^ftb3`]/5K]v=l `ٍ"h "fA\L]$x[+i.\ć<5 #<ŭfzu`C*S8R?~/5 ut%O}-D)eD'N3tGBPM!uC_6z|m(G%w;|7A\Ul6x4BVz@r_D;v4} ,:I<DeN ~GdUlnMR\՗ #uU&^88&7Dx9X$Up=DvAq~MŅ&m*($^ipt7#@AZ^-S*~Zw헼7ffVgM,6k9w?Z͜G$TrWiIUE'o bIWպV M&XFo#3YdoZS ⿉).$_{M7 Sӆ*on8}5TVE˭:K:}\!-AA8&{L?o03{2;#*_b{ŕNooVHDG !mJ0]:~g6@dP;NJ,ȊV& L9Ŧ@}0tr]TpG]db;> ;w`) 4@ %SDJu*-xI )H!:NpٖrQmsX3TbA)LƠ⯽ae#߭.4 KJ lUMɬ%mYJx1AZ='ٺ'g.F$,^qU>Sj>2N$IbQFa&#X¤\al芚H/^J&/R^ (Ow#=Vn-srl | CneЉ3Ι1vN(ǻX \T. }fZ UUž{R-qhK8 NþJyB@J-{ے^G'=51GEL8 HPSgHeU?.3u&zJ} 6>n/|yc꺩[LE<+[tPXlw) n}|P|FЬ%V"8z b|ʢ _oMlnv䦪9gfD">v(N5d6Vi\DPػHkcvRؔo4ANcf̟/+v1l A& Z#*K*=,P 1LTd>ƑbXb?JA^2 d*7hbt&=: (CؙFU/l?$^n(ऄ`f*d6=Z} )cXNbL$T.p;x:;Q,2 CPe*/] Y2<[HI9'ի͞ȯޮ@toӟ|J!y&Ih姐i>jSB6jE]܅p'a@3$W)suכQm"'ddhe1ynm lښ%󓌑sC@&9[ B,zY?>AdG6j6b$=@bOd *0~M}4;QHMb*WCPM'4'G9d@'t>eq,bE Z+LDլĀHVM7Xg)xo;.8jf aР Lh,t0N.OaUZK1l;0$l v@g`9}E}6DA@=$gi켒,eR>Wnܘ/@şʫZ`U5QhPêg,D3rmlMaq[l` '^˱P)qJ\AcZ6Y{UKݛYG 7i5iMztzFToҒ.RnnUeGEGE?a]j }4-f!{F'KEG_y{w vam#.<*7E > O}aޭ0A'lZBF;OA1ߖMz" 3SUԞ!eRJV~h/l1ԋDd+%=q"/ow-Dzy[#֝C2سv9#?Hiɮpo=#U8fӝhK,EdX/v[?e *7b,P xaV*} 7P'&],TW2GIN4ؒ?T99@:.@o)+΂(3щ{ǎZ=s8iϼm a0Agr O [#L|ޤ)QrhR2R# _GÉ"iG&FtGL&1+Δ7,։/QxOT/>=hLsOEf4`5hee^ h!MblZ4al.Ο՜,LWn7Jg[QYGU5jY!dUp!Yl0"3: ˳%Aԕ0(xys*k5*j%UrI{;c2k6}cEzA)+s D*\tѤdMX'9]G<9QWM5!S ~7Օł<|Q~oBYM㘏V - |NyuŤZ &O|kIDd OÎ)ThBMI!fNg=Kĉo:}Rqx&~tGF gWV/ïL:pH5h_Yűe ?Xb+栧Gd5ڰrԑ\@F2L2Ckn3BKU{_v%DdTY|tD./K/;Y EXӶgP!)|^:^fQ^bI-Y5W:T*tN/캑9.[| T3K K$0[kϣbLp㢸N3-ܤzJvI WovYqkakHJ\s<-ۻX%)ȮsהJi~B|Pnڏ2t\_F%.ڥL?EaQh:RmD''fP_E!0 -vvI{%@yA\U0IJVR%ʕ|Y xDIJ+sNaz4aӾudR;j +P$d,%kw/5n|OqǀJUݦ&(jBۋ&K4:dۄ4]R˿4H- 풽}B*)Vjv$lIv!(I›s53!KϊGCgz|wltLy!BLɏ]! n1T4 y$2leV)Iykl2@ 5EY%\d;m@<6c>*}*n%Ir Wb*dS ͐ 1B:ï|bdCJrJk( '`T }b =I7?AG2 pM^Ex*/DLaYԏ{]ܮsg8*6255@sy?adƶ{P]C 3e6hNٰq~dQ_: hv~WM%}u7Vs[{<~ Vܕi9{c2 •#={cDaG< q2Zx$.lI((O7~ R/>8"I0zĨ$yfΗU b8|v0tn$> +ru|<B#P;k+&o")!FˢdP[jՎA}Z8}9l:꛵잂Vːh}9<  gKƁX D^;kj~FY8QD7I4ԅAJl⽋;C%q9i*Dr-PoKm[x^_m~DG}eəeϡXh| 2?ŊdGt;mJX{7trS=u'55&ܚVgP8'^!qh6I\LBd]C Ve/#uw@Ve7ZJP}}+̋Jer1QiUdc:P:=H4-a k4#ؕ2_lɩWdUCXm9YY_- ;wQ"/P _ѹi\jb05%}p% kcƢ_50q o k%;Zy LAjsaٟnOX@،W=M;{//@E6 `'' :Z@8#_Ds?CN%P{ͩZڇ;5cGp#?#i 8&zDҠhxrDqKM:x/KGd崋-Tn=x9T:E!?^/*SBy4Yɏ˖äFC71oHB6<+)o tk1vFYO$S[G7xyfCY.K& ovpq$/3(h""/V7>-1g3 A`9|xmU}su+Y-vrp:Eȯ4F;$JᘡTmruWQw>Dc[#-a շ394{yCĒy=zloI>`!~y][oDk|jVV">{0Kcu:%:) cfbx h})t'YPaO~KEcO/c͠!پP/75R þQkcǭK>C>p = N!MHuFNԂVM9߇@QӁD`:kh,wC0J58q o:M¡NΖ܊lZI-d  80 s$=q᱋BsV`d-e湲tɏ.YSAZpá.܃c݀s(vPr7H`Frʦ#HVE&DY#ADtmӾsC{*#"0,zfm$iķL,kl'~iJ(=g.Ʋ B5f[=vJiu2έk ]'K{ zv-%H>HӅlɚzaJPhc-+{rw kjS9zDp5A@,*ٿ7G/MN @4q^[{M [+‰waw8ێd\l Lxtt2ټݖg1z4wO(>Oxuova˷U똤ـCl^Nw/ٚCl1 [bٔ &Jf WSa>McniיA 8~Ig?O]DYw^ 7s D/لQrY7w3gJBJt: wNjDs{I9i@5f7楧ByZ6k*܆} |3 s>`P9B(،hw|MD8<תmjD3+F^%+Hv>p˨9d_Z O(JcPl7 fQ) nxPϢ0wޡKʎr@ʓ#8a†Ӥ_KL ZMl,ucEvQWIvcw?O^W_/ML̘HFJA‚ *$fP-4M`Hx֒Vp5{zdI1)ghs/R#5:5S: [1n=|YRR (X3ǯ>ɏT/Oe̅Pw'HSrK08X gx& B!H$P0sfWHX2O׌tAKvl!84&kᄂ~#S3zRD5GPhÄg1r蹢W7.C#rwox6yht\hND-8t^ÝcqT"-'l-lxΗ O4/ TtD{tE0c[-D, ;ޢU3 3GX@M0c2i8!iXNZ#gUZ͗d{VIP _Sc2U=L}96uyͽJmj=>zq+&vR}9Q\%Ej\VTFX#B`t̀uQX;جc[]T!?u^jS|i9U$iG&<ȓh1FprQ"5a 1fz.I::2e&f[KVZ(u8E.y& ȄG] a~aş<pG"T89Ȃ.".m>͟3;c7Eɟ(VB4(ׂ[ p2@Kޞ;TN%4щ3u؍{TbxjɹzuT(#x<(ss _ )cND:(5dTB{ @9?-|]WJc75`Gb+cb䍏A?<0Xe8l&@@-M6&r>rġ3C7<]#J G~/HvslDuY,/*CdL6' _PIwrc.3HTAu8nXC26>6-884ghN0Yp ]fL(´@=63߽[+WQ XA07u-AcLS1(Ema~z?>,掜lcg &;\嬥6X˽ נ; J穀]֩c^iS h FV[xwsU BH/57pIх)ҽ,4bk4Awl>n{P|skضUivM T oR\0{󝘁^FYA]SsUKo⽎)"S=.C\שTA^/Cb>qԧq @z)G_6jWVȷwtc!3/KYZP`e9b dkTA1}UG}03Jvq=E^d$ /<"R_ vTAAcg,T3M*:~XNWwUYX{6(@8AG&+tZr1QU1$^NP~rer'6.Aeúcj2T >t?IRw[l8mc˭䊑EgA4L3)x/&WTbX zokccw 4M9þP>b3ḷǓbz*f%?DCM Db7.`iU2ړYi:wN=2ݎi?VpBTKq䣇duɋT졾5N/kV&~(9c%17j(aWOOt;I=)ﲊ Z{1v"hZ0zg> . hq/DGƠ-4}q ,!t 0\Gx#U4tIZ"Q+E̫'ڃ<%9!PK@6PW 4^) QJ;WC؈d}o'V 8V$A"O% ?ikSѾP[_1NӪ4׊dtLzpͤ3x L,ƗC-@U&_-a|`%.p~tQIdMfv,ϳ*)VmJ ^ DIE]|j0خ莔%sy7tI]"KBj!9$\aUQ + *&Dw*K&鴔X3Ega4hV#Ət/1n$8 Uڮ~KzgN_9LWl"蕄R%EYJ\vLt  *#f:gʩBȯh]w.xi]̖j)Urj 9'lIuѿ"DXi>3*tSf.]=Y ՒS_m̨@'M^t^؆G+KBi?n;5vHUGߡY^V9^q1Ǭ)IS3Ԗ^*@,‰.GW %>C֤:/oϣ>@Vev{Z"CKjvr#ϕ.'_zjs{mʬ%&XЈwI1w<>u :.~L HA?ܱ\W3#:"QYkaR;*M[F[XyCjkݰմ::8Ilf ?g% r .7cȏk60(gV#(@Drŋ]oA ,z 7LM#_p hBJʔ nqj"mt&й ex=v(3(+X-lݓI1jxafxtJeJbM1,)4 Uv^ȇle$Qz;&:bpleC~% Y„W;xx2r'ɮY꼌¡DEtXL\ |<*;w$|a[_޻64#o4<ՃVjO.OL!~]ijB:ΥB(dp&;]H!gӟVJyumc3[ pW2+{d9ǐDG E`L. <sm3o\˘ p~1aɾ>,c=˛jYz.;s.ms? aUm!S&S=o [_w@h#0JmFm *yLXAfyţw<A|2wQuaןf_W=ʒ+x=4`jN)p QgxV8\(~l48jWml^$%uY/]'ԝ+IXkvP_ /21SHfL:|ePzhcJšlk/;Pm0U|rUt%ݦvtPٜ x03{!/:)P**;2FϾD.e;r@=G|0F+ƀk[@yD˶G^{?Yٛz 4ep@[Ռq%_aJxywݐ^XOi/2y;*?l./܌2v+ec$aZ3Fd`>K vEhHN)ŕҳOP\'/wC_iD A =2k п^\B)Yo󒻺,VЇ> :k} a*VO9\|ue=TyјԎڴlK| ˠ%'TB/GB4Zdorԏ+yYezʰYRL>o6ॲhd[oYu-eu֡=:𞒸0V X^z0p8C VrHA4a[9)/kGZkHhB؄W|p-$˕ ,4be$Ԣ|>Pc$ 81qX3'%Xĺ-qZT!e:YUIuXD6{D~nȑzaWb-Liڳm< ~p-8@QsB%[RzL{0Q`DFR8HRZ4AIWsj${~t  W /TrG,Iaxb>$p Na N?Z# 4spHOXJt.צ4(܁%4=TZELF=G2򦵀t8M+Qi|hȇ?NW-Z6CFݔsx &ypT[#oIV2KrڠxwwW=n.p.$`2SK]cXۋ=ZE][4u[ r2nKjIhԠrk/(G.ӎJgˉ6pTv_zc+#+zF_OkQb_OFܴ=Yf ҳfctad5%{q"rkp}'%c4LLٖ0o-$c[fFeI@NZ'UM?D*Qu`xWGKqg è%\FpmԒ''7_!?C-QhqT NXVN(7i>l~FogW4!Ϩ'1XrNaڈցbnb8ac4m)z6ʬA[ ԓOeFUiAZ8aK740{].0Ӛ*F3d;jhF>E:Jl+@mAIC[ܸLڊC˚_kY|E;MT՝U@ |@s, ~̱y) IFٿwxK?;ځA *,04|( fe_HYn)X魕X|*fQybU'}`(2йߝF@ff7'`Μ=\(H.:ac5E/D4`*"AX)&uuZv_c}IZUM}}Unك7Pl=>[nbŐ2/a9‰jFY2MNu4f$f=?e#Pblr4D>o]AbCL%Q͝eϵ }j]E|C03>I}E oTWzH\ű%EJm;ܗ͕.$Dsۜs*"#9eUjNFe!GƢsg=6V zu*f CI5&c_ r8%/K[=~; ; ـxt*I#6K,{,IԔ$:eOc^%P sSqW q_"cjGBcC?h,g #(gMNΰ&&Z^xo=ͅFdX+u@Aتg(;K4yX\Gڡj+d7}9+P'Wy?{mE4̲{üVgulw/@̢ +fpѡcV7'r5ܲBe Xb賊%W "M{B|Q3CQ5.}n~v^ao= x@wl4FùgdMm̋ʺގHAU S&Y%iq Q=< 61RR7=&k/O^f5U<.Q8HB攉u;:Իw~o X~NBX "hvQvkƂAM~OrRyIi2T1c#~VB0ԯsXʼnu#xR۹$6{ЩPBW@rj]'m~-Yfo; 4 6X s^iES%ݧw^dDX˔f4fi*V}. Vg"+>eOx 8 Z\>44Y5. W .ҹT~n OJ@7B4҈3xo#*J;g,._*^K;2H4--" Ĕh|qÇ;c4z.VIS'me݉3sŹ*)37ԉR'weZ#<1 rrr dL>f U.W%ųtf0_ =̍gܺg2͞ NGe^[H!wJxHN4[̓KMMou(#t ܿ'>O"QnmR*\f:ᒢIQ?"aҳYT3I+IrӬH7nqMؓPAG>SS>U`O-jDpxF">a g2<0$%A7G_iHM."t]xv ܫ.\Y75/߭Q`|ae2Erj*,?) H :!/N@O؞Mˤla,6٢wvmh}fݝG' h[ٵ _O XxI͍#YgU6B`hvW؉ wd sK\DEnBnk﨏B"YP56P:D4>T:w' !ixqm;Xٲh˹X5[^ݫ %N2M칮NNݨ9Uo:' XF|LQա "Ndw&-=9L D+Pz&Ѣ6s>QX3Ybl*-XhIQ6|~ĝMK+s/ZLcpV†l8>8`-X=Rj2bb-+.P\봇 cN$YnQԀHx>D;*3YϨ`lYu3M))AdnԂ€?4}K@nG~RͰ 㥊P53bia2Cw[6Af0P QEzuJJRy-:yēr@՚_ R_/8?ؖѣY*T acLUm2h$LL8mm-mI2ғa"I À7@Vno|w_ZqtX$yaq*;ނZ 3VCoR C/Y~sEUP0y6 U~TCq`6x3CS(QH"ohR<r3Y߫ xl Cs ,жe!Wps?4 *wp(,BqM1_M,mꚏNнާꞇ[ޥW7g@74D"ȱ^7+Nk[Sv bStk?;shͰuE%@J']Z|[U1Y37j-7ku6ܸkddFrCI=)i.xb ІL->u*sf7X pEX lJASFNM{ÈSD?P%cYH7 kT>A6lXe^w'wqDͅF.+ׁKcV t 2FH~O-g.khZ :UQPVpQjHnԉͿ+$}D*WQ %ȡ:1WIHD!dXm3cyM@Iۨ) 7hM_e WɽLm鵡Zt+PaZKAXfC S[:ם>mTT:SKKqG# NJl 6SH™}BGNh!QN|}ϒ^\k]^/Yz#: v &r%]im{,z9@k)(RzZ#K/`$/"q(vE=X^!51A')-DP:%;ᆢZY!ڵ@Ÿ_A=s MUAM ~Nd ޓ sav $2>W@Cx~i,__R&)c (y`_ӱ{|?W+hH}YE?PLPm1`n҂)/c"y$Rhao7~$7_:p^(9SZb?kD>tN_K:D^gnlNg˛HyF" C 3T+ȣXFγi~^8^ܬt@į( :~o81\S`ȫ`!b_6ʍ & ƺaBhśPufr|$J*/KA%))YH>  jvfapʸжjGG3"**+F}yWeLv-I ꥮI̷s& d1/ϠqbS۟ ِ mjQbR7-EqE@+ K}q`]Vi99P8cC _U8S?o#mLA|{ffcm3-$D<>r4/KCXjnxR͋Ȃ,x8'ٻ%6޺!>^ѫv|$鯻!Iӑvn8q*Q9~k֕ɢo۾*T~}Kv}OjuK:޽Ţ-(\afy<.  ز$m?][xʫNlɂ scۮ[Dt_Ч_DJVk Q \۪rǓDGA;],i_IF=jzK$AЍ͇[@jKD~ G{2|Q2Ғۉ4!$ror] Q^o% YQUsHJPR^Yo嶵wB#Je+Y^`ŘN񕼃(ؽ~꫱# b]`R@lFXCTȠ΂W}p apicuϑUs\lr(X\T.ίlXHuSdZFmwkP߮NcLz2n֔g~h$Ycss0:Ψ"zG4XxO"k?#t19[+clW>5qH#}`u .񜹲{h{/o)OSצ VWŏ1 y.j~1P\8\ˤ&0yH{a~Ji|%.Aݍ])HQUG"]3=ՖFDVYm Q@KAi% Z4yqjo#iגe`#DKFugjJڄa!B1 bAdd @nsI=21ѽOL-l[{2=:')rQkG?/Lӳs.2!)ғ䐖nK{(,!ڒ?|w=ᢐW2IFE:/Y4 xJ!5=δ7L.{F=R31ܬ|'kZrp4v @cg^i<G$ֶ5/e *΅ #+5)>?_ݧ8 ,H=M>]!AS(H1ѡY[Eһ^e#K_N>N}A.\^;<\M/圅+(s拔X\YdXQGLdYUqMA8}"* qFEJc#Rv? rIzblh;i+iW3a1q"&EC=yWN]Z5+MGG nP@2GD'sw4T~+ #Eɹ &2j.a_h^Dr-+ ?ܧT8H$$UmJ3[96)_FєM`c瘉 E~4ExX(ҝ Q̩Oo 1vhTKp`>GDe"Xrqء))j5nP6hget _Q#]MMBQOM}H`I:"s˹q˭+{0n>Il32(.n;Wj~=ޫB"/|NM8o+_nl?ULkE!W`mxvQȶZ 7FQĪf XnBsmJ)AT[L$fKOtFa+YDpx9B$ld7o6#{Lz pm?ЦԠWpҐl8[FgHFd`Y|2 uFu?'UZ9 K^ ԽiE3Lp\B@~͵̰4fB5[s2aY,U62ip]}n=[y/_N@(qAs~b;BMo`p`qQ*npyHCAmvGtMt7c CCyTɨ*Eq6x Q#{|7+rGA?7fixziN#lU=<~, :;?afBlWG"yb +uf7:i/bPbpt:/G1b8滦(+j02B%+7v,t$$*8MS;xBG%%+2800wPgc_`t-T .F֦Y/C5K UT`35sgx^WKB?,κ jAt,N);֜XXꔨ6a1ҡk<}N3U9>Y9zO); #|jeuz%{=l"],w^J6[RxM$ ~*Uʣ2sNzV&g}_;H{|(Tnb诏OorNPNiރ6$hܘe OVfC{IiM{r}ב$|ĕ7.֜<+|]0 ,VCgj2u_Y5Ϲ{Lrą S 5LtEYp/b!wN/.m9AK<c.fgKjZU@9owg5gۚ ҙvl$.3S'Gνӑ5)s#LE0ǮRlʅdJla6΀Ǭ (RelTR3B m0?@vQ;ࣀC"C+p]ʉmɵ= ^8piPMK2Ԯ^&"^q(BK!Vf<%TD_=\D<> z֝htfXӍ w음h)?ϥ-OsmDS[gGWpxF:iFT\ C0>4>? /L=_b G7Dѐ˫f$Kvv5ScE 8Z()k[os}I #nO߮i*o9Kn'#x9mǒJℏ`j( ݪns6JS8FN[>>2*;1VLgJ^: s!6_!W,2#5?Jy7X-. &wŊuW.3bWSQߩG-53$*+n I|ΨH.3ӿJ;'x_3{D%wi=l?]b~7ashwaX^[ b'HU>N}@O/ Ó BBZ38 C/зKg02Zj6 ~$ՀeTOOMfV…CaHc7^ʄ1G;9Tc^, :Z¦,mE 8MV/IJdn91~/Ǖx-zdXOO,:si{kzKP4a ~xY61<F^jA.j?z*Re=fV|%oka@- [ox&IOD;ZP䷩|˭[ 2u$]!V՜EVC/C_~!z|lb< ǩb@D'MZm*yU\cSsC={q}zӲ~(({%xcIR7zecUJEذngR\i~iURְ9ݞeS#_Yn̴JFY0lFtuLVsCe\#B^{Y#,df-2xzG|;W  aH Ga@7%le4o[';Z4kP@Hk[7%L- Y7A@tI3CZJUZ6uW"AUaf)xRmy^|{m McD]m'tSkyٯ^8jDO&CZ 5j>V5=/ԄX.Ή Ld]cuI{whߡ#(:3WTm|EANh"*(4_NHhʃVU!ɹ_7+ޭR#=4myA: &;LHUX,_~x"$GQ>#ZrwJx43=nDrrBr%knX6&~QАd6؛ A(kI^#*iXBrhK/\)* X{wv1hV|FL*iٽ8 `(/&ު%<ˤRخurhFnf+vCZ .aڳRzp&5 Ȑ\=|Sp'=]B<[+0)N( @ tMzGb\0E$CiY߷':̷,ۈ P`oJxoƫEFldT{:tT.QR5MPS[eF~ ߆ ٻ874IrІn _YL2Za1} |8IvP ok0j6 r)qV\[p:r VUXtH| W m>nZt\5/'H P \,Pi$F')zb?^sƐ](U~ΩÖ`3BugvPhKVR#2`k=ӫ>&\0-ݣw4H pMFfߴn+-+C:j_vJAĔ.;>Se|=Z⁻MS5w 4;+8u0UMP|62-}86vpc OQH; =]WU&ydR ^T+{Z*PiMdy j}2W% &Xs*=_ BDPX)H1wXP2[YOBj!eYN052aС })zħv 6D_i=6(|~ŅåLkwd`<"F%P3K_z{W\QQ.z’+U ^g‰$ƕ~6@J?Hp*.d&YN8M mV"Y3l3^1+CQu*h\}lhH] ZJ (Ô9d++965MKMgVac<‘$=UU 6ϢFc RMzKH"JÃQ{Jѽ҅ONYD!Lt>DG:]97<%ӞD>Ǹ=yvw]?[xW8ΥX=Q]ODP!"ϔYo!I6VlAwx`8Mpx˅K )U$P&a`n?G gfnzkOXhM( Wn{E-G(XI0$7dis7M\*`7*SV|7:C_̦eM.WeyhH.lIB DˮI/Pa|@^d}ludwo5wvjX*s ZwJ򜰡R?23)(,-ډ:fhB*? DPby <} 5g4EnN uH \ﬔ3F1X$)DdEϮ_YWZӅ-ݷd Ljׁ)aȼ>JҫctsK^ !!A2⽡6lˍrԸͬm| q11qZؐTp酏xw8ۣ'ߑHl|vQQ`;p E_ he9|ڑ54 96yweL|1dJKo1BǣF)K%26&qṬH .G9gƾcb }Voe Rb ŻU9GPe3:s-z_y%>F5b,8@:*U xs89⧩t@SE؋m/0 2HC`;xML'\nhf5*YI`Ģu"l/n֒! 'zbbuNv$SEұ|#I@ jvtvĘ"!fLIX6~Ȟ~'p>+ZeC/,b؉xPKEVvZcZ@VYL2_DٌgOdT#YwyB!`h+S==R&pc{N 6 Tw=TˠYM6td9ri!1eTͫTù6@|9bvR*iCyGEeo+LHiۂ M4MKn1F7"kٴ/_J:THpտ&Zg4zZ Nh)ڡka:Y{1=y KQ1 '4K c)aאB|>9j굠{S{ZJ,X8BP#I~=6A_dE{'>=+Uk"C:c Fr'|GJƧ'~yۘKb``ާfjhb^3s'o]woKc+W=a $END 8\qN4+.YH- J|^ e$ pNGxH#cMGU=CidBж8fs'V8#Z) V7nЈƁJB|N|aɟwTj to- 3Xzyճ=$„W`40fmG 5-F};wZhe)BvWEy5Փc~R4DMFiR֞ѫf,Ma01G/=Ja1AuTh9i)C%0u\Z5G 64ɨm9dz4Ҳ*8H4b}'\&I5?tU 2ylZ*/˂5x;-}t\/$a15B1_"q- AR"UY'֘>aU't+܉nuIA t z=ң+$ft)Ʊ;Q<r:Wv- 緞),%.*ęKOFC\irơ,R!G/~\ !Fvyp5齹?΢qΒ!fSaZDlf&j˔RS\ݍ._cѕ.m)B"yo#*,+X1peoM)ɋɫ9RuNW:|AT|U*02U/R$^ߒ, !ӟI Ԥidi˦_gJ~jZLϵTalq镁1͑39&59/.}"gnr.j? %n-'L733䁇"ܜ|\/u ofM!'wҶhd_rʒAM_+1/26ao,^9= ْ:WQK6VMޝ)Q`MZldײ3TiS4@lwM,_,sCNc{p0wѕA~cmݳ{m̸[qZ21Yxgsۯѣla߱[dHf4K_{1::5h؅J#I %1^}6l$Lګb1x Q/hb]a7~c3C ]$"Y_l/e >gjz8m.Kf}=|5H?}OW.>2\cG!^.?_GClֻ#(꾠_Tsa+g r6E!m0c7)kxRqp]>#]}SzW]NU*Ip>ںq,BAcxSB06Qs?x6ǪӭjBT9 !~̸'[}Eu4y;TU1}W+MR̄T!qƤLʇ ߿J.Kv[tT CSHApeGjcE2NŪ.g0s/BkT@}!m,D* M8^19䶞|@2 f ܟWq`ﵜB%hfkf?'-w@lsX/<Z(ajQȹǖ`<mm@ d=\`^BLK9,(" x Isy@m(1|"6P!ޓ&#o(/°ҠFLguс9T Z:|{n;t^8BN$X}Gu%|yMiyU_^?}w}8?ʣayStXw[k'Ԑ{vTŕ1pcm*{p*::g{쳐 AY{JQއh´JU" e(N=՘]'y;|wSqפp҈:; Pdp N҉:6Uv[a|;\Y4X.]^#۠AcÝ^l`vS0-wdH+$ S6\(RN;*~q1R kilȪ *yPiܳLN_ٰͭY@G#d>Vj-yljPJ9Z< SR{E#K=Jv~ŷq}Ir?#^};GK4 &g񀳸lqҐgXfc6P8ŕ}suOD@|8K @́ ʎdC xƩOiC#̇vEuŇXId]hƤQ`Rݡğ8=$=U"ǐCiE%k4c*`8k*>'2.Ƚw3_ÅO@n£%otl47/>M M64DR΀@#xgdvKbGiVB1C Rݴܴg[MueFf\oO&.>[TQMۊA`&${ fATs2&I s1R ƫ/F#Cw6 ruW"쓊y8SUBq5>dhyʝ3#>){.` kKb4Ե&?w{C/ڜ+&qTz ur;CwU'vIsv0ؘ,gE:vR/R p,2Y&!RdxoOBdeP6X@Jywp-$oL FJ KǝMnE0wu]i>#D(=džvF@jҊN PQ߀ΐtJDUWJ[Ⱦ>UFD Z|?th"SxݨrC"0Y l\ؖD?p]$"j& Op9h5Hma꧈+1 pt_׾iӛUDcNL"u|( Ϗ1=6QԱeڍ>B@В$oj]e]ӼT`zBB찔# 3w9 pߞ$V:8\&n/2ѷ"H9dW&OJb!8hX9H{8V/γbg~/hz(ï6kZ2FzaUz0h2<*4{ԽV$-; k8a qphސxTK`ANO6U4\+d$TΦʶ?ÚS{t&R n Y\eJ0/ .b(Ne# {:w 1~`y*۰֦qFF zOu%qHv-04Etde†I";]ѤH{Vϳ 6Gх^IsaR3a5ﰔvu:Z;M9͟t@Ӆ!6i3">RCa<tz .wÔ"%h!9ʩN0_a¡=6V 5ӫk -$u\4:X\-=}sX/u?_=1 ە3G9)Q/ɮYs)VTH lC+…GKn~dyXs= .L=4s4B CʺwwX !˱@L@3}ō33xEYa79BbU?jܝ 7uN*4/5!B_&3,R'L3q*`ۜۯ};HZ]܈46zueBٚ0/eⷫf?Bъ]"PQ  =Jګs[Xx3C6[Qo8KGE YݟY[r֢@v./2+bEC0YC } w "I<"!`?q%-?/fg(b#AQ>KDmT<} 3Bywj5esD9n{j"6R˸4 6!k#?-k:z!#kmцU֧__Byr7N ^y}qbTh= fd~@_)A1z>27.7U-bx/ߏAvDqzsKn/^falFO@ǏP9vN>\igS(;Y1(1G@)yU.GD7Z0,}Ix&`4($WKw%/|;J@jAJ]d+&>ŒcM~rҾ_c>JAŶaěypE Ad)}XzP˴cfp=.Wt@Clo .Z?پB%NQ#e&J\NgpӐ'~r_ۙ=yE=t5x8SlO+kg5L&^%/j,CȲ,Y9 .aM p"bϔs؉,M216yGbkGw)RR;EY35czU~dU*Q1|4v”v ~e|20ﶨ(ON)BZ1j?1#⪜1?r9[fGo%\zϢ d+ ~0, cMgU> ܫ\hIԢ9;PF@➐:Xw‹;R=u\c *684+=cdC.^(- e[~FWNuy60^%y] x)U TITtevU*ؕ#:oΝ p&4_!@]LI_:0Sp z#ߍz@3X`tand jWQ⤏gl T F8v!i6pi#4O.NgIGڰ/ܘDepyog QQ qTurvB)so rB2 _$a5i쳒fkH r sDK0"IM$1iuNy]nj1e> [>.`9wMF&. wX2>\.(L'H_8]qTfY[P\fL/9LFFͲ;pg DXՁY gOZqxE0e{CO5< T t"OiY9^Kao g0w$ۛ*78X%\*` rѲ3,Y"4΋ <Ϡ{SFR)kni=,v)Д#:fsFu I@mVAa\O0yL+Egn49\IZߊswyINV5Pʞb ʱ;_oG ,z͉vNw)L t_WQjі;Ht=,B#6ׄ bw_f60Vzɢ' 2^cCf:XZrzDK*|dy}#_9g5,,3.;$51|z@a&EIleʓnp `_;<3K 'H4iEi+YpB>XT+]a_S2h/p!;LnNuAH7BJ3bU?ڭz3pmfWfp9Nea0 9\=;f.uي}5P]Ԩ#7U9ZIHmYbN;t -`Ztxw K̈ ]_ Hl3h*9V iW*אK~CP$#jrW =@|`̹/DʯLѣJ8O }PIaK#٘Ϛ;ړ|&HYNOxC IXfx k,Xg1,~5U?S$&S0ԡ[ ~e\nEj0dY\sZhl1 ',LL¸xJ@k8(; Hhw!M&+h5^sR0}fܬ/Frk( )y6,iJAaڒf?t#<FJtﲟ"Mto%Qlb QkND`Ѵ$Nds*N)%Wex@z/^ﻚ3WC4Y>0fp5=h* BF(֘؛ |DW#Y`ipI\jN*ܜAdDFPADRJ3is{ۤ/@vmpsHpyv]*jx2+rY:NcZl'hy1]ރ5 ?cy = %h h͔ 6=]Ғ&VL~ζ,l:﫾ɡH-cx+v3%mt|M7P A7FFw%#:rh?m%Iqaqi[0a=_&;˜)%3 "Ћ{܎A){VX`.C՚YfP4Xpbuhvk:L^ɝj?W+86o^RGGM4;S<ȫ;WvfXe *t3ι`R_ /z`b6n|p$/ Om0ˆdեp=TsUפDwGi}4㥅+\ya4fCBΘ+168Ƌ}PouMMfbqo] Pܴ@~a>6'y[T9De}(D `53S2p4 #^}D0^]8 a@=#e-Zs)1bAu[SAc =d1< @SXF:돤AW>r)U)$u-8X42TVϡ@J.8|/>S("^?Ll!Rg<@_Ħdl+|ιf7)BHt0TtwטogweewPEЧX_D[ruvSNbfedk֭J6XzM!ϧu,}FF"P5e|#ӫ x|8MRgO sf/̔*L -A摺. z95c2`2]⯡;Q2FP_<ox^ϊ5qwΔJ,Ӽ @ڃJsA7 ukAľ8gr1Ǫ=ވ:0W֨RRod[y(#%vm +tQO`ԪF@qcI+ĥ'Տc1S1-> -u ٚ֫)a/'N~WŠ}uA3w[l2\ =ϐԟs1tG'($+7ι2 #0kv'Cjj0ëBHhkóbKz44`G$, c~FC}IEj _q/ Fj H*y=d\FH^ݒWEp1S yVO*aU1~FݴoWCG1wYm>Y4os?>!7oc/rw)퐉П2G9-)CwPV@zDI6$ `6,) @`ZmԱۯ"v֢51p_mk?{LP4LN O6]ojѸ3~ wUȸ0.9;I_Gڒkj'̹P׮ٓ;r^O>WXk_䷦C=x4MADFƟ?T1gq]$l(Ɲ*G3!:r4a пQ n5Yѻy}/qHxr(Kc7a* [P!?X&UfAbOY\Ȝޠ/ <&?V_'Fi(K ӽ-;KYCl,Lg .IPe }Ӡ,p,yhG|[G\N̟Ez\[ k+)8 rqx4Ff# A2Kcе4[zEȐ𣛿 }bږnp9?wj 8)/ʖVPO^̊-bKmrp*)Vt,-&.O}D0t/\|Uy;~QMָOni]j-\.vLca|P'o@kQ A6L d.OqRn~xQݺS aa}).'ZsM{6;.t$0溰FgOOzj$N#Y)j:S'2P|Ed 1DĖ|0?u7Y8=NYEq۱p.i i-c4X5SbAw%p(, +6wE0^z4lSޞʽЏS9śԎ@螵̫1r |paeV>m]iWe]…4M/NH̹qskpX? ˓Nƹ"bӲnIǘ1#%ehDEP3D}jaK;2>(t.tY91|rx9`*Rf V .+Lڽ>A݅)' F?lDE>Fyli}[PWAAޞ*4^ͳj@ p'q2ZFL^^U9>2 A]~pz:8Gcͻfoj%4̬`4`R(2|׎1iu?qE:D3iX0%1k|i]wz[R7&ilrVB}5_g;:XFa0R]3Kk`oķjF,~9Ѡlr*f䔟ogZW,zEt*] 0㛒*خP:EdArJAUQn Z$VtgLEcSo`F ePL\18L` SmLyÈ:h|j(͠ڷI,2n"9vJY{Ahk@c*(hv* Jc܇za"51R2u[d_kߘwSe3VB=q^磪V#NrJz!l/wRQjXK:/Biul)FTVCh&aw C)N-t}|Z\]&TaǓ&!3֧ t&/+tY)q!{Q-lhBWhD@ BRu-> a.4-+!iϫT12 *Cvfy@/jkXaֳAҭ eFUvY'fITf[p|>_XtL}:_忢zw͌,t0zR#wo2X Bh"-: %v)GA]epK)PizLtLj{%qK&lBF8Z8G!T'ETVk mꍵP=]2w1ȾyBVvXZ2L])F &*Q\f:GDȝsx< H2v>p<]艩)^ēi; mL&7Z-}s9Qz0Yc6tx(C ݝʶDGX r^֢A6>M{*im6Ì>>y#2[1f!'"4AMaxGnWj4O2hHNr3p|P2,D6f{R/a'{ZN;̩x#6?ѓ'YG,`9OI,qv S~Ȁ?LJTKSh_9nިܝ9$3&j T0,RѺʀ. a[~A.[ų|iiv#ڵCTOW>ߑ3b<) Y/|se J:jkIT ɲ-gIkl-ѐ[}8E+$h$dANƾ`k'-NPԡiFV˪a\T TAw,y~(ӺƑX?QF}RO!1C *bccc :zgeJ<1ӑS52+n(ΩyX(ywsygQ14UFw.nD' ӟ ރHC;/6'5;*BHƹJZ,}'iC$o/Bvy^$.'&$:f@`co|[GHUQ2`^(:م\(wǴ/r*?g H:qWˤ9Qb~aDA t};[.UX/fC5̻{xgJlEaa׷ gІ̌CeX|&je$fb[cжb0qQ"ҽ S7I%PWreFYU1^:*`bXo=+elS_=6 $TXV,te<¦Cܪ @|%aG2<)Vm h.jG30A} I6txKr-^Y CD@=c-F5Nm:DR- .Z|uBT3E6/p2hV]px(-tqZ|z}U^w OMC<%Tm徽ŻNPǔF jnU \TAV\cpZ#NstϿA0hs1^a_|\=}f  3wIzԆ:Q TJZЊ%Y=49bExkh&(Wsm(\25$vU.]*:*36؜h3r@ؤnGҡBƇyf3q@ z=/]" DV`.HɆ].%g qMjM@;U1kC>^̵ݏ \]3am]>}6IWwFw xRґԏ/lxn:lo%[`ɕٱ-$$5 WmH3[4ªm擷#rě;&ApSU}!t7/#EX;9 o/yц6-JyZ$SS}mnU097ij +q2 bְJ8|S"_xV~Pb -Hvũ-kkahuNq,S a{*%q%E`$0;CeiOvmwn*ls^`R!Ӌ{t~@ -+})0֮{G4N:m[bZG/n%L]NW#Aji8ܩuCnpA^\RX.12*ĮqF҃FvUqff*WʹhVy^*-d:նҮ?u]|avbh"@ʨ壅\QBb.mfI47qdG=)[ۗŪۦ~B.[r\g1q28}*'>cB?xW_ IBz`jZאԝK#`zxN?*dU˝ ǃmxAz@oCч1Qˌ]2iM&-lsr)btz"ڟ wV=1"߶;vvvyө` r P&Mye1<{h vױqbYr)<%3ݫ$0a_igB ܽiGbmUITs nU&]h;]Ij ^|Dc %huY(ۡX"b; ӱM;͸r8RM vxL))rН87?Pn+۲zLJB'P{1lϋ~asz>ꏘaR1(WP_T~%9cr$~t/SvQm:5׫@`#qM Rp͊ę'oKt[&bkOVR%,ᙈ`y^$#?ژ2#rJB.j݅ލ=Idodyi Eк~ 3*V+Gyրxp8ܖ !_)hid@pϕ-5Ŕ1KLa)T(Z*dn!,Z>vB?aDˋpW"LZN')O;pcrW64]-aE0B6'~@2)4J .>`H6= ;zjљ84B2԰W5j?Ⱦ7 9 5Ncd7Led|A|lRH?T8o Ŏ?_SQO8&d8VX-ɬ(yPc-KD)Denо(Ji\Eܟ5ustonpUJ҃AKN9@+H>z0 VK Aƥ4e3Pb$>ˤ nh0UQ#`\Sխ55 x& M@zêHQFZg(Lh:7[ÞS_<&Cmj:D^Nk-4(Ջ1* w Jih罀NVVDxBiPemtޠw#!t9 l/pn[^O EW]s&1(_[Aew'fӖ#M硋LSRdtz>Vu:mqYtlTG%5Fub2&@i"f<*&/pZs̄dVv(y3:؅X afªN3Mϱ@;>|8֩'򈟇DH*ɬ?d `%,X0-ZƸ{sm:`P xčA%+|lYAįMC~CMM6ZttQ_\+jĥhNeXӵ<֏+ YoLE[ jIjhbcB*uCy6P?ĽNU2{^39REnRm !3~:PCd0f !@.0- V*7X p!KJCgĉnP^r(Sl:{i$ewZBdsK;& jF+|F^EվMPsiP.mT9bў=}`>d롎AܰVq#I? 6s$,`cL5 1Lf/`m4i qk$PG;Lt,΍2ZK:Бsf4Jq QG&])l "ꀔ(vIt,1#4Bp=Fdel&4gJGzc=ϠL%D [/3=5TEqRHt,뽇9KU /u| ' {fշ<3QC ZjdAAuC+z…0$1д0fѿ\. ȩ 0{{ƙ#++Oaأ"3{iaƑDO\ zO/b*~ yB/F.{duy2-' |Mk7œz垭U%cIf3g-Zҷ!ъ#D8/2$?^\Xka$f8ᰴw93Sm(qcǢAV4Ӿqrhc}J=bʴ``읶Rn@뒏MEtL ` O,?vi3@')w $GqZ*.DT]TM㜍FXƎO4l.1s񭍘`LXh\D~y 0LO,7eRG! K~rJmyV܅ Rtgf^yk^ t{&FB~4$>dTUIejX+ ?+t;}|dGZZ+ 5ǭΖuI1ӵRGok7y`LYoGmȆF{! KZoEDb# KoT3 t*-I`pƋ<&Nիw |B;Nw57Y2eEaşS<pe&(ᖽ&Ez@{#jZ镤1Yɓfx՗XOZ}X5;:lNV2@ēZZ֬A|@ )Q$z)Dc-?WҒ| p'ʣPl hyXxX.e60|;j!wYw[/ƣEJTS%ݍLp ݪoU&ю7&eYpeiѠ~h$V.mު1caPL k¥#Co06 7|ꯁ(-J4` A1MV,;F7t l^Vr3Xeqn,Ќ9ĺ>;;G"HpʏdKhLׇ֦64S)ZuH+kqt oRy܆u6ȚE'A˵q:"-Px;V:Gt=­#"Gi+3)Xul&#O#Bg'.͗f,,sKfZt2'Cv%.J#|qFQm:+X_H' f_f @ RJ\e#0b'$A+4(|6szsՍN7S1!qbD'+1F\ K9'3d~۝:q&.eLN$7s KFV3Ͳo qD%:?|f|U=qKni>SE|4:}؁2Y/,M>g,<ȁj#m(6Ao=2;Sh"ZePΨkh=t2/x]'q%7e @[9_Bk0߇j;ee8/AB[nw,Щ[C 'If\Et`nIU nX/JEPqVA%}%\\0-:p&H$9FĐ"qW 6{$:r"CVeDBWr %mEN_5_+~K_Ubk [U18+ՑN[+Nxgm~sdIQb3LE9TnJ:.2Q_н/؄=Oq-vL.nRR-^lWp/7pe)irYrTiHГ0}yOL=`2p32cӻy&~o$Tb[9TF?'Hlڑ^0#ScRN򹩵ӊWP!yrSQPwmfW7I;HPm6PI|55t.JM2{ = p?e+jh,3Z)Y!/wơD1-T8Dc{W641@׏G#-xվ p 5[A Ca$M|yϻ~"(!,\5/+=_]gSe1k bq]U5A2_T 󶱷ܩUk)Pѳli,/D(#b ̸!O MԺ܊d3{F[ *0B:X`m fGN߬azlh_nUF9U?k"Tz(BJf19k:+g͈iC)wep7OT?8$ g$h72烞 WlYA7"!E27 bh4Id2Pj-_G{|Q s5ZTtəMУ4;@%Kǻ?S5AᒮÎ_De] ]^tNŦG`3#EŲWnqُk)&SȼV,ݙ^GRrfbغŇ) ~/^v*PIy9t'P3=kGO}󗩎}zrnQ1N§L<9F}9.&JP.XA|W;$V(סWpoD" Smv7YQQ",Rxx]1y~y fS0EY|{ |yVx?̗F@;&ERS#$pc_i]d s4*I=~OZC/)v"3Y >RUx0OVm<ܴ,ל@dlP7l%G#Čh:!F'M4mS2.g4Up&KYLX"TPvKM(ndKA`ң=%lG ")Y wC/J.*FG?\\W~QB/I1+h@[@i{^#*>66Op{N TwAmp&|YO5E eu:":: %FYSlt(1 DY΁sI~o +!m*l#MTjp+B gD*y9Mim jy%.~kMx$#Lk#Lju>cȭb& ZvNaT,XoYiAV_w6BMd3w=d1TcުbUqyf v*ǫx[ N6ǺUa.{o2d~? )x^wz% ;1@1tYRӐrH_մyxoz,:U]9'e&K6cD{ 5/ :>9@*Ϫ@wJ_a0Ȍ3o]+'61e)=GӒ %DxF˿ӂA ."D@o j<;#4cE)f%߻(T<8۾’0ʣmdW_mUIsb‘"0&u:Oh?K'w)vY=Y؆ 6}JۯaKPJ~\ţuo322V<7](5cNzJ. U@RHtY,̱z uYDhdc44^? % aH ?D%{gLs<.0L`Z!uAhHzQ[RZ%왏 =8.od)f[ODSh %P멽*IjUʺJ"+K/BkD٤ߋֶGur0;j\b>*& ! N(v(pCwroqpc i&{Ca&f2{ v Zuժ/q{:p)dvqzyy.{PMqjSvʭLm9q>D1Og{y¬(3- 9 L; ujc< st=G?y#e}/x!$0\Cc2ܲ0#7,J6˾4$ * S$mfPSFƛ] Q7>C> ǷT)3ؙ<mն rRm276vDςtzW_}к8 fng<[|/+q>lN+?AwK1&f 驱[ciWkV} eĖ ߲DI dӥPtʟoW0i)s?C.sCy$i~%\b?IV ؓgX@J\Gi6 P pS9RFrpScfCI+"vC@_oC^» 2(y߶r[ொo ;#fF L<{>fDrЙ^yirjSk:rA D`JU{ (zaƼN~^Ħ2`bp+.tX7Cg47MI0eȮ}wK:.XmUk,gI?Š<L$رo5`ϑ,wdG@>rHj̬Pv%+E-ʌ&;[`l?W0EסZXar7c€?˲Pz}SfTY}{8-`G9|6y5kt )lXEd͔*n3[t?:@cր{ @c.c>/=ښ o:D_qc s5N$c@KA$}q%|?0^?z,uN'(-QT-M:bN(|{zrp_B"%nSp n@|HcM& 0ֈȳyOIZOSH\ߜѻ|_dG1Pϯ'q`'3xZ{4e;%+ΣetAU3^6t``#3~}HyP LK*tTtWx~+ [m&$sMuݵr#qV?#QiV3&;0*VCr$GчF/Pfq"rKSJ'OihL%O$A+*O"jrv K0PD|.7 \m/ו:6eͬۈOAh•f;ڋcR UV!^\&YB޲a6CHqa2b4Ӓ^`nq\Di4{~er°T8\$#U{LazۼM8(RtV8&vv|ifO+Zs*.(1c$ܠ>ʊ gvi4 m6ionH@GtmQv0۝w;ƝҎ De#fj{JG4% *b2Go>=b4|-GMf 6z<Sžfi\-0fߒ^ PBI1m]5UJ5Zx&To{ZKwب'cgMQjegz"NEBx)0ʸA}lWAFaoJaǀaZr0,'9-eURőMB*5? cR0%궆$٭†p:TitU7%B^Hh< B_"|fKsvh㒣K=^u#zR}Zw}Ah9RPN ^ zfq!:>KX{v,?|\/љvxpз?a SϐU"I$&!%}FyZ@k*,w"megv(U>`dtEcM [:2;'[^9j}UHG5Hyz⛲)0rv`0{ҷ6,ĤG7,j:4V: (T h#~+B65#[we^!&a,jjQQ$BnPsr2;TB?lYu|goY,pD[zF-U175&uɿt߿]-Lj*ވ8擤m͋URttlu U9 IMiJbҹ׿߰з !딟 {FzX[^92K-]pC 5]yܥ]>svZ9/~ O-ʩ: VSd|D(\**w=,qdgAlM2bcUe.l*V;#pkY8F  &)#|'(is$L-Ϳ:e7-hB\;jFK39PJM<4Z\ фz/FZv|E{'ږ~4@F^6+ںn~_Mlc:פ Zf nT%NůE?LX]P,8p|Q'V$]eI ڑ%&pB`fa-e'|\2m Fd\P`ſuGd#ݐ.!Kett ǩ?!.\O2lbK+ޡ..~YVI0kY7ٸ3067/,^׶#]A[;WY._?.l-[BYtrS7[P^EqjedגD>OcGf;Zq.r;߼Hkvri v~j^9B֜Kl{Л9Moṇ<7#Zj"@r-Ih'Hܮ:8hGv˜J'9o3Fۖ3H=NLY)^BqiQHnI>N\nfL:V2 PX+eƾI 7jf_wLB(t1D[>ʲZH\֙ =&Fj@q6Nl3r0$(u6E:E1k5#8ע…= "ֺۨc< L4%˵I7 .n[r@m e] S"?_s,뭗NyIΓy 2`wÙ΍<1T;hɤ*eKޙ01;hx6\%*_ r04vp`5)wu/Es~ZٌBbΣ;_cUTz,.c|Ě6HtS`{FFh$W>=;}r(=/5gS}$t[)@o,^Q訮UY\1@@P!a:.MV-myfzK*űdb0_e╹ְ[.dX(Jn=n>)pNXvmi+gձ,XoBz'ePs S@d47vS ;1["^Y '|5DTxMણG +Icg/gpA.,p(uVYC75|/ȅc 4~{\tWS xYg^ Sj`5%TCP|QxɌ:H;1f eLL#qjYYiT-PAHUЋʂfU3`HF.H+?E%]-!3c < ٝ"M4<r8LwDRpst;LcGL2a&9\s !KB Ͼ}h*mlTp@Ļ曈rɥBI(3ʤyE ) +׬KSI@1\/nvOmc}#޸2ht6G*#o6v%ĉ?n }슇S 'j|O :LR K 1*OyY߅ pog&Ud G*C|>1Tdw9tFPJ5|tap r01Ʒ ГCo]g<Ў\g&$&M)Ş"4jҐ]15= 9ieiv\}*>t$|؜ao$i$anGd6[KN^aRDQC DSG ET_dz% eG:EU)-Ɛ` Pō6i_Oj-p=DU<%_KG hOKle.5쒨5y4Gi[ye.NJ*}։ g^ћ#y"+S}0Kۤ>/ ZL/^a9;Z_q\s0QG{v*>]ҍ*J*cބ2JYPkOyZǧb7t1[j񜕘 ȡر%icI&/?P7m86Ͳ-Uͫ X <QEջ`v>uc'*%Ɛ'aB? '~;Yp;|x:^EFKV 9X)&C!%Y/~_qmJ73`w>Hh)!{O+=azPҨ\Lno&RTJF]|97D(jl&9-ObAaN)7m3W)f{ON"v̀"5HȤqa+n bHJYwcajNVGTF܃`?4s(szD.]ym.*YolhXdCG~Dv1*0,M_u3 :!tu!+EK\_Vw<)OhMzVZ Iߘ9gz@᢫AZ*KDn?Ktj{h9ToT.?J8(Q\1@YT|ڍ2lK bhn|72\.wPWb>Q9NM~fP=8?OKԄk9j!nw9~AD5b5F}9,mszFSs - x.:Cx: W'8` "wz]kFb;D=̏v]7yp=Qn>LjU(,G1q[-Oa&.Ѫhi(~,Ԡ6&U8\TR!' [.l<5 ]\]+iKb8܉þCkEw<''u! wxP%7K%tO؆7dd*' 4S,ܚ N]ϥq oꎓS!mm,I`ݠ P`۳HQZHg\PEUyɽ\ Vy\$ZֱDUOgл7YFz# @Zt,eoFh_mL$g?,xӷuI/Pm"I!>z̆ YG! ]zo[ oﱹZ?ͧ/)\RXd B[ԥҐ> *-^G6w٨tglP%DiC4r('Z3S0*{\y`+~BXg~`#hmT:\l]7a\3KfcO-f#3(G FeJ +f)'mtpG1lR]1})8|!I.>˶@zߜNR菑J'2?ꎺa)6+3ڇlCӓ *Я-'O0dz+[l{(s;@&:z³uwl7i2#O&;c%b Nv> 8fTUY9rRM [l2[|xI8 ΂FM662,M07Mf'{|aܘ@^(| APN7Xm`7J[9hr4Z4?+N XdCżNÊ9kc3}:ʼn-&F6i#ף+ MQ9`ߖ5{'puçn:yglE&F_vQ% p3{Elo^ȴx0Uв2Dë2H:cFbH+P.e)K_7,Cuŀ]~D [[˿tV<`'+@kx+6hEʠm tK evOzLBm;+fooN2[Ruq瀿0umU(jImCI(E6Ex8H"be7fZҎmy0$ʺ!w3H9V9S:qP!oj\ZrNz ϫwjphѸoad>r̔F$Բbmzz f=iaMTA.eDE=8F`zи];k*BDfA *x (pnI{1!꧔q2˂W'/]RX2~ vh]ZWwx[ JoRRLAwUWFJCZ֝+9 [loPk'f. Pd2-pB˳97OAhiG%3w")C_7Vl^|^곅1  W,wHhØyg ,Gyr""׳}1; .S T֚DϠs`stTs=ך< c@qXD.|&' `ړ{\f#jO[RH[ckxR` ̍+ [ D"F1`'H|ʾHj(S&H.K-Tpޮ@_15wn ft-#C îD_rahp& TNNO=3ʰuVVOYdoju<GH ;$|p`,>͌%i<Kt>HaꆠJ(F<Qׯ-pR =f9QzhdM]>xudn:20"8l bE%zSwPWh&#"88ay-v{p`겞6}pvOcqֻNwOx* Lhg MVorKh$"u gbsv2Yn]7[~C|03]zCm'ۧtLkQIUvrFN#M1SN*Z,S%u @CS0 ,i{Dno:I/(iHʒ؃{QsPn+oz7eZٽ1F1v޳{`}ܱhOjPJ箭гL^*ጓԗ {Y(;b'v_ʤ/r릀!r@|'F蘡9\,|m/G зp, k_1s=W^*4ۄj'+͛ _@tFIO|QgQMN&X¼k2GɩǂjO_X{'F]J_Vu"^ $#1k>zC~"IX(XR\crk@ /@cI˖L)cO1Ƽ5 oˢ2$ &^o ņ̴+Nb6ݤc8c2Б+,Kf& k Oȹ_A(G{tyV(x3m[]i![Dr|5ީFlDn3(Yu V3{΢a3g !S<ԱyMk,$qH#M35f戍C?j)Xi I@a+sPݳh<90_1OŬ)Yѽƥgj";vL}␝X})믢)[6Trc@s)Xx!vq-uc7KbGm%4߷ {t:Du(cM!,[1̤܏Ў7j~s~-:/9+Tw|(0{xêBB-9zia~e99j؈9#^T{!&e):LRe^nI;4.R us tX3g (TTрomuM$Sm/Г_PĎjsh(T)7G=R]>` {_= O׬*TržZ%?0w?Ms__hIKW/G=`l^Lg5rD 4x>Tw_KRz)9k5끤)1SD[ m1Jƍ*9GoWDoSWi_'tAja#BTck3r&Xj61Iג}2J>H]Pd"k\O"NčIkig Uʤ@sZh:ڳ!:c{|8{xͪ@.;b#a0auk16[UU;mfDq;\-Z{&N:/pjc8 V7n8^JTP!8_ną}D =?Dk8 7eP-|%0A4=&YzW2!4Wי,E*Ş򔣫>VH}c䙤ު+~"/MG8"sH{~B]#&#+g]O؉'E7LsQ; 8셹UxA2aJ)w&vm}Q/nY-<µaVlZYړw ? zA.IuV8zsAӽ6XkN!'K~# #[JH ux><(o5%~F{Aغ-MMgH@A{S*A {] ?~;$0׈ ;4zgn0XfGGMq4pt9I_['#5䲁tg߃Pl I/l1tDfݛ-#:W^j$t@;&ۥW* o}p)r3*Q!J%m7HNmg̔xOJJ\ vI\ }*uo'dܬ0z䐹X1aw;+I4cQjVL=4|'P )KL?j7N(6XD!}t :L~/UScb<yq&yH `NJKUzaF-?KZ?5@S:j"OBrb`ā=}mY/~Ma*a:xO(NN3(hvBf`O϶:r.6EmW-T׵>a_@ãF2po#6`̘h^b>䓬tJ^."{€Tf Dʐ&O-\f_߄Du75}=Dk@z∄#qJz@:%Bj:a/_'TN%?JpO#fkOHLN`̅-h*6՟U)d^z-(15Iuk(%S^SBH -`0{hN5,ۇx³ [0y>98b^̌IhmWPnfTd XeECxbyZ3cŹM$ͅR^2 _fc#P 8k0%ج!?cuqFg @ŐJ(5 ]1jIedR{A":{uLTF_tSy >{<'rX61†jEp~N_yHt,Q$7ypC oU݌.ʧ5f@STu" &2F ;N!GI}⚃#?(-fuF Ǻ68:2,4i=bi埱3vTDLR4tmTd XaC\$٥ru<_ 1`{"Jq!DceTP5oN]; oJQg@As;;<~ڸwdui3?oU(SsgEM"d/xw7hа~yXA+U p,A)>ȋꢯ*_EqMK:`ZO08| K5P  /_࿸:XZ Clu3 V`A:Hig̓'c$J̔~_a Ϋx# ސj6u!L X¬ Rp:d9AYC^ ڽJh&Ϸf*&` tє[;e{ኄ˷ՃH+_ *;TQ/zt?vH}d| uvz" !Gƻ$?cP ʆ3KQי) 2'tbE" ߭`fQX")<Ķ: /g],2POW!̋)m0wWǓpm= tw%R0>esj>4A!?O}f$뵉0c%yşMgy >ƥydvtC 4FN3Crzّp[XܡBZ62yfXC7k URv勛O Ρ_XWW&Vm~93g]A HuɱeÄVd |fKBvN령._% cuwSv޶@NyH,<47dy;=6UTЭ._W6yG !yRbq^kX_luK![=tLv! Rd&[mhI y!=@o20?ȍ[J-vS":3>uZ CLsg,h; ƼR3IsH7pyio+WC+ldi2Ey"XCv%s(Tne[SdhF1.}hoo9TһFۯx&'% *ln$ہ7ti~ 疑CFɦ*3iP-d}3 Cb4<RӦ%'3 CcOxke%!654K/:NK0̥1_KS{_/$;'c8Vlu@[s^.Bf~[0y))4|ޟA5͎YjgT>zh[;aϦK eo%͒>ew*莹}pONSː>g,6IWf  ̮^_Fa{XE(И@ȁQXϠnl>S_Yvs,bG-a P~aEͳm?U ^kZUQ;[nV^|p/Nj5#`C%[RE~ϟUYyw#׼Kwm1ij]1 4\T=I ۦkMiv#VRºP(2} SLlˢfYU`djom.=B #]ӅKʒ7M}T O5 ҒZPt LWwJ#icI|RUݕ}|Z}QQ%5XPY,s Uet&_Dd;#ZZ89urcS!n Nyކ6@ʲ0x;hW!ʊ ̬,ѝUBr*Jmϒ %`U׾2٬ tJG6DV)F?JEO-!lx9B֊ vYNwy- J$}۞m݁$œrH Padw :w 'hԤV$YG8hLro. '< Ih|w*E%ue0cbIz2AUJy*rynYѴy3999Mz}>g)HKLYwn^%f[_}1Aˍ\"L?u_yv}hw\"24d7љxѿ mf0*xPÍ/QAC8þZUˇ`In V NJ3I]$꾓t8popT|=,h 2^ӡ&< 53+#$ob r"zÈmP-0 P+YbkL.UZNAQH%g%.M(D8u`mB[QfK;y\8Sej-J $1yUFp`N#7"[H-B.@eVE/*,U^RTq,+ANԇ%|f̬ZfS'=IWf<-h2r 쿡 ԢѢj&Smlb'l`]N!ׁRgOF$r]vRgz[9B'uqwfCW]abÚ u zLz]ky̝2hǃ+O L#EUnI*gs gFsM: Rg !6߯0|f]L&'7'%B َf&wܝJ?ֳ]aBMP2^MLwjM>VELxHV0IS+Xftj6j@Qsq!.kى@;q$pƍE["~WBu J`*dܿ* * r"ڕUHdgV{zgliK[]f}7,ir4;OxXU2 }XxAxս:p# RI].ǛwǵOP&7@Һ;;Cyo)##tJt97Ƴ鞏}soBeo6|SM:-LB_jeu k4cU㶏Fq>g%rRfK#&CG)2@Bv Q8МO } pMm=&) aí6׽#3 Vm(;#v+& \&)yHA=]vi1dIk 2"49H?!0"wrkROŒJ_ͣ. صeK~B}8X >kި]W(zSOޢEk4׵Y 3ikw\`mI)g|.Uʻn{zQ;:CG/f!3(ܨ)~LM8|UwVY-nY|c}{-h{xn&K̺ߺ\hp +k.r'#Ɖ"cBmIIyjlk[0t2(q&N@8}~<wKg',a 瀣P$'=o=F@- =͞?2ٹMyQ[ XiI݌o0=F@DDdV7_ͩc^Ӧ7dvNX̬cY"x:gYBD6 P歇_EUf!4롧1:6b~4]% @L(?GL:[M6!Ez8 j2"]R+XLd+pMĒ/Ko+9wi {92X4"Ö>%bB`lRcxbv먼#$)W['/҂Fs!JΏ9=:.H>#o3aY/!q #:]=av#x!|ž(-&k!X\HR &GnLZ1e\ _(]qYmz)ђ S#.;l6XsgN\|FOnt;Rqjɍ7EYE|-üXefkY''.0kp]Yt}g(w7.ݜ$F%m(>μp W8*za 8gL3+d*ȵ(j2־S|bEAQ[_IMj3uGۡ_N %C~rPvP˩q:/ڑ7w Ce@e aU?(aV"Pr>:>Q %")&lݍk.> .}d{DJLHM f5,FfB`8hKK-{l>hFiTd#˗8t;"7lmXGkjm/a—KimWp$$]W~S#TVH ]E4GaX0iJj_i77˂\쎆T!vnV+ ʕ3?l&>W7sY3gy& k:bC̛:dʈgy?ZT2U/AbV;(,,kEYK;->g0PԬB*M1wAI-},, IAD[Kȋomf3%ȷîFKϴKH폟Z \5 i^)R̻:tHhO-C/ȫF.5T~qWK@<Пt͓69Z3˿rҾIS~sCOEvPUa|sЃTPl؎eij1vKnk&@d7=%+Z6*6<6$\&ASd gዹ<^ ܂eL) WʞN |iE?·q4ᗹP4`W`-r~5WXw*K*$uobs^qDY: ng%{z/:|&N17MGE6W2\)>]^ˇ2zj`〈3y&ڼ=T䶖5{j \? QȢxa3y ilp@,$um3(=֕cYCx2|6RCpJVshVEuY38KC_?cl2Oh 0^|˅lZwbY#ώ(D44}VNM+RmװE2u/:Q+Gb)r>sQ'ݨAJZ{XC8@/4Z#+S¥NCDZtyBx{k7:O+HnޚG/R(a{c-1OeWItŐg>DUf9S{E12FSSt %¢qqs'<KSUPs[2<~.rw! AE{-͢չGUK^d2'Ae&:P^(n~2s!ZYq c-J!s^XV|v +}uE|YmN{u[ -,mTxZ%pNDXW|5CycY1I BDtAFj.@Kڅ h).O68zce4OZ@]GjG }@,r[XYn_ =+y1VNۘD^|]RX_g%(* 狦3^ VkR8{q3=Rj|`Nz '>(tߙ_d%aR(D.3w nʘI&XJE&%Td;+F0[;zyG-ZM#X1=]FR +Iod1#Au<6T=_>NN 빑?\{4 IA !j VaRi[s&#?bJ"% /0;Ǽyϐ02/1Go:\S>3]K&`}J~9!`P~pS]L tߤp<9 _!3ޝ/}ᦢnnqWT[ m,⢨Ȇ^3Ua@I%c(OH! -}[Ɨ'}ї pL" `BPtt1vOÂ=޼X> -9ZxMeH=l1gÒw=,bf%و7UItìƸ"Or{,+4؝3{Fdyf؈ و;t?+#zn8:ٮ15dj>|TdfJ٪醚N30ַ?ra;)Ţ,w|&w욙VҾ[˟PPdӒ'A .]]ޤ6]t]RӏBMr9~]d=: Ē]k^!M6: }w'o*wG/*`} เ{eqG~yw= z\)O-B0N? v_5lDV!x"聎w Y׃8Hn{D Y*asb킥U>QR$]˲ryN)f*~,CPI!m;!:υA,l}2wU",a^r睗I՜~Î[Er&j @0:D3C,Bt(2yf./IJʑ8PhޟL"8 ^LK3A9~1s,|@Fs|\ #wl?d:qwfvQBIE'FZiֳNmJA@1bJ32܈lϮ%ޮA-B1MR(2BTDO]x>/Qj |a7}LI=M@avQ/R/nZve㐓TX;e]`dg8NN6ytK}eF+J<LɁ^ ZmI(H߄k:nit?*cd-@Q^"ͱ\蛁JĆ 晲$ђGL'wTN)`V;-jć}o7Mn݌I-;xg0lO 7"a# PTJ9bwb#^7QXF > *ђ-6"@&qٯG;s1[X"Ԉ&.?-&iLJS*ylZO;ܤ)\ߍ@[A ;Q'OX=c_l{ZnڬŽwM T-/<1!231IlRiwv0kHf.~ (2Ldr#̌稽R­4P~@yq7Ui!Ckς B[&/cr){3}}NĨ@D\ggjݷJœ\,;*p?/@x 71a4Sj⩚xd2ˌ:\$lDWO/1d!c=`0Kegp% ンnkEi B]hTX;'ې,oIo<}l/=2%;CY| >r+.1i$44cwv|CQ9)`ShfRJSc. qlO([(9-|',&mb8AW@*YgC3 9/$s-,,e)RLE&\^@GC@ᜦ!U,u#J 4fɿ#_4QɺȜ/6ݑ]#1i3p0˛jzI,E[(",0`9 )}Fk9B(5ƿߝch4 сs=ÔVr棯}DwW{(0rֻt?8Ak#;R8iهj~xus , R?GCIϪz˘6Oj8pP1anr=ޑt HV zgnv)}4@5a 4b%tB_w>4caV+W=_Ύ% 7 Ppˡe4l$H^f>qz/91 In(?@^s 7fuku9uDL `=٫+&gEէe:laveG+ A`D׻ƞC"}Krktq chE2n0N5*ۿY1 &&=}xO;l_q]|)Bb+G4f,) Xh}5%P TQ.|IIgO&`]\.1}:H~ughvCQuȳtL?9ܧ:m($pefUAp3;2%$^"g9E2j=e06rk F@`TKBfW'~QH PFT = t'f_<&IS,A~7 C1Lh6ZAgh8/:HHƙl\ ԾSYLdȏFjanKAăr-p@tА  ;& yvR̊俫t.LY@,:p cL&Ɯ l|"Lǩ:p }w9hޤ8/U01!A׵%|0>'?UA*2u~TJ5 k7fXǐc~'`SSf;z$.`qhk1D# Q XG:#F bZ*/C2"LRLH[FCOu[Ðo?I dߩsB_.S8Q_<'e<|DNh5A\ 1SlIUW3]KqEݼwnUEbca7V5} ,iDKE/58uiE|m~ļ]´-e$B pj[I' `yKGUGqPo{Kkr~aG^W_'")JG0֑[fdݏҤtVѿ ^ J6 ʚPʺ3 ,HޟGDŽf-a38Y 5fx3قٰەV o7m -THY-3b%H$TE['6\݈ dWӊQmeZ+*2kj)-??Yws61I2'@ވ=` &D)XK4Pob.j`ur >Zv)^bDiL[?4`Ғ"Ҧ>zPiw]C PZyj2: E#@~HR 'AB@j/:auK\hBLA+'c}7jDocU} ,9K X^V7/8*tEꥧdS`MmP`]#tryY/Ww4 AIiF14m:YCB B% I{!IaDET1*o]b͜q|o9@O@IuAj6d& QC=2$hr IY^0X@ʺv?˩>uV5haQ|<ӥ-֓E(S>~ tizWh%-pu|ݯlP/Z~aI2<ǹQ2['o*GݼF\ 0lnp ёׄyd.R`; D}٪ Eh!~Y̋Ld _DfML֚oG<߃;f#1&JM F0n\|2{-rIb}H1Xqb-33*@+7hV5N1LLj\pxO)dlųڮdQD> G}G(i@ndjt{I}:(TlE, q!*OozAr?XJT -%nmɣizjp?I=P#*s2ܗ͸1D5|2 wy!ؙNRfȮ|3^aɻ5*$G`<"tm+҃_ŀ|k?pQ^qaGz H}cWݧB:jh%DqͰo⭺FÌe7%NCZ\ȂP 2NYR8"Щy\ϫ;"twzyYqy/,ȢLgbxϒ* C?aq0vw7d>…էVk \`C+&\#b3Fy<=f_c]G4K lEkפ%/n)8?$igZ>Š< wb.#܅K؞8R4@i Μ:_=zson3v2z_X\.T_u"pIz32HN7ZD5炲UL/%v}UcCJ*6N@|6& k#sӺ;k>|ЇzuNj8x'?e9y_& ?ĹRwo"NbL7[F>ɳxBiZwsok2 !c1* ~ePέCp7Nd UsOQ `w_;(~d9߮4 α) g7rnQѴx?p! ~+k!W5alI0}0g^+ilW䋗-ѩn?8 LFeœ#ї7z+Emblk{,R9+>[ѐi46X$[VRgUWo-a)t1رf@ A3'gf+.<'?}o46 ȵ))aQ:J@}/l2ح\(3\qRS)57J4?A(NA[g;v5oSS:߷j(CTI}&M"LO'yw9Ӧ-,ONck OkσఒFˣp9zVA.F#c OS٢}ekfX'zYF*aIcsUr ;Za_?PҬh@Ht_3<3-I.,H)i gQId:[{O(bQ 6ќp/ݘbʷ=0,#NWWAjPA.2{8᷶\$\_u Zޝ(|8W^T2{×'?f{]&PHdT+[ȧd1 W&Rc4D%K\D-ثܢ[%FVb՝b`WYY?Uxj|| r\%zӲ 6g0/ia_jм3V{ӸrjәE&BbW3FV4BiX ḙsNZ!qSF[̆Lh YʷgB"-5YBA½DUV,B}Tx>mr ĒG9ʂG3gҰ5| _A2!\ʿI N#67 Y1$$F*tc!/ ;әo%!ڲ RBœ3tpKskx+DO6Xb:be:<3lly 6@_u0ƨfu@Aֆkx̲lJ,_-n{J] ʱyAu,SעsMF.a(qFS|L OeOa /P)QJо*èk\DVL}ʼnCykjiZE |QW^~z7^:w_HKu-Z?0 +_#"韋^w6$TOa`!.VutvA׆--ZH>C#K\$W.z Q@1ӘJͬ0, qb#7270̬@m!CfCvM0 &b}頫XqjJ^OJc&-Qd;*xไKgXƏI nʩʥ.W\BY8eIZR\lʄѶnjuH"K*R m&)>C #{*m+`$rQecēk w4# C(Hi>T|X~ ?Mc0G"g68~ jKT!p Fy[G%Cf Bod@؈Q"Gt<5/c!Cj<NptYK;BLh K"i؀04+9ry&8=ms~4cѢsQjy--CB42eHjZ^UCs*$Ԛ61ÖHgڽYlR/yCn= ir8^o9}B1czLb=Rg_ȥ2BMv?IiQ zOE%CpVSnݭ=aqobՒ a E #OjZ0nk$򤤤0q]w`Iq*q=ߒwr. Q+ھEr9YJy1m2ʰ:@av SB ^}I'd[\4f)A'h >U $;"#Ր,§pB|:ArMܬm,t M㗁 T7ȅ]1g=9JzFK >ӹ¾S(5[N3xbw*(0] ޑq zz? &a|i|7cv. HxC r/{#!>[$d8{YxG˻pa%C˒j=Qʎ0_:KsYp:; :l9w>r=ywb pzj}WJv3IYu@)z݃ІfvwL=W:t~V$ɕ&X>5\] )-HÖYeųk 'xC Ĉ@Ӥ[Q@QU[FD nm OgP]9_%+G/!v=Gn0lZ7EL9(Ń!]EѢʝgrI h [/SWG`o0}0$NW&mL3@ Ŭq 7odK=5g+*[?ZG9^65duߑ1~]sɪDEr>A|ɔ`qRF]^j=)YѮU|_E9kX(mCZCX\K2E v)p%F1L[Q.T*bbG$8- "Gs`j戵Yww?0 q%oƏT= 1gFLLC^B310-ؤ.(%yj'{״o-"#k5XqK/4q |OE\du_U9GOQs(.KpO +.x}=V.`Y˯J-L@+M!n|A3r9f{y'XB]FKt6sLtxJ+:RZi+(:s$ن$|5MWSABqUTmn"R }?>)CD?ڔS5c$wJޟ24R-=>l <C."-,#AfM X`폓>q'u1g؟7w_4pIRFzx*P^?D%s})}Sɣtup W\xgUMH*vML5=+S?q/JfktzGf7,h37TKF'A! -T\P{kb굞,i<@ć=3`妯EQ@.Iq OAF$~Wyٜ}N(u-sڰʚgʍf?N/Ii{m$[ xsԂ-[@\3 հ[5QKwFB[)<ѱ?RTS9cHrQ\p&0aνMm7рvL+\H/o ~ B(Jzo>i"% f^"^a.Dj@~F gRPwiNe(_E\>߲ZJTs x;d ;YrSdb)w47Qٛz%v,5ۅ^ىfe:gĤs =`k<)֚hVwhf?$.¡MwgQ#IA2V# 00*]ÆybsxOk_åpt-Qϟ)ikIKk)~vLJAka댣%=QUcؓ^YJ/p EbOoqQ3=7(TS(C7#zp$¬Pg %Sl  ` mnһB_{ R% fYl<8J m~>֔T05)_<+a.۝l6zAt9rF=43\Y#V[gòi/4$~Br_@f/ ixk s_+vd QGORߍm㠄U& j)+[q*Nqt.aR;6G[2(#)qŽ"IGғlUp2hI1Iٕ DZDgqNuC8y?j9K/BuTTQܡ(|adU' If Eh!|F1[BonMXF[}V,e]^}_\x ۽mq'Lt,}W=k1t\_8qf⢨ʌs%g.8H3*gF-ů |9d"*EI6AG0YtSNV?=*l ՋBj[V+glrZm&e ncu H i D00ޘh0 &a4UH|P1{"ViajjgH$%vF:>r$@q8wWAhBpwmh^qwo3pE[5'EЃHyאgඍH]OH@?J)IK +sZ4,.!eKWTL 3!Cg ۑ]D2{:R67[8h"ڲS)p{ӎO JD/,_i!847-Kc6O1c=߆E+\ _0|?zAiWp53Ъ"e6d ޅR}}2{c\+:8gh_Գ :UY#sNBM&oY|(BgbRѥ'h&}H_q @[B 2kH٪3CE :%m)k1˒.HS/a3_3 /:-z=hya ZhIH2nɇP+L p:6TyB >ɥ"vN+7!#, D:ҩ8QSGy{OyCzIx/ 6Hڢ5Lbv #oqֱwR4l 3 iNI5g>f\>#)0ȋu@m gP,V9ixkpg` VO4 owN'J8uq-԰uq- ܴ:M#]5`vaL$~KZNƍBޡ4G{ڭh:Kޭ\$s!;;@\,?4!^RZRKztRL99vM!C(Rv 18Iqq )em?a-,LBh2 =ԅO*'|_Su^ޤ|?Ћ#6^9)&K]h/ %C6N2_c $g sօŔ&K6f6+TM;͡)[$~fd: O}(NDU2|{{P|H/F?%a,mA+ʶfTe`,_>Po5^UfFbYeXccx H qtW\ j&k9 q}J;\ >NpDTYlؗMt+%.p~qgB@jì^  }@/yQ,+ D;@pyGH*ՙ=GDĤcџKaP5%6&*K~ޱsx|}=JPX<k&~O)u8-ɩ(#n 3۪NoV?ՙŗtEҝTh$G-Vil7b$\D V13ʹfa':޶ sSrnsO#"0su,"+;Ԍz6ab;  Yk .o8L |pxLEʶ߅Noh骁EIbHKv+RMEe|_?f.}JǹO.:9ȰU7Nz ̄jdRBLG݈pP:w. <|b$ZJh83wedJu[?~SZc kuGEJ$t֨[Ks+\̅Z"J*8Kѩ%7kwDp֥v璸8@6Juݔbz(z1zX2^uMN?"saυwC{XmxF*!< --b`"$7u]9|6Qf Q2FDŽZ0m?"hA;rT祣Zq,n|z SOQUK=@߁ܘ9P0TQPh.IH;moy~ʺ߮WC\!MXkE\w! l`}zɬX-ףoNo ~uD lj-Mz?hn,{^?ΛLw (`^i4b~ʛ_. Hq&J?m*[eǡ=;c Ek"̦dl%nQȞȍx?SX)"9Rڅ}%7+гDntk5%DQn_hP,`E_LSĔzH!s&df_Zj[Zuy`p d F-yʪF<*w'qSR9w>4me@hxyٰ]q%@ 7(fRG xyS`aqCn;=\x\LQ]m9:1eآ䥆(,^Iܣerx\4U8&fֽC|FI@49LSO0?,p7OsEflmVp_(`ZHP:c8gGdO[gK4t\GJ^gTu mVE;AGЖJ/,]"P=-8Th"eRs2{dsǺėon ~Q=+b_%J;E,~jd8I1eW+ُꨡ#S1,=}erd44\6kSv^5%bxBҼdl*UY6@Jt/LA Iq UF s9kJQF6nzK aIYMGK* #qo\N-NM5<|ǾmլEM1 |򤁇EPqۙKC!8t}WT':@+\KZjɍy^RLfR%8U9azsJxN(z$SE:t<dgfFlp΍IwUƨzCnYqc +:vHKrP(E b,l[5FD6 Ip_e; _100OǑ}v[,O{3vHWM<8"8VuȌqkI>b;l2CpO(,?ƚs iVxf*Q^p}t9XcX^e CRP-2;ְ F72I Xm~A4*H*Fg2zgHQ)ѝI^"+Ԕ:[^M"Ju:peG0M /vƒCb [Ryɧc!^lZ>gEJ/aKK_3C@G$St0UsD.ۛyP˴ƫrrtZTD`6p$07ƊS0<(]\_{WXnOّ%K?dիBYaedAϠP)=`j&)Z lY*Up7\ ZA{Nʊ|1+$ y$H/1q2zqf'H?̩/{nj*jU#}3iP-*p Yئk(VY35rs߂m D}b'͟sEres 㡼f"& 1߻v.|4X!?4v' ئy%xzCZ_- tqٖ?Ԑݜ&viwsn򸩩7\wK<*6iWq"+ڿ4^DW'. uU5Y "W?T(ФvJEl.(y9F ު@c^fgF4ȱue<>an0Bi+Wber`4#8cY)nVtS~o[&1>~ {K2޻q n̚K <2F5[sw pQOo{{Td>tQ˒B1^q"Gj[\5k7wB׮F34mǺWqe<|%Ѓ'@qBb>E hyw"wGxc剨#0(KX›~0-άǖ2(rlMa릘]|Gݙ6uFo1$ K˄{+`ǰuhemA$RtO5#ڋN1[-khh;Ukp+HH დ y^Aй0x6Qd@] T@xNOJ=Wo+^9X#-_y,Ymީ)B #aD7;4n{/) KsqFO(eS1 JA]MH$+RUI!9B%F2a$QF|ir4,t2{zS]W ۨ5x҇_\#Άa=R!dݦSnOև)'a%8蒖ʱ`wuAY 7r")K)yvBv|Fd UJr-3oI,:5ul{a2Xkt ەJ>oʱ,>biavy7_#UZ䂞l?V6u-$.a "b:DŽ CnDjcK[b*3+ӉfQ Pd J ۛKX(@0nɂA5/j2L:K e%`6##{mґe撉}.8MU ?iGM%T(Ltѣȗgٮlu3, m< b7$~FwN*Va`}3HqKN9~P8kNu-NhmNWEbRBQSH D{TGwS#f"Эa('j2'/oqr [5()i/'oj]p@}-Beb%(R q YwmE{5^h8.(%וG΀Oqs ,=Fs+c} }M߲pC|.]Ӄp8x:B63d9J!]O%8ȫ4O!mt+z'$hA+mv⑻J~RI~&uPEs$K`;6f';xӏun~1#CK9ii'*h۴/0.H<_!aנ{/~,ñ@N@zc"۶㡲wa$8KO(u^S ZTL'Ḿ䈊%?3@cLjҟޢ4h;:s䦦m-Lh#Y8s%.J@'M O{I;>?ԺR&1Y1_H2\: Tpyu?*}\G "5K *@6֖dF:&m}Z8nmD 6Q~!K%di9PJÍ+7Oz;Cϔoj[oFЎ3M(wA>\ 5S֗L(|qpp]Mvߌ8@J,'L 7clYw!αfaVQ2da5!'z\!u{!eJ*Ә,+TΏ6H@},Iv0Jª"!5߅Zn`̬ @GM%ٚ'j}n~b BVɶ,o[@*Y>+Rka*&xH8j&3(]B  {_`q4%Wbo#.KU6v4U/P1"RhbA7.LK$4.;~(_a,:8)(#@V;=í߬b9LFq+7 `JLV(8{s t J3 ͭE/vB|h#PZ<voUQ|㽐P6ӴtMyT|vu4s@C {D_ʽA E f [êݧ/MqR_qHQeSDȴ 8+{uԀMC2~p]P2ZUc4_xc2H}ʿ 䆝oR9Jl* SOJ+&MZ/OQ1t]nv1GFvK-^$'ςaFUC+ )jK3T2ϴE"_$p 7?% z&JcGucdГ0VU<锈=ʷ7>r"^. 0XͽOX>GCʴVh2 j1<$߂٢s~|Mxݠ YE\]=w$7V6T~1\YPszu-rʚ$DAaʙ+חPPin`=l9=s\&D Qa ))\'t[xt j{fM Su*G8ӘLOfd7CkhG;['x*Ywʰ o sJ!d(0-9uyTgfE(݁vHdB䁇yѺ?efPGKt7LY;ɏ|^,Ig u,#ԳA#B>籃1R\jy?hXc Lbr {8d)g+k)HoL ."ѩ~b A3vf ,˷tE;+ ՉU(؞߃E=Ut;aS-f*X_'RcHCmiU֙2/1v T9yxH ъsL ՕIVMҥ0hr+lmߑ,p78qBAhA-Y4:g йA5}~2nʹ,Ch{r壶]CkAxȦ S{+AKu]C2۽nX Gw{R=p`r>)C~ ]嫺)^h&Z(s rTˈr$ld3;؞^y}F* ҈A֒,h4t5T zEBuz\}TBu#ÆOjny>>C9a=8 yq'%$/;k%Ndϓ/K; .1ck pDz}P/Ɨ8yw%YzΰJn F^,c] %|I {ݏ#]_Mt+{7/p}w*)8|9V>#бCw~V`ߘCRDF4Hu8`䓩~ՁkՐmqF29K#Z@»Y4,}~hN%8N,+gJ%mIo8sG\wty3̱?4t峤|r qպO!y-vYoOUJTo0*?/T{W 9 ó)*8ٮAK!$ ?N}5Q sL ⍮Op[]ԤEiNoa(K{Mø ͵)PCr?\6.C%b03w1zЌ-fmYwiz]acBJU8<ƃn@Thi8qCc0hwUZT`@-mHHqk DHuȉ?{ț)Ra @ZIJoJ˓ёU4X״B7 ΀ Al_!>c=o#"?턛zF9%M 203+än7 q}57`&-k[.7=~LFן'=l#S2/W 27֨ tBv1~bN14D/( `m!u쥬~j Q:thέ %>fҿI$@ .5O$; iKh86\R 6?JmlVJW~t1tjnJC0K\%W#U0Qe(Y.~nO⬏p.RϽd}g9]4"U`O(E u\XGMSzpy~^{nPNwTy,:p19o0q5WØO5JkXHڟFoiwA9m /tXrKۿpapSn)뀰9R ~bE&cu#h\ AkpP p!\/u7mKw] !(7|å@Thg H PKʕ)֖ c@%]_U$u% &o#ieF[0LTps.-h[w ?J4op˴͸ԪH+ 4xW*Ge: 4`F_c;B8ː5@2VNKro:T} Zl1ˡL":`XJfqB_kn A!Y)|GI.f|4"N\*w&fXs+~m ]̵94B.'~e"i坲\>ޜ~_`Ɖ4z!tw]MvkVrnS T4U|pe(0| {,DYimajNGRl$G5ظzݻ}b8Uj*p@VP'8HyFޑo=.0c"qvYFY@P!R-ڂri@2wėM0xZ5m 1@ 2|ũ7-3U9e늼HG0cqaT!n68.ao.D[+8P"ڙCiJ8y2ss{Kw™_D^\ſBBk~Q΍1>gk$ ւ*LN^ &22yecyW'A ‰gFYelB_)+ΘWXYiāФ e }Į%.c(|`au3!=$NxsJ"l~*FU4mOAcD[:ǩ"-Ȣ: cG(Mjj埼,gc=@vǮnTzZh7,Lj:ھ_hǶ) Ƙb=Kx+\(o&DI)bA:MCaʦd]7$5';)` sv&}-rmpk^ ^ԉ4ՓI#Zܲ& _Fnώ`uQgD‚:QI=x,`e r5%nEX I5f2rNdD'yk*Nn+Z߲2mj5|I@%/JH(-! oزpcA gp< UE `aM fS%>cE5K./vkCo Q8=7}&ё=B}bU>,nQAHL zPD7%Kn?H9@$a];pf8ɫPg&tLmQk{Xph!Чw8!\;P}zԄwJ3CQ$v}E>"c-F+ťsTxȰAk '\*vy`?\V2kIB?'iNv8gm3]C# PžryZ&߁ݛu=tA7k;jIƪTe.u. =P뉡5TG 7 )}` Γ4xK݌3p7v -vMf?c~wSF1j_w%"t~qX<;ou㑪6Xb4u_3׺-|myBvRX_7Ah!ﶜ\\ ]Ul / p䡻 _Ɨ?яA5s7Gp;LAՋmYr.>0q,~ ˑT`/1|׍Ht#1ہU|!h¨̎bk2v\I& 1ht?QY<4{F?ͰGm 5K޼{ "p-@$Ӫ0(H?P"jC*ΩH[ y `}ۑ~!6p.> V])Qg7:btGfF%ؗ䛭jc'0\rk*J؛]TԥR4{c KSaM3U=Te p y\ɷ[(b<|Ț-Zvf)zV5VZᡖ[͹ht]Eݳ߻<)|.Q&=yW8uG#tz\. ާ7fWx$<㡮[7b=:C[{{*陚!т Û Ћ@5Ņ:]ѬǢdiv7X̧+^;k ox v8d\%犉xA-C ́eWwsH+ >%{[˝ÛO Ⱦ?i@Y?^Sb*/wvY$Q|,xj!. sB ?r4oc0_=_nː _gr(~1 }Xnn{D5ʜݾńr ",FZ\7!&aA=c:U OxQmYGŁ6FW &R0»མIէBZj㒳UA!\I sZOvadN5뵰[({,zvԣ}u-+fޠ퍐N<.fP/䊮{gH|-C4_|\|2#B0]k\t=Jo *v .b3TbQ\{;ߴl<a]26-ʼ }u0{ƀg2@W#fWgK`7FxY3@ڔ;^g'…(`C4á4-"*0J1EjZ^)\upڴjY'<$jşa׊kO  d{jKWzj#HC%PX> 8\eF2,;m6$ZC}m0iK:q}ަ 91͟$#]G "rkG8{_ǰLXzD5k5am=kOJp)O]Poa<ʎ!E[FS+Cc1 =jY p  O#3nImqnܬ-}~0nfkeTӜ-:KHQd&c[7oY+O^{IsMܥ >(kċP}%NrƪdmQt)Gv?9{jdt2Gţ{fQE ~VZVҼ&vɾxj=0(ڥ)x/e< UHm3oq&u¼,Xpߒc;Vd.ʜ߱MGb<̣OIxX͹v GK(w>LPWM#L:e;T4oE,JZB#W|j3i{;ኆ8&( ORٱ'E\`U:ov?=* J6Bv |sP`4_z݅y."GlYo (jzm蕛i@پydB'0=\m3UnqRҋ%H4M>-y>f"|zc$n;ڐA OYta_k&0 t_;&̴Bwh1\KQ@S0!>fɃrgƚN`"^J03$Rm'f}BS֟ `o˹%N,)\'*lBTO8n~/t #O,|hp4?mC\ S Þj.j19yV`!;sohBҢ~X'2zOzu{ui|c"0sֻ]l9os CZ'`{)4eXqש>y&$,(FٸUBp헱DTp*ZGyg3t )պ-TVxͰuu67,O!ݍŀk$?^%y4IXԚd/o 7ѭ' ^E?Y.ZiL)F(5I72 5edpyn2lp~ &,,\9E\A֖Co1"#فNcba\gD2ZQ'jJK_joug1)X3:>nC6 9NiaLMUjf r`푻:Q_i&[7bDZ=n. ͓2˓Ea"2OE6 eJiY)L[DvzI0wIS`*fͶۏ){b]y=o!e܂ ![6]F[ua28a#01(7-nWٴ92jg`m0ʟW;'Y\fN_U^N NqE{;qr3k4@gR43 ͏>3H&菫|8 Me΍X.KqSDG>VߊsR5 ~-lT!9iìGgDR+,$$qWu j*5]C0nx& aX@z(b^5Y}SFLŘrfˈhCh˜o/釯@g3 nD;|כ^w5Iѐ8.|W?JҒqIĠR# fc>uO<%ٜ.'`ꗢ.mlmz0q_LJpC}w&4qU4QJs_֛x [Q7\0~ d@@Yh8Hǹ9ZV)D#ĺ #Z"r}9ГyM4rU~0'4 jp3;{іx?) ̀W lyiB4¢j*,K_40-TVC{vX2F+SEBU-!Bsܫ_*Gbh6e qiǻ,IPO-ADǎh$dM){j[蠙ID wuRP=@Z@ª vz?zgB1!aty7AȚt-3є0jC1\nKc$6_HlSb@ yS#zϊ&i=;dz̭Y XJz<-.gͯozwL6 .e]I[ݰuuPWs؛D1O%}/d @X>i=Cx4ԡXBtec폲Zb0E?Gt]P00AOѠJfI_V6PWch훤X$sp}كf:Vˊ]tttOy0$$X ?@/M137vD1Whi>^F1y-XfNmx ]ÒZHβJ,gTk%vzp>ڹԐS[fe;ER͹ଆw`:9 uvH'szj}@?GcӧM߳Ō}*43D[S.Q; Wʋ,)xcʰ3e%Z~ Gw-t$y%!r}T@@Y.OE!^pYS|{$^L>6X9Abٟ>m$4a%;5<K_dVV,}{GefavZ@θy (5+hS`ARA1 ɴp !ix B<:t'љR+jr0_KMdsP"_5` 8fF?FU'ܕP tw}`xU7"$k4Xfoĭ&'*b)x‰U̶E %Op%(DdV^d mAM@F)LxbuvO_W@?4/۽eahn޾4q4+|OW׃@vyzuo cd@#fx>MW;jSDdfg];+MV$C!]=jj)&@sOS>T !Kڨb]_Kx|p-f-RPRO`nY*S\ߏ.˸&OnU9YFiEpݳByp>ӂr?o`T4mA22v!E2w_zErhl TFz\=D /A_%v4ᏹ&}/SWKBB'uo1 XC<j=_9WDs$pY%a;(A5ՒN#v/.cſSzO2{E5/L.&mSpEXC^PafK"9X Yl~V{pәg'J,s6릅29 *䀊IXΐE~P9Dfxz3qQ9)TM227/A3L),t |U9\a28#!ǝe@ݶBlm]j1֟exmV t'T5UB dMFSION+;(?7}NہmO."jyTD#xRkbnPٴVy送) Q&&"c;Qf<1c{~Gv#yXe)~+2%óJ ֨iw@kh)3\+;Ž@4: KkRkY۬/.|@cLw˲U|!+` {S!7Hu`&Gd۠h:p!0wo)TDvk3{8Hv:V6UUFwačH;c>ij\m&բ1ՋH}A|MnIOE]Ţc]u嬙'LTh qa}7@6]j;ynxWQF/b:>W'5Z6^'k^GJc ܷC )@4ED&`+l m@Ve^~٥ /Jb',䏔Bcuڥπz+lǼa\s5saca,t5.#Pc~4=4sREgfb.X"#UF|Ѳtv<|^w%솏=g< Fd1KwT ;4ց/h "K6\]nj;6:Bs@ -l]ûf79fBL9 8+y^Jv@L$$[{llg@x/nY=h 1X.;>UvO/ɍcSiN"_$oT!=%"g$I)i@R)rEV:GD;Z ;X*!JgZD055]a7)'Lŷ6ps.+͸Ҿr@!41Y~{!omE=c7{J`^֝fB&B ߅ "6m- /J}?4O9y!(h+ߦ\+煻e -qn8^aifn0L+wK1u12L#ʸ^J])@FR*b20ׄ,laV"x:v'KgVX%|| ~ЫM ndGrwP$F>$Զb mHpO-F=LsɏB(fT[gr V ԯڛ;҉D/]d_RmT 85!XDIj n :=9V.~!kNf5$W]:_ц!a -Nh*ZLKXWvWR]vJAc` :2>=I` rX"zԆJ O9D$.ZJ/@#[L*Nl{ uf (_rqcIȴB6ѢO 0 yyMGPƨW:U*+<MWz d S!0$(@T 5@cڐ&j_jrӨprw,@oޑv IJmDSn**ZU>PvQkh̹kicʖD '\bRm,rƣ u,瑃u*Y5)]r˭l}*qyeo0Y'uXht 0Hn\IAu0ڲ[^$l!+`Psv<[R9ӾnGwq1+2?[1,gxV }>n\S6 P#T~.%q-T P +3@jM(/ׯ v{3WݯQ C=fWRBG6}HkctC=[+"Q]W(EK Y s0\D=}P. [VY},o+M?os Wgm!XaWBZ}5ئ0B/HUUҠ@J߄+- cMǏL}ΐ@7MJgDy^ Bo$nuY$>$O â2(gO,5~B3s? =ٻaa⨯ls_{}yubgȽyC|ѿ@FdM i;iH?/e;6(]'q 9= ̓*|^IzVLBwx{<,΂/1.J_?fҒW*5oM4k׀UFg=j=2]LXMF9k֋::hJƤ 9Q5f*ME`7 ڋsHOV ~Ky_™o& 5:A O(i%6ڗ9+䙘4&1PzS71Ҷ:& .A0.hq2fU[g(Oہ:2q%/IXv2ERfBa깩RU>he?lQV D 2oy(,R Yd,xH{RS.uyZ^Onj,L.qhи S .+į5O:>b<ellvn$.⾏BWK@}z/(>lwN)jJ*!zoض:m}*._񠪅ʹQ+dN>ZW5uiqTN'%;iȃ챃۷;Lbz aBҔ؈2ĺ'A*4L4e>dˌ&= b_(#v&ZgRȰf*$d`ԍs>y,08)7N|jړRz}ց,Q,CV%Ϲ}bBhȵFkJ"n?WM\҅% Y#4,]Q1cz{##qyxeCôtr:}^=0u{ғι žf ~3hWg_(CskQ_Ng.]fnFNְi. Tcӈc+RV<2=0/!<=cs =:5Ǧ>:O޿ [,OI;;#1F61 J+pTf} qx+L]/ض6+RM KKmސWQr|%npX!JEX+!aNb k*^ ӛ "p z;!.ПB 1PC%4O"U@yD:裵^s_! /-.3tswJ oJ( w_.|iN2 WV.z\P0HϦ ٦p>ӺRIxDs_u>1y ^uFzh#b|:J ?*k ?MސDSe6C)UKɑ,مF54tÉOϹrfQh=F'@֡yĹxITq_sg52Kݘ}qK38zk1 5C S[66Y7U|=0W7j \ !xS\f[F]\&ɾ+p&mT)Ki̮["T1GrghM l}G^HpsH=qE""-54[=sdA,H|jSz%QL>Q{wЖ2ӌbOrj1g{dZ&LVQ廁=E)|b^+t`=|6jw9q}pQ߱xc!Bcg!w롞p+&X XU!0iL d "$s11y4#( 4R51'V1a Fuq"/!zFC# k2h4^enȡ3hrS.XVG27GuÐLQ[tÂx'#;󼽴"2E,H8adqqcG.f&V50@4M+qnq8ufkb1ʩ ?S.>ydQldiYvj,x-x%ȣCxp3kj ςnczctϝ$D @J dQF1sU^T᤯W~O2nkrXs<9{B6<_A{HO;vԩE14*zc$|J҂OIk>$Do܀՞v?YszZ֞)y>u R#7_y=j<#Ņ]Jo"45~ o$6ԇWZz=vH>AʯN ]y %<(֦mz[,S_&=}3v,\+(t6mR Zh'()*"_yme2)pLH=)CD2}!hZEpyGs^P}[ޫY\ G&1u}TU^4CHTQG:_6f'vq23V1]S@ _{<ȣ4,(9(7+9@e0!izD0xo0g*t^c$k?d@ljߎΝ tUE!JopFː@9ROW6p8!Xq-$q _hۓxqpYS Rˌȉ# 5N^oz28uq͑l[4uqMg gt1.EݏэH6aҼ#\5 8mj٥Ft/V (6u,/"OXP8a %;xTcGK"eyMU&0߷q?;= BSÜU|/Wp7*yZ咴FWS1J)N@B?d[Vbv̪[JPBrlE+#C(ٟoab*[g^Pf$z10tt OSuJ7MDb;DgfhX54a,bg HwIE?~3oly-\EW4Nf|Af6{]sslnuE~~wڈ&w@mkz9l 7eݕlb^놫X[t|Ov%!|ٳJ6EqnДR>Y2qJaCf$u[&]X/{fTJPoPT^]n2z s n2DfL|VM‰v}vI+Y`A&d,f:)n*]8Ō7rHάp 4 N-QFm%mjxt어m=ua/+WQuD!+0w[X<|D '^Ϥ+1vUT{GQu6 ݹP-@,dt0GZ6]pb=CԺ)l?Z]B⡯hZXO~mXezlv7c -qƳHesqp+=]Ԙzg I5\1~T"3X0z =E%(b*G+zed7*݊9Nn21&>٫!%NYV kpQ$CŃ9ؐrxKRur.=(j)#|%2$0Q#8,w1T+6 dW66\~q~w'=bQw:6p"5%yg AX.Ǹ ]V1 I[+ Pɉ]{%s" FnvjBu8'#ܣrV? +7UAhpw- 7\@;(JLas `QV$$'H];liވ;0MA%YzA"5<|[ekki|P1G ) i4!h3֙js)zݑ +Ojd H_`V#V!y_vjhn7+Ni|DNd|`.N]鼿"B6ԣv#N(| q/DGOwWyjů͂a-/wwHPookT\Eč9i}INKA g(V#;:qyJ͹lj?p72c|G'+ MM)e@'Pϛ&߭{uUǾ@iwɍ3>>.1vTU2(PϿ׽=rMf*uzEwklAYZVǍgw<[+[mSyqsX ÜMQR/o6̗Y1@41gw =0ՙ{<<~*=k+2RUxV:xI*|QE)p<;Y,A+zQ ؛p4mVv %O:/g\FN~{=!Pf۰{OY w^si/1nhSZ0gQ((:l'! ,ͨÕo$S3a3Y%ͿuC^]vmBYrr4?}cHy+ޮLR@6u.D-b ۗK$#chvdލ=­!P ߷)aۦE7T;vp=XbзVnb/@Ȝ~l<+65 Ŷ9g߀R x0+xa鲿%)-}Aq[~5 *ѵE*ϳ,C'0/aE4p`K>bi6ɻe%a` C31aZԍ+ѓ:*)dZy>-!ǚ`!j;Wpa4VmpK/n3\A: HI9/]rgjaw0T}7o%^OH:T!BR:3cu+߈a#OwHxwOW_YSk7oQ@9Ad0J)GR:SH$^\)ϟVo'vJͫ3sA K'#tBFe^K7c\a鐷t-`8],q# !oG֮_>mD|,S+@YxTє k0-`4[)P gG?u[5c ?1[ [Sf,6݊0L]`DNY}i>@)BЕ9 u7&HH|vLϦ7\K6 `f&,r"x<.xlemSHh^AqtX*[&2cRg: )Yˮc*TꦢyWuln~+E=liMZWGXwYK5w}'nKR<ՃGƮ[e4{;ћ3Rq@Io  b=E[%ho,]%],[5W\x;Hw3kהL(B-jI( b6U,g7j"XNk`nNu+ ݂&2z쮴)ϱIGh.#="($U*Tid_J<@umHYUYӗbCbƪ;}x!JDRiGhBМ?B״4&P;-P3[Mh5-Uss;pXnkXh7FHn紶FV ڞ(q*ǘvKiE8|`<Xcm2K<#.,*#udw 4g C퓗΋m|$\Lä?@~] aغcEtS_†#O'0;BEPk3aNl Xȅ 1T2_6j7Z_c/En)t!4 ?#m*%j-U(Q[yuMC}k"MzP(o^Z*I(" )C YYV˺NITrj6Uo9}0f-;~<ӿC4{2P/ktݛI&?≚M?~ 餻sa?|ݴ]` -&`8Im18رϴ))RBAn9#>Y:b/KQE'%V5&1^> 3q|U=!7bK1'XTejg܌uVn@TLCg#@vjS[~6hAm쒜K SErGb)zp"e>l>J'kιX8m޾TկjT5G7%Ȏ"MyXtMa#p *NJ(ҷYecOAx# r|EȲq8v[GiՎ#yn' KLI-+\\I7"5% !#F`d[U?rl̙=~.[2ΣAϗw|Pϫف;{-vIrO05 }ō僦49&~8Ap&<)2龡H(v.| ɩ*9I"c-)is*[QV #x-ꡠ}"(6(AH@%RO w&yr1 jӇ ڼ_ME#Zl4b9V\*S:`{oNC\. @G}/3 рtW56CTzӂx95z/' m-Y5c3sfvTK.?°Lre֓>szOsm7FԑYЂ%\0|򀷢^nF_h"P5C;2>uѪ<S&I2fQtEv;7] O)vOy{d‹Ȩq]Vx}hxj~/ +ςʳ+,bB񊩉0:]%[6is-w63]@@0mk݋ \myÒmUh43ZݐswHp,{w0څL\8 kz.XhW+S7>GXӔ.6~,.81хxwh^!{H*!*{CT0iTHZ: _aC]C\@@&qV`Y3U\f듸^SXT!@'D)YZ.#IzKDS!_++p*m@5cKG%?J, OGAɚ?]9 ivjbd'—u_!&OŬhEhvy@BF40?h)=zr 1Mp Y OEN -Ċ#w8LҘ=LZ/\e9R[" GNP٦+ Ծ*}WU:#g (Y4?nzg0s|s:2ǁ۠W/ڪ;n?Y=?pw]s R$νc{-Xz.Oq+ܓ)vet]D.r蘒\ϱev"QTJkϮ~P;s*o7a7,#y.PT=0pW0~K~.0܏GBSAhhUVfgF-$U#zM ٙq+BN= K?aO՜=w°@oJYx&_pe 1)V>ꕡWr!xk'Q!~u\6´%MCovA(hr@&wNT^Q$]:@]R#jDnzU*xR?< ,k VFYɢIe9H?eU \->Y)BA6L xxDs}\UxW[f+ {=pj7%AM@εʭ"+ުFatRoSj.S\MzlXgrː'5dzS4ݣL!z~PIfC\(}B$2cIN@kJ!7(2R#[அ㐍łvziQVHc j4C-`ٓ XxRsbPtB 1Dǒp潛+ʃh1 0c11X$J-%hh7D_!8hfپ"ucm/JXnB n}EBͬJ7D:ˋS$hGQQF. QH-B"M09/Led49*Fׯ)_!ض!kV1M 5Ͱ |i#q@kUa_r{ Uh)VGL!-ly񎆮jF0+ ixSz.; ?DKiߔ lPzPR:wk9:pHfB ;kQ fe`X45aȕYfCJ2{iTuv|<+XT4hjĀ a ]GZB9TŝEΟLl}L'[Rl! f%,ydV@qeT RY~Jav@;PQ޳@+}ooΰe{'s_5 9 JS8Wu(16r=OlsH4JF~_Y *:Ǡ > iǷ/,1|=d^]p) wVzݸ`0or̮ }输_?>"G!ZbH ^聳Sb_5oM`ℴBPêtFJ(.^~]yА`whP]Xz'դT ^psK2DNȂ#^B?"W"`BU &%pfF9hh϶cS>h0t o*:X\EEp5lz5#PPZ\Y{ M;X:v#St7rZk;Bj[h qU[ ͒F[RAjq-'٘@0qM7uiKԑ>#5^'ϢU"v;uy;,v5N@ thlysP=Œ9qupIG׳of<$H;op|ذۅDٓf]!Ym}UuZZ2@WGCOo.z2ZK9ͷw [Q6HɏcWnȎ¼2i֢UU 'KcH+bIp]*"dׯJC%P[nP:.L~V_'F@, IέMT8.Ӱb I͐l=(5_ݎNePVj$"UVKYR@N.hݎh<)tKyZ¿}u:R&4JӶ| /T}Es1N(Ș_[1]or[¸٪odQ3rM|sp]Soošz1l*Emm8 ƔB.s"4ܭ=VZ%|KP4ҝ8.3sˉK %L˒I[i;aCJ {ْXzQg3S LAqXAl"&oSn_fؙg  ;4PQ@8m51 8MX)E*?XΞ}?{>s51 >!#ŻMs{OEF!va|2.\xIaW$ZnN̹u&9ںaOY6m~ pPmN($'f(`)4R-QbV6%+RT63֩6 sBٕ.MBqbfkf$@q6U|}mEJӂgRfDHXg hZ}'r?КQطxp.9<.oo3tHՒ~0H8Q@CU׈ٺB1 'M$ K~1HTnA"},0VoN ៧q( &eh)O\ɇ ^`;н{k(YYH\9+!,ޯi*|"ܐĥ #ۧϛD$8',_]D3FRRzAI'_R_>I\q!ZKJcthōF V>$xBe]P)v͈װۡ,p~2ѽw.Z"ZgХ RA tK u p2B^|%[t5 q|9ڪGhzl>uUX5RXEv>uz}G+Džy)Ω،kZB,bG_3OMvu_BO`moԔd2קiolRG3y&3蔝wxŠNG,ߠeN0s8 c^n|R J.~0q]uJ]ōQn6P͛%Ňo0bs2zC?Dќk2NfjyFIˋ0̧1pLbB_ovkK@83m)f2^AAF%PIc"ZW9OL.ZԘJ@7.>p-BK>_HF2[!pmoc)>S!#Q/CHr,Hj `E*O!!u=6]koqJǭclxV$i'=oʘg4j~rV mS)梜*vD\: Y{xX`ylHCuYbz*cӯi]5A(jQd]RR QD2Nh옢x X{m(I-\+S 9)щ{$kC;K.s._3Vҙz\%}Hkz\Ntʒ[΁X5cwOg6Xa;ֽ݆fQ)t5clUS˪ (RԢK5sq蝕 nv SeHLk E0v)U<ې ?Ny=\lgE.rOu-T!H*8tdlJ{T>9pU(نa3$vieT1ɚP[eqNԠk"J[נԔ,a*N% ;6S dU IOaم!0yԙ,*4W!<ՍD\L }9@zٸ8'9pNmwW:nG#b1٤ⵤp{0\b-WDFHIq@v2E_tq;4+{Џ 2_4IO% zREBG%t;(~m)Lo0#!3|[3~NΒqxSpdωX_ .Ia}M؄މ{?.bNYݏ٥W| l?mXjS967C:廥F4 V=z,➾G^DyIqFjj=k>.Ix FD$z(1zfT S4&Q;- L$o.W_>v7ߓwg%6/it$NK$TT" ?\fs0o,*t.A-FPEu M|tSNG!N}D0N0S3/5,F9gl o-VA5=L B\_|aigE'kt(IXbA{mVpVB*mT^~?sKC3J;w[஦7Lh %{d~Qklf$`ϥx߅l3u/߶e9>YQF>OKš4W@7Im6KiriFD!ncPF ӖIqM`wza@m(DŽr'I1&Q|錾<:73@1LOgTwl;_X5a.(a<-}$rƮX=1&* ZxZkܽ[Mrv8vLs+n<\(k9Q? pRg܆dqzp(nõ,3Òygˉ ;:w_DyЃv[m$OۈoNߺ(r5m4d8Dbiv:}X^p#DN_ZiEa"Q0l![a0R/"?hyhחD@Ӌ%(J^<7]8Rm%Xg;n\t@G+9FoI>7b{JIgV6c|O* 0KA4"z`Ƚ̼XU~J!S=^P8mz4atVv@!s'Rjr;b GX@oWA̫'ODžsf) ?zȰ "kkM._+k5BXڍH]e1eÅxRr[TS\dG)L`d @ioSdq0NDj fnH4j ;g? Y1I$ԃʲ7ٖ.WWvd+EI h7?Tɱ&BB>%As0xpAx>^qu{њ2@ty<( N(<p/%,sm#|/LӤ? ©pߜíjg[NWK;_W8& hUn62p-x,G+A%63 fFK/_):mV?N଱:M!/$\[:oh7t$8%"z7Um\B=F` 4x!=QPb:oW%ӧt QG=Kw ͭZrmjE:?ͺ2V.ntN$Y @w.m8E~` ~  yoI?Tkg$N+Ycյh ݠ>g$1A @rvL*y7$YMyLu9Զe}"&Tth3 sʍ1 i=GtĢAkAPS`}%SDEХZ<(I7 q Ccz8z`0ⷮb>Dāb9jB xpIO)g!f\rG {2`mU oPdjII#X@lՃ`2xzcSU 7ln4 ^2CfZZM_cZagś1xbeE+%6[0KA ;WY5',F~=G쿌C`++{9ky&H,4DRVg} ƨE&ںj|5m~):@&}%S O1TH{v'}}y9Ef<;m<=e|*I]Nh@NX󊫁Qݿ4Lj)"3u6FvQ6`g>+("_(o\f*γ1- X5w$e.Vãek~vGCC~;e+Wg@~Ri7%[,8`Y%@HiVl;m \U5p'GF?u 9k S &"^Mbjs$} 6~@8~JgZRaTzcNp(|nFe7F0'4r㿧SܶJ3!UJ_yrR1^Jܹӌ2ε0DH0Q r"*ʖX?ɗ71FcC0"E~)_DjZ "ň4< 11>^+bz+>b3h{@/ -6#u2|V&vB^wQ^1;Vȭ$i>DG3M;@PRI#s@rIEBU}Nso%A_lOqfu+Y7K:/*rdz˿b~*,+ޖC#0q4,X2]Iܹ<⃵b!rF\ -7mN8 5w" H"an`o*&dv\!vBF͍>raru, >fg!}b6fC\E> xFq<% &HY q[RV`Bꝃw'X_7ZGM˗%I1>DXtg*Hs }eH\c0ӗ>z\1/jMWO[qoɀˊx۴PuhUOtxYxRm@-|d>2cp^3FLn.c2؅69;\Xex: K3`k畲W%z4/oTgnFda(zi 9pdrL@R^8V"spL5LZIZa{lt RhK|9¢4ʕ t'6너\ulGXJ21=1\`D0*"v"Fj2Q<4V(q5)j%Rm< nC޹BZ^@ѳ4if7=[?zUM ٵTIdb m-g1I8YmrhQjV8!o\x+ )mA|c^k}W:x괠nbckyP:ыs2OjèbSb+d=GHYN!ƭYH/?,S! >ֹ"ylOq<ݕEÍ%"Ȑemtd:)-<҃72jo}^)yF[IϢR i܊I+t/ =cʊ]ڈCdKlgx?8ZsOEHV.\X R}RlҚ\򶹩FgP.x]501o::UX9? T2ZR Bx?%}`khWZY!F7pLKhg&l:.Tzģ'޶6Yٍa}ԅ',fK (웁tM-FYiK_Nb'iڤAS_DȆfSHr 1&x4twuTE4O,MuzaxefvMH3 6.Dɒ:`xš;Ǭyb@?rp,0ϼ1H֒ka3<\z+3Jd=Vcj~92sŸ..N"u" :@NTtnVC*Ũ5+$Z[`1 Sz%A4B!wetns\Pf5T8uwa46'ץ㹃~.aL F} 9N45YSJ3<2pkO'XIyȠF/``0y#^ \ujӓ7Dټvf;u/smhƂG)5{C`O6~ȎQM* F^^Q4a>*E(\jîO#i&S#|<8 @S&TzZ6jIRcmmе)YqsyOPh`VeT?0]/> ePF`JnzAKU *wo݃@B\ev_ϸ0L4hb?v+N@XƆ[|8{r ߡ')䎉'/zEvpDdWmVl-c';k=V6:&R 6xx6EL|;vkÀb1ns#c!=YZOzܴ¨ao&mC7׹[tOnXά!TU#AT<dSCBN:F7wo迯rQ[LֵXѓ2ɘpSeհ{VkQ0{~{Ax,y|*X:f!&mB!1r#.ߢ7tA;0 d?e_ܞi:5w߮O 1X\O 3ˇN͓ ޤj~gD3= zdݷΓc@,|3Snу` ׎?]Lc)`(:a2N$(|%J H]U~"c5w{oSzBÄ J`ˀϿLQ=$Nhu_\rK3?wH?><13q9'v! xJ;8'*:q3Z~镰àhlŻ}K7Β #\5ws:2܉E &ӦKbͣ91\+C_XMV}KVQVG@JD4z{=K-l{Է|ju[} t G\g$=-; ?v `.teWMh}I<7`@Ğ/%e d؄Iٕr0SӺZ_xs Ib%]JVNE3<&"4yrʯI7 ͻ T7D,_(ܙT2-x$Ssd)Έƅi^dXkDCQtDG/_HG||t Gc}5'+\)r1IqC ٩= "Ɣ_Lѓ; ~P`܄{MfWy)%PJꀞhڕXSUg=)n2~٪kđǜOJ!x$wEej$ dȕRkyHq z< hJ.$x{RBx!+0{48GfQPx;f3_d~UUyg>d>Q}!&]V6StH,Z֊'i5?Rȕ>C@iB KrJߨ?Ƴ>(G-u& x$ nvT9xc>R9kIJQX%"݄RDMSKյ_>'hp=SxPJN_!0{)?T59IVk_㨴/=Flѭ(dp x>KW7;lr^8PƮz&?n\ʥ^XOl@% * ba+Whܶ-6\)5<(`G%B!fX}خ kvMmK8p .SCZ6 lM%oLyl`ꍗx${wYrQwߵ( voL-[~yX_K̴!wS 4n }l3V8rX!Z%RǍ9䝈} 91Yvvk'V v- y=τPbcjbu9{0d7PxH?pe|$E9M PmWɝYz(gTm^~GSBioȘ)%B(Qu27 ݛ6_b4G9J"0r0h@zG Аa $$ B>KUS蕈OŠQfՠ96;,H7[o/9՜`DA~wqH'Z]ŦH+3]< LU ') E5.V""l`hⓐ5@z>gHy {jv,A#ZkܸO +Y^UjI~ *X/QЯTkx - n(т w1Guy^S{g蕣< Ap# .BE`Lx oSm,Q5աE9-`@n~}T~|%@t=Rez:/ʵ\b7֬+x1jg')R7ȸ*Vtgz?օʂ:]lʉ'{|BcXH81+ H \ب7bBKe+1SMdSE#+N\Qeeo~Yb1 iҷmP_Sja3$mwB#ed tHzc۹IowIk׶W]j} +ܾ + .Em-(-<CJ̛i;N۫Ȗ:_UYY0 ZOyZ_ʅ2zHRҶ"\O8$#͔<%%Bf z'}?T-cc^ɫ 0 ~^ ygw||u]oR.#rwnTkAۧ5+?9&]7e>(9|+޳<q&sĈ 0]"{E.S2!ABl# m+ɑLujKbc+SrtF\QOr=?\#E}Pe$~a[q)[ ^ frӕ/x$hasͿ}k3M&]k8daS($q7#Y/ufҜ.,>pU{U+Ê1;..[ gjSiX5wu\]0p4,(Q_Scn}rϱ#<t|YYU9/ޅ*VTHbne_LK8EPO)^ 멥w@K7M}Y8ic'Fh8OEulPX<@w;>H ֩SLh0{/=3f\"#Y\Aa9)3dggx\d8UPf37zfgTFC=t y{P l.ibxL&@K{Ou_/6w@f=,? # nԟ|!0'iհ.s3-wh{8!|CC0(jgr>.q zrrwVQI]-.8?вx*/&Urj2 } Wd9 ,Lf@2 ur ­SIC EDx`tcTwՠsyFtn%c }upL9RZL:Ke6wr2˄E_+DAh"(q-V[9Pݳ)c&^UՑ_n55XrvdmSbZ.;vr]FI>@9 *ke9sW+֍u*$\޹DlUS-pKk 1N*.Q'@Q{e>׸ $%?1TmȆQRg(7B8 )sPf$R`Um{J, #N.8O6;ʭʒҋ`UtDž w>'|-64!ݯ1U)_@ܙvjUY1koS&@qO"/e?v$lDs_y:3R2t3E^'~_= IZjRGCك z9v51i8IxzNĘllu%ʄ4d|U2l̛oe6$۝3$cE(ES 0תAS N)]CU/l./Vd͹b30l wI۔w)b?Zh7_6HjS'?;!ac"$qb(K22aW8I# z w䂕KpmbDD }CT)p.:䀠.s9aj[5U!6bW5٪o/HL,dPtfX;%iXc6iT20)-{Na'Ou(m/J0a 1_ <f* $Vj{&é{XFXC]*[VM.5;@}װ\?l.!A5-G ZM"}zq3AMjU}Κ^O}I~EatmXy$HzfAFX$VM^Z߰PܙIxܦS@wQl{@n3,7bj[Qdﲍ&uEXkZ>3y\~*&ρؒɱ!a&EȯЋ߶ g~6`9ގ2:i۹ʁA@)䌒=gUT XxTMMK[sEn0Gj8zV5>0XzvezC.sǣ;Ol4;+P`M'!>N/(0 3IklOx4?--~o6W6Iˬ@V2Q0%+O覶D%ܶs醌7Ys):J[?jCzaUl0 {t(£JpeykےocT@+i|"vyjC&UASj0":SSD v ]jNħX6 ]v1ѿFf*B$%1]b0\a*U- 9gE s1434Ku|*?Y O⥭ G0]j}MXi2cxaiH5A5_Oտn uI;ՇZ[S\:_[3jBq&+(2(l]A{!9G$4EsUIm5>G0GWQ4V<ފ%kD]8G Hx~PF GYTZJ{yNg%Pwآg2q.Ψ?tBi\owZC7/(Oe ~>t3= oU}OzOs:JHPd %Rۤ.*u^@^'I#b+z'nTi?H"frGFݖ, Z/SRľ% " V,888$8}M_w>n&g) A>D5f^b?$:.ww/}t/]>zھUiE--L` ooT 02ҳ}Z%IupCS2X8BsT}sqA0fc-*MHM˰9/,ZF妳h٢Wau` k_.g#cNv} 0s1?1FE[7alIx8jc&kf癍QIlywjwkt "(UEx,ۀ0޵S;VWjA$ҕ#M$oՑR(E"P߽@'WۈFʀFnG˵~}= e9KR/ )SMLjcA:ز( 2farU𿡭P^K~#_QLJ^9,coFQOK"SQc/&oyl  Eh̄fSޘ(/|Fֈ5OACv i9 C>wKw;v&LݤWO0+DOϾ *My]U!޿^fU @nk8B+b%7Gp@O.ġ*6Np(nJ/EnBqUMI:H1@Pr}OVbd]4DEDO@߁)ꕣe0kLJ?Nf?rA 6170k, 2aOħ1O=SIHv|גuh(Ip@V <@]v!G ܦbƊE}?ӯzFnq%Wb/0* [7#YmO[y6$`4#RPXMhF!KVomrn0h4e +lUF]Y?tf5 p+RZ[Abj3z1P_~J3MG1A (ٍU lQ B ixK>r}eAyQ0˫ifyT%qu0a*IzvG",gl xϺ xuToty-ٌ+ <+Nw8|WeW'=yڑq6Wlg[A&iۑWljiT14h̐S*V˩9%&EfOԁ7)#>W$diyW„1h/ #ũ4>DU:d,YP}'7H$!#܊[~ -eN ;ya6{;4$AXPn7[v=‘$dE.7AAHWKX>#Zŕ۾1]c:lCy'j/Ay]JmeL5^!LƗ(#1b7 H`gad :Y#Cn<]Z0Ĝ2 "/A{`dٜ:X_^sAy*؃~q㽸SvYr lV}^Cl3e•ٍ:v\Y{`$IT&~֣B/;0фBv(ཐa2 tm2:Ĺ1#N0s}{l<.?iX:QNaXYr>9AJE0:@= Wz΍!h$FN QׄQ >HN"bBh jVu qL7 Q7{i End8C9D B=!O7Ɩқ]V8Kp 8ꢤH=uN,¾%}4U R.m(<Nv0:Ѓ Vbqr f0>Akn〷Yt>t`3ت`_mkĒKنGz;((УY3`׸pQGv됋]m<Foi)K"ronp1 ; C޽P4. x.**de`X.C,kSu}[!|` [o]_nHE?$]/xi]NZ)hHggY{u ?ß v9i1B V@ ]<Ø8'θC0 f6AdRfn^{aAl" $4XpϺW{'ʖqwLH盙ַЋ]t8m ve&̆tO"ExO:FH0) 04#Yp 3Βɑ MQpZn^y%fQ>u n^k7%۪ԏLS?[RWC=s"A(~NޑTn04WIR[sܚ5+֚ʏ`э(0u_ŬFBaY}%=y; vu[XWK%#^ef[y6ߎ6k.?> ^EԱnMCU֒pˑ~N_jm>֠4/$xbn&bw&= G-U #܄`Q2XSR׻%[vTgXJ!{ʞDuꆥ8 {oX)` @j0a--OlΙa(~5F\Iŕ*-d*1|+*k|LD,@.Z.x3H~1}M,*"~.мwasjE$\tzrha+o#U9\ gj_l4mfIn@"w^lQĪW&oJᲩ[\Drrrsjhv-vN@'Nf7}_WY V݈Iq3eT3 rE;9dsVDfD)Xta]i'8Tu"ጿnXY`4ORڻ%ɒ*t4xl._S`z(})7#Kٟ@v-?kLh95pbGz .31;_W0;WNBH-|[4{S*8xBR,nBݤV'/xUJrՋE Am&J&,.Fb.xO/TlJQ."<# FygNtj\,Pt26 w{dBaP"$s/s@ڤZri:`zI DT\{!(Τy6J~gPiF/xu|A,mK2ݵ Yxwr}_zUXQz\R޹\PN#+&K|}&^)XS⹉̬k, g|䳆6>__;T>ISLPƟS^UYiR֋"cZ U"rf;}4|k#+بQv & PI^^+>Ţa Sϧw8rGď3coi{7\+,P7=)$B-[@n+Jό2}5Y+iACӨn$%+pQlh2-lJɡ:΍tǰ +)0ĿJ/mϹE$%e_aAwJXX۴\7rA#|FH"َ4k{ DKI˖PT#aDcOU>M %YtP@W#\4i#[*&ܩuwEId? 6dmՄL}VR}xn^9-M]EorjȞ@xLot 3*ov14Kvo*`Ҏ?p@gwcj8C,|IlGv"ŞOɚc(`qҒeZT4dk_GIZzyY-#©82^&Nr- ^4GJ\!J*B#R]=*FbJ}O4^nT:J^tyza ]AF mףxڇ` oa|Yn8^ |JWn͵,}Y 9~6Y7;PGF1 NRHl_~ߛ*e^ ǔpXs!m>s^Bj)f.|>E*EP[V؟?BS۩H4(,/'Ŕdyt~gυdBsö|Wb& cN}ڱ2~9,rڒ4R eBAg!"Ϲگ'8+88%LN kq Β$[-hR͟Yz~!C($(d,/ Lj8%g `[2_E?Vf)Un4HU+speq0skC_B8~m:_dhs+2\R|'(Pb4)צË%hOמ w%]HzSH?-dƨ-9Oo2r%3.3dڞq/oʵhf`q-`%7şEeVvgS]8=LwhbU Jdzh5tH^ B@5A=`cyRW3;J (>eܸ/FGm:~ 0$/ws(D58y,"^hBL2;q&o Zb1<9:U(^q̚КwoLɆ |^ĮKRc01`҇ qQ}XJ=T_]d&"ll;Ɉ)݄z'd& IIkNQ';3JM]ah{7їW;O&Lk}ft].*m܃kns>, ?jTrPj:&3 yh?TbYm'ȥT(fȤIRjE܄r;3)ӂ $(f4zXt  doHT{cB:I!/в Frcϓ6K1Pnr"C a.lŋvI"ppOtp'4j&Fۯ&|C !5'ȊX!UGtˢЀI5oG_ƀ L0b͒ϥզON`?6 5(UE əh ^[i}Ed?UKtl^$m ]h|L2 oP ӌhK̽jHϕqcƀ(SYaxjUQQ>p \DmCy:a6`ld 5&wb|#ӄ$5- s0犗jɫzԛU!' f2w <[BKK [*4o@qj!o'dui}wM9VgqT >PM-^H>;`o\Mꐇ4v3c?ݾhȉ$A99ĀAWB:0Y6ֲ@W|¯٪28r9?kϨ< JS|נ<.rD"P1c9팛”k[&de觫K ,>/AŽ"VfJ 4%~F*,RUi / ekO* uʔ2Ƙ̤UC(Q''w< vPizw} ɦA%k0U[/klt>ʗozrcءk:ZdNz\g@{"Q0{y7WE4l~I@8$j-Xz}T`Kdu"<:E T[&WoMAzB?O =~޵ 1 L6'3YIB1F>>[ ͋UWP HыL@!;d^jtm*I;ZPA6CYēGuNqhRC|~|!a"UQ3ٯYf/}1#͍ 4~d2v(R|H;eU iVDTØoKs|X7#ɱ5a03$/_ mS~3*MڢM["x^[rbg:Iăv򪮒)t{w>*t,iaQi_% ,z[k̚QEd`KO peä[r%[Ov4 $f=F`lSˑG7Tʜo6gJRD!L{>`$>҄ /TQĥCdqp1R._DGf8 #]z'm1#zl"v>i69T5ZMuQtu< /#92*E薦@rP)m.RzSN1!xâ+Vcu9>q<}im !Fݑ<"\U;Wm?8l orf<)}n _ M2_9 Fc̢| 91˪߅S"'F >vl> 2 fNEXYs@JC -m'aԝYY-8Д5[EMMv08`eԻwa%o)Q,W(_h$tw*k3aK5637 WQI8|l5JPʂJ}tuޣ{|@F|K2w#jiq4^7Ze%abނIjN oR!lRAK/=^ٽaWu ҉ˁ})XB%e:93*&Z B3EnD_y'>(<(*6{#*l Nε. =QgN |1twNsv vXM&ܿe-m{1N(0oQ6;2~V ]%Qʲ?Jq>&):[{S9\z𗸌:,}K뿓V[T. l=e 1|F\=m1=i3wm~#M8fy,D/p(MqYcrnA8Ў:\CZ .+4Ǘ RM{eSgn٢ĈO?z#ll4@#S E$Zb=)Bs׹2aC$cY7 `e`'pNW یvbZ)Jw!ue öQm=Mvݤ`YWJ ]@ ZEj1>Yh%V΄AFjWYTSŔ Y e!]=%jfy<~QdSU1Y"韄ް`Wv6*Y,n?>g`քݯ9A<4j+l j~v<^iH-rw\_Ǜm6)hI\M F 4(P=ЬB V+uǀُ^I ƹM!zn};tI\X~6Ӫ鴺8/dQԆر] 5c P7ϑPCK W:;KMEM!'9gS&»4CRc!ZjԑFX{#1V:r ZSBe?ŸN3j[b8 Hjٵ?yYCٌ "Pz|;┣+)ÛSlӇck -LfPx9xoێ/Hw5]M+$" AM'p7sy7 weil ܧA69*-=NH O%h^Z?F5n_X:&(.L*ؗƭ+P') 5Ȝ'"#LDa͸{#mgY ӓ9 /ģ/[r_{X6MVz[]+ Xg"}ZTD c70M~c2JT^mp=CcZnkl}BG추ӚN\`ŖxrAe\8G򋞈2yWkb̨UG'Y|~&pŧ2=S 'A86нoSQ8,4[0lx,Ɉɂ8n-i'!FHm(b9#q _|cݥE\f~ Bǿ-P/L` D4b#%ꏛ䘖JLGKKNap!6{FI[yN܂\vBI cf{Hq6˲uj{^d͞|㤠n1kpu[]I7a?$Rj [+Q~0(ށl40(.,{THPʙ:)J8zw)ʑŌX^k|nȥ5B[:\>#fx1cF)'^=PF`ixϷ{ȟE+Am1|yKP ]"j&v[3NnJAdbx@~iZn.a@] a?,{`^jۃm/bpc.PI?P а?/`}$v=?A Ҝ?:L5po/Kq6'tNNvuL  y3 D$TzV?rT I|hq$KA !h&j(]=/$Sys*aJ2zh^{QUR)ܤanEM#s(c| 1*w:;0J>. am6q(B#3vΒQEA)Wi.S EW}f0ݲ+gyF Gk<:zi¹l̢1~N̜^+}1i:ZK3^ = d6Gqbj)f$pVE~+)0;s=][ @qsj!Сmۃ o;tw&Ƀ @͂T|2\n6 !9Ʌ,Bkr^\wpUnh\׆4>))D!.\9CTiC)gHiV':p(F{n{ߺMa&(W piRcUnsݦAZ.Dl$Im|b~>Pqw+mt gEi?K$AX%[8[lͅ|jEk%;"4?#OEjҕa)rݘ.^{y^%/џθ ֽW:-dߪV.}z(##5^Y>Rj"=N;oQSY҈rIx"^aeS e(Շn;s--N(„.6u,EgG SuVeaخ̌N9A my/7pS_ ab`)^ UUWDѸԷI&{뙽ӡ1@*GtzCp_S_/?NR&P h\ [EczBA{?|1,QùC=aBhEu"50J%HD6f kdV'/{{ @ Y =FNca2;e6FCIZ*!Q HLu7HF C΢P<i1|W&0IQK'U&N';I#!ꆵRBﺶ{ Y*$K3 9N lz"xJvke4ԉ(M:o3 `k8 j ` ˲_81fH𘢟h8@ݕ-1I h8Pq2fiwmth ?3 Do8U0!(o=O΅I|]|ktW?di{X"L'DZ >WgTS/3BOUS.0%X>[Թ& &]&Wы.>uƤn@^x`$᮫ S7ըjO*)N.i9qqo /` /»AT[L^sL?j~ ˍ>!.ebxQDR!i\Usc~<=0&^qp hw ZAMZW,H$Ṕ[=XKwAR> T% kyVKtȬeg@}:?'8]nOV]l(}yA葇MKwEElt[$xT8J .'0Gێlj{ѷe,b,'H-ǥEsBKADŽDly^gF)NQk/P㻉WɱRG9K`4Și#ߣ(5>]`~zǽ,ǹ%RTpZl0cI[&Vo͸~'tvLkW:ttʄFRk B{81"oepDB*~|W89&{vU>9Ӝw&l|sI}5D yRd2&fj&/9ק e޻qf1(I.rEJs_u;۔0p&rC.#ĝ Lg4:izd o<70W VOja &dإ~xVO! pZފksĸ~,Q;E(8rOHw Gu.JD6.+MTe:U6G." _Sm.G47z^R6~$UlgpCTM)VvE1õwdPS2ݨa/!ˆ5=2l=Z:vwphǔݷy@A«8m +ZDT}{,4|Aȱ7KDkhHዖ_ߡY\/]l-r5+0YiQͅ GV(LQeiMI-j]i_%sM-t9>}f_q;Hb1Բ"Ҏ"V/ #t"숅*gRYQE.}k It/?-@&X[lDD@{c#n_NiWVXOdM~P~pZ!+lGE‰.8l+et3Ӄm*[h7 .bk?eWG3xT"*k8|x0xa  yK<* )Zܺ%5B}Cm-aIhO]T7,K chgHw0 =7>),v%`g5Kk#x1?q R %3@P| P#RORm8D@53S~XB LBKp r=wk8vw!NRhYSJ?=G6>u_n%Pvk8~?"_I;VHJl|҃:ͻrFfcj/5|H"<6֏r(w0G0m"<un)kt3:!98O;re>1) Dm{S" %Ė:`> }*:Rjwqb9m/Eph0 ƗV=NN`,uxcWڱY8Gb5mpVӴʒb֎֦{ t4D8!0?;C Ǧc F~7j/_<8xG&|R $P/G Ex kZG͚^\"'qCr؏,JԷ5&0CT}ە!孢YsOHvk.!=DV 6 18tZo|{s;%BA@->BA{^R4y@g4pcj9+KZ|+>d|3)RYt7P| ut-Lћ~qa`G]|I֐pcYY)d,/tJs:~/Q1Yg|{܄*Zh{0-9uahl-OȸyiL-188ֻ6n ~+D>Aq0#"9vW!Czs4\qu[ʃZ@>]8,ۦ+ũ[6p͂}}-Gۃ2n0F\>CQg#IP[27K@=wYuqzΨ괬(oY*n A}cu.u:BW@DFz '-:CjM4h"*RVs(wh_ -?ko'&*yE r)؈E"ML8D_GZk`v5hbT JϞ [f_t26jg Lvi |G̞٢oYXmV@EWQZj|)B?`/mI{?C%1 ㊥ay~J~iz CV)3[@a7<~-к[sJz>l2?g}UӨML P1>4'߬{V-JL8V?SJ&?#TO0^S PB*$ MDFѲN#:.@ovahFֿIbj >8dr*UFqWf!SE[.cWk#ɱ-9@(D&58QAil:>U!U^Yu$Zs,="$<3e~B Xlc ҋR\qZUCI W? XmO2l^uU%V aN2\'CxMҺRϾ9b4{@T(MM/;:Hg86#Yt1$ -ӥV˭Z>@Q0]f)cppA/E|fQq+yAow5AKUwEPt"|DSx􊀛85 pe5y@htu90& 0:bΐih;!g0X P[?nTtn03A#Idž9Q#yN-:d2V ŀP]ZVi=I$q4FDfpy.UgؒLB@ OunIkbАonU"8_Lcd˅"{nj$|# :ߗCI%C:Վw*UMĀbh9:rJ %1XoBP. v͞30R2Pn[}#D;Մ yNVkzuVϰE>R6RH<\ Qwfxlg9N|np3J(pJ)~6D^aꠓKpc٨{o-~ahqRmsiU$~OXs^!}" $Yp=ʇ^Z|$|Hhri_J˖ݳsW<cs];9b!?ܾ2Š䧨l"E~CJZ3 LCV;:v̢]&UiEezN8^2~~LUD?*_•w4|?hHmA 벯S1 C좸r,5m;8 *X@)- PtQ4d,4ZW:Gz%/-5Ǹ'"4`0M;jj%&b) A13W3EV2YKn!o,Nm KwrU篞xW='{%1Uo7R z"nN7nQa֞D(\/FT4$de|~ƹ%E5WWHzHDC(5+s WqvB}o> 񃟚u!\VtzU <+Bd_Q1^#fu9u)R S='|Gc 3gJk3I1gw&:Nj:q"?ػ#dKT I~%\Q06/D1Lxٸ_&;o7}j ọf๶#]vnĘ_D"4Fz&Иm4 TZ.Ta+4!=psY;!^vKzscub"*5fҺIR4@j`}+ gvՏ-RNvN,?I2q(VMӫaiZpsKd tI (vBpwQ?Nj$ 3t 'l.qthQL1&y%: ݑdž +Lv`J |2uLOmʛdEqJYp].Kؘh$"̋0$#{9iJ 9XmUDΩh}HygF o bPgHf3RPjzey[y\UѼJ/1rw*: Aow 5*agS,\C(j,**x*lxZY4 b?_]D'e3ÐlĄtz[)}=q6!<"B=zն 3 $FbzS:6s: ҇<#U 7yFhb"-O"O#4*OOl?Uvcgw^J뚸ڎ8&)0MR/[ct?nEć8٣Q&S]Y$G}L*'ZA>!_8u(3 ?(*̇pzvu%z"\n4= $HL ;G(TPGuE;+ S̨э25< =MRpCL ڒ3Gs)`?4%ɬZ^7pAl {,$w"Nٕz,R3q)9]lO Aj @5}"`g= 녺+s&n8ȡpf]RsT^$\p|r7?lV/Z)!]BP7dG'xbyu7Ya4%u3E Ugc/sUMuE =@Nq_\g̠OyݽEaҭ=`!wN,\yG!NvS ^Zfb]Ćf:k礉]Cf)&Q tG`_ĎXR,Cwt9$ .V"qkf,)߃FFftƒ}x}Rڙ3\ڶdc=?GGv Ԩ /~Q C%{<K_y8MpP{js X>+_i=$]"Fr4>5K̆61F=W$eiVmii],|L.iR<:rME<<ִma;@r1´cYd7MqaL=.)S+W2*ׅRDEnli׉2r.Wo Sė32xT[UaVBP7-kgb|v{ T[0!<{7ͦE-".Hw|D6r6Z= _ rS+pjKvndcĬ83)fR圉[Τ@{K^1]kcffHdjňYkB^&u-T7\/9#'^\kglJE\QC!߽\M7@v9s6|>8m#--?>EL5=L`]M>R%kKiF^F Qv3f"mђpа;U)9Tqf ]%d r!'C r{ +."?CY)@SUs#3k;KVecJеط@;&:R@$ܧ*;s{J<2d#w q:; щ.$Q΂tr+?t"˔ Dfğ0N;]pK3,կ-t6smm]vo)UȆ9CٗcrЕC-CmUր`Y{frvwMhp\((n C?.@/nݜP>o4E9Hi ^mo/|ýhEKX;dY~{g߹JZ>%ؐXN{Kpޔa!YNbQ႓K`LG6Na41ў8-}ebٔl(u{3Yߧ"tc$:W;pXq;eB*oMoy=ކf |n9ST~כlŅ[$=חrE[xIDXg;2:Q% .\BVH"1XDo4E .a 4njJz=`$jQ3Q9gIP;xP0 I4.U?lA0a'f\sz(.._azG,-]`=s:zU´>S>8 #rȞY Ɉ[Í2 <3t#^|`tC\<lc!l)vUa! I-;؛@Ko6وѯM6a^.G8]ժ>Cyg f:+/$V6]DM:EԞzh7 f݄~{/#噄]԰98h*MdK,]q}gqT/dM7" +Vo86jo b1nur|-Ls |~ƈa NӫՅ$i<_\].?#lRUU:*(WN?uTC2秇]y[֏" ЧY=DaJי!ʒil PivC҂{$?4,Av{#wQ=D0LP`/]VJ&Aj8{3{DtȳacƧxNXRv;KaZ:-feSqX2r M* aL߭oWöa:|!^D337U-ө^S2,OuiyN#q=m3sdcKN&2#/o ΍`pqϿHh¾X-nnj{xK$?BvǺ᤼j3 djGtHgQwцtA\a5fx7{3Fq (ǸOhw|F}x c)E߀5__WBAW1 y}h5{9@F~V wi_tU^3]̢/483F@âJ j!c)`oDx ;peH.Du0 е@$*"( shD;J};Ɔq-§y{]L}}/dw*aG}3eL]Rk-Bb 8K`¾-уG'Y[^h eq=78'\]k>sDgKwE32dI$ڻZJv܌p”`foka™h'״F_?U"[4DItP{ (7 [e[ʘDP[5j3#"h1FLs^#=!"1cI :nB #s6f7oΒI Pg15J%Kq7p; HhZU*!vno\]AO q= XT:-iµdGo*uR7 s۶k[ oA325&OH|PDk4Ў' 5aN!Wfޯb|Mmَ|Sʁu_i)z59݉Ѽ;4 :!U\-^onշڐn^ !K!l/yw+TeK諈|)mqwš8Pʫ1s<rƍlkҸxHZefq%}U1&B,v+4f>;&C2-۶ea#fd)t@eu;ӫP,3:NfF_"t,݀- M (Y=^\ rGD{!j /WigX n.R2,#8u?O@Ķ(Ơ;go(8 y@]9)4e _$~*9$4a-rs:԰` |2gі>I2fMqSKQgYD+o^l4+ _q <W:E8 "ƚQrScOhp|4,`䓦H7pY-s /\‹(тc7OQ?]zߒD)Ji> d~nC ')<2kZm%u_y=|C)T M ZBeR=|EBbx垝~C L:<9֙5W2zo2yxcHukH\~pl? )Zv Q%*e!xX]K2I7֙A4G  .3~++'"}E7( %z["pՍQ+)iFjt q&ZiXb*#7Tq'̗jC¯Z4%8ΣOT\nljSx! U+ [k7QuM8]քaa[:;rB Fgv@m4uA.HAN(U|Ǒ/U<3`5moxWfԓhm9hx~ĉU;Ɠ!(3\HIȮ|^?+zm/0Q†cDֹ'k܎lyFMꐛHZw˛rnC"dKd<# LѠo"ɀ(ӵe𮣭qngѿK=}Mcx{qN*p`=9V(QF>oA{\[| q*0Cݑ*!1Ӂd&M}h˔ю+%#ii'RjͫZx]<_rG ֩{q9Fo45aaJp=H!I<@Eni*u[C" +gt$E,u=gqaaxH3QbC֔$l{/μˮ>}iz  e'y<+#dy$?5IY ~̮'ck⪅yj 4Jُ9/U%Wk=:t*"HE=dd'% "2:ǥ` #ldGKΈm=)PJԿ3> y?{X*FL1 $QPhFIʩwtۣ/`rRjD 1EjW8'!6dד|QNyK9 i,ui#Ԁ]dP`˭+XݩŹ,!A/{l/T֘48m):HMZMY:>Ҫt}Y> WZ:adPo}^ΰpT_&Y;/=@;dɬbILڲ^vE˛{Jm.!7{a+ L].5՞-{@E:C,I(VP BH!$gbAG'l'XT5ؾ5&f3RbO .A?hÎ#acK[fb{wKda$ap Zfz"Y͘ib;P qќ*pɨilTvOe-C[$M*@Oh+ɔ%cLEhKNcW^ˀ벣5^uZJ \֚9oi]h:fon/hYRwpܑuTt-Qrmoc"ddL#?/S)+J/ziik3G[4C0T. - LuB%`AT+orw:As]ͩ@-%l;Js`~tu$f',fz27x sNJ ˒=ӭ|o"b}qsйM*4dy[@ꂟe.UN uD߭ BWƻؐߠ i C#!{6^7KO 1gh] Z^id/h?|l v8BBqǨVٸK}J?7sKt 3BwYO$M?i`n̳dX xb9u.U]`ii'p%5٬~I.?YJZ" ?&ʿilcW؇x*}`+^zeaW)ud=+?:5seboLlqZخO6-HKMq'Y9yw:>,]z1?}l}Aes,CX]Vv4bxe̎ˇt[?&sC( Vh/LZ.E6Ͽp\6b&Y.z7gjd}>}}*lUЉ}êh`kE.R׼mMZۜ|cЫR ^'F1Y\/l|u*iCKL淾Gܯ5%nGc^:ҖB"> J>4r.Q `ƨ1† nws,PbX+S"n y$ _No.Sw8MMo&CE! B;n`\wFC #;ltDK8?oʄ 5&%@}y+<]?UVZoiP2J:8kӜ.Nɠ9f"E;)ҁ_)]Htg&̝O̶h[d:<%f܎6 L!.o#e }/?oR!V(dCj!)Dc]G^6T+âxX`{cSuI3W݃R[q]b};K2cqE%3%H0D d7Rë'A\ x~VkcpoQβj&Qr5u5:ǥRFJObffmza?Vqmv%V+vr.R4jsp+[xDF 8L8niarRi>BLJI 4D QZ Dξr 2})\XcK*̢\*2t$vACMq׌i_ ߅B!rB3/zm\e NK 7z5  *Lf˟J٢ޛAp"J?0a:N dL~ <^,/nG9NfγNlVpi59Te+:!:a9mE:K=CKmԘR7h=O"4xY^XTno܀ lno\YM[\P; MyC K;nK(X%DETauFF AoT%X2< t ڔ}$d]0y8^̉yq* _rO]xX@O % 3FCJ)̇Qx >M4]F.c{al3qr܄L/{ ,Cw6S0W^LT[jDcXssl.˂ZI္[;iD#¸٩0#B~(V$y}6ςf}RB4? ywR R엖 ^@FoRM5drjq}:ƐPtOb~\Hc+VSleя+8STV=H;åM[Ԩ+8aX lH\Z]*LŌ5J(+Hnme4(('8ۢR~1$ZZ wrĮ+TtV l&`55_KkiucYGAS?fq9 `EYX-S TZo2jW#)k-9[SBO8>+Le590U]`CU \ Zq<1Ʊ@s\ËBR u 6C^ /];#ujJt`kH0.L݃ĺXèA/%J2Co;op(rhޤe:z0aAS8KW?J;fO|¨=I'A/\w;xk{90sy˃"`bjM[܈6ㅠ;{ޑT!}tVE$*v)Q<-22y='U B2AHKwʶc; "m_Ȳt~_{7U{#I'͇k/mi%B9D#ř"yLUo"[| ƢA!ZyP;G X,Yi,9ThD΅OG LG5}.wF~W0F.wzDuʿwݭ{=a0\8}V>|Ǟx;CaP&ԈH0Y D3'c p;cε[>2v$`bSi[afKh:/"b (|9o}{﷿r{ 97{ir:tg}=2fJ1lGn+ql@|S rx|a *Mw3ޥ(A\$& ӆ|Ku -_ E4~T iOnWQCв+PMX‚G)y@0Cȷ'"yOyMS @d2豇<+' OSX^30H}b)wzbM~!]wصEY3aR{4ӢL5ȟ?Sqq} ~d+@Ō%)F9bB`g ?J [K(%=?(A_O1$H䪲c&ZS v*m%XOK:AWfxǏx-> 1U̔w{bHj\J5 dyLLJ3w K>QWu\Mv5T_3p,~q5z-\? .v﯋F/xjA>z_ue#q ::<ӰX6y)*q|&ndVayDDYy>V|[w-*m5xQE{FbձH!n nEfm7 [C~@Gj~?/!&d۹]$?U3 :rn(;Q{aciuC5 "hfl(cZ@偐I32m 3xL9CXf QMN:m,NPw495>1QAEy0W(TQca?Y9.3a\b["T܌,c0z~kqu Ր{5uV!L;Q62PO 4B9$9}.W=9xgv2@WL ܸ20dY}6|ha2(j ׹"ф.}%' <@mpC ieT\fWg|OUR!kr8]mKMk7;u|. ]`_DPD:=D0^RLcxOog ,t !ꥡ`6.5*8Ue4I-v3KпQ79D2(_1(E%g &4ZM|_D4M^wɂG1*V&3T*^I[ju^ rfiJ ZZv1A?>뎖Gu˰hb..ϔV-KNgYTBhim*!_k~[!5Ͳ)-@A_GIB,tϧ}??Ltܲfe8)(UQ5g" o=CufbiczwmKlUVD9XߔP @JO'ghHGHkx/Iza<Խ l$I?ΑK &٤um4v~S`A ?qEavd~ո"$v~CZ